单片机实现多机通信多机通信

(基于单片机的多机通信系统的设计)(最终版)
发布时间: 00:15:30
文档类型: DOC 文档
正在打开DOC文档读取内容,请稍等......
文档内容已读取完毕!全文共 32 页
资源预览需要最新版本的Flash Player支持。您尚未安装或版本过低,建议您立即安装,以便显示文档阅读器:
内容简介:&&&> (基于单片机的多机通信系统的设计)(最终版) 大原理图主机放大原理图分机1放大原理图分机2时序上完全隔开。为了保证发送和接收信号的完整和正确,避免总线上信号的碰撞,对总线的使用权必须进行分配才能避免竞争,连接到总线上的单机,其发送控制信号在时间上要完全隔离。总之,发送和接收控制信号应该足够宽,以保证完整地接收一帧数据,任意两个单机的发送控制信号在时间上完全分开,避免总线争端。3.4单片机软件编译编写完程序后即可使用汇编软件对程序进行编译了,本设计所使用的编译软件是Keil51,其步骤如下:步骤1,源文件的建立,使用菜单“File-&New”或者点击工具栏... 大原理图主机放大原理图分机1放大原理图分机2时序上完全隔开。为了保证发送和接收信号的完整和正确,避免总线上信号的碰撞,对总线的使用权必须进行分配才能避免竞争,连接到总线上的单机,其发送控制信号在时间上要完全隔离。总之,发送和接收控制信号应该足够宽,以保证完整地接收一帧数据,任意两个单机的发送控制信号在时间上完全分开,避免总线争端。3.4单片机软件编译编写完程序后即可使用汇编软件对程序进行编译了,本设计所使用的编译软件是Keil51,其步骤如下:步骤1,源文件的建立,使用菜单“File->New”或者点击工具栏的新建文件按钮,即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入要调试的汇编语言源程序,保存该文件,注意必须加上扩展名.c。步骤2,建立工程文件,点击“Project->NewProject…”菜单,在出现一个对话框中,输入一个工程文件名,不需要扩展名。点击“保存”按钮。步骤3,工程的详细设置,工程建立好以后,还要对工程进行进一步的设置,以满足要求。首先点击左边Project窗口的Target1,然后使用菜单“Project->Optionfortarget‘target1’”即出现对工程设置的对话框,对部分内容进行必要的设置改即可,不过大部份设置项都是取默认值。步骤4,编译、连接,在设置好工程后,即可进行编译、连接。选择菜单Project->Buildtarget,对当前工程进行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码;如果选择RebuildAlltargetfiles将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate项则仅对该文件进行编译,不进行连接。3.5基于485通讯方式软件设计在由发送方式转入接收方式后,如果A、B状态变化前,R为低电平,在第一个数据起始位时,R仍为低电平,CPU认为此时无起始位,直到出现第一个下降沿,CPU才开始接收第一个数据,这将导致接收错误。由接收方式转入发送方式后,D变化前,若A与B之间为低电压,发送第一个数据起始位时,A与B之间仍为低电压,A、B引脚无起始位,同样会导致发送错误。克服这种后果的方案是:主机连续发送两个同步字,同步字要包含多次边沿变化(如55H,0AAH),并发送两次(第一次可能接收错误而忽略),接收端收到同步字后,就可以传送数据了,从而保证正确通信。为了更可靠地工作,在RS485总线状态切换时需要适当延时,再进行数据的收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时0.5ms左右的时间,再发送有效的数据,数据发送结束后,再延时0.5ms,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。数据通信程序基本流程图如图(3.4)所示。程序流程框图。其中:a)为发送流程图;b)为接收流程图。注:延时T秒的取值。准备数据写SBUF起始延时T秒关闭发送控制SETBP1.0结束打开发送控制CLRP1.0起始SETBP1.0处于接受态R1=1?延时T秒读SBUF接收完毕?结束T1=1?发送完毕?毕?NNNN(1)传送地址帧时,T>2X(1/波特率),可以选取T=2.5X(1/波特率)。(2)传送数据帧时,T>1X(1/波特率),可以选取T=1.5X(1/波特率)。3.6主程序设计单片机通信节点的程序基本上可以分为6个主要部分,分别为预定义部分、18RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P37P34P21P24P27P2728PSEN29ALE/P30TXD11RXD10VCC40GND20IC2P89V51RD2_DIP40C30.1uF+5V12CN1CON_21234CN2CON_4Vin1GND2+5V3IC1MC78M05_TO-220C10.1uFC20.1uFEC1220uFEC2100uF+5VDD+5VGNDGNDR1330GND+5VCPY111.0592MGNDX1X2EC34.7uFR2220R51kSW1SW-PB+5VGNDX1X2D1LEDCN3DB_9R2OUT9T2IN10T1IN11R1OUT12R1IN13T1OUT14GND15VCC16C1+1V+2C1-3C2+4C2-5V-6T2OUT7R2IN8IC8MAX232E_SO-16C60.1uFC50.1uFC70.1uFC90.1uFC80.1uF+5VGNDGNDGNDT-RS232R-RS232R-RS232T-RS232ALEPSENRXDTXDTXDRXDP30P31P30P31C40.1uFGNDGNDRO1RE2DE3DI4VCC8B7A6GND5IC5SP3485EN_SOIC-8GND+5VGND+5VRESETEA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P37P34P21P24P27P2728PSEN29ALE/P30TXD11RXD10VCC40GND20IC3P89V51RD2_DIP40C100.1uF+5VCPY211.0592MGNDX1X2EC44.7uFR3220R61kSW2SW-PB+5VGNDX1X2ALEPSENRXDTXDP30P31C110.1uFGNDGNDRO1RE2DE3DI4VCC8B7A6GND5IC7SP3485EN_SOIC-8GND+5VGND+5VRESETEA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P37P34P21P24P27P2728PSEN29ALE/P30TXD11RXD10VCC40GND20IC4P89V51RD2_DIP40C120.1uF+5VCPY311.0592MGNDX1X2EC54.7uFR4220R71kSW3SW-PB+5VGNDX1X2ALEPSENRXDTXDP30P31C130.1uFGNDGNDRO1RE2DE3DI4VCC8B7A6GND5IC6SP3485EN_SOIC-8主机分机1分机2放大原理图始化部分、主程序部分、设备状态检测部分、帧接收部分和帧发送部分。预定义部分主要定义了通信中使用的握手信号,用于保存设备信息的缓冲区和保存本节点设备号的变量。设备状态检测部分应能在程序初始化后,当硬件发生故障时,作出相应的反应。主程序部分应能接收命令帧,并根据命令的内容作出相应的回应。为缩短篇幅,这里仅给出主程序部分的代码。如下所示:/*主程序流程*/while(1){//主循环if(recv_cmd(&type)==0)//发生帧错误或帧地址与本机//地址不符,丢弃当前帧后返回continue;switch(type){case__ACTIVE_://主机询问从机是否存在send_data(__OK_,0,dbuf);//发送应答信息break;case__GETDATA_:len=strlen(dbuf);send_data(__STATUS_,len,dbuf);//发送状态信息break;default:break;//命令类型错误,丢弃当前帧后返回}后记经过这次毕业设计,使我觉得不论从理论知识还是从实际操纵中都学到了不少知识,我想归纳起来,主要有以下四个方面:1、学会了高效率的查阅资料、运用工具书、利用网络查找资料。我发现,在我们所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整。偶而还会遇到错误的...
网站备案:桂ICP备号-1 (C)copyright@
帮帮文库版权所有单片机多机串口的通信
摘要本文详细介绍了基于RS-485总线的单片机与多台单片机间的串行通信原理、实现方法和相应的通信硬件、软件设计。该设计是由单片机与单片机组成的主从控制系统,其中单片机做为上位机对下位单片机是实现控制和监视功能。它包括通信和控制两个功能模块。单片机作为下位机在整个系统中属于从属地位,主要用来接收上位机的命令。由于此通信的单片接口是RS232的9针接口,且下位机数目有限(32台)。所以本设计采用了RS485总线以及RS232转RS485的协议芯片以满足长距离多机通信,本文讨论了总线接口转换、主从式通信协议设计方法,给出了采用中断式处理的通信过程流程图,并叙述了设计过程中必备的绘图软件PotelDXP的应用,以及编辑源代码软件keiluVision2的应用,实现了单片机对多个单片机组成采集终端的通信与管理。关键词:单片机单片机RS-485通信1
& 果果文库所有资源均来源于互联网,仅供网友学习交流,若侵犯了您的权益,请联系我们予以删除。
8575&&人浏览
16502&&人浏览
5942&&人浏览
12687&&人浏览
18244&&人浏览
6177&&人浏览
3525&&人浏览
16850&&人浏览
13920&&人浏览
31&&人浏览
9130&&人浏览
16076&&人浏览
12481&&人浏览
15425&&人浏览
16787&&人浏览
本文标题:单片机多机串口的通信 链接地址:
copyright@ 2013- Inc. All Rights Reserved 果果文库 版权所有 联系站长: ; 经营许可证编号:浙ICP备号查看: 5146|回复: 22
51单片机多机通信(主从机通信)问题
小弟初学单片机,跪求各位大神帮忙解答!!我最近弄了个单片机多机通信程序,具体暂时是一主一从。用串口助手显示主机地址发送没问题,从机接收到某一地址后正确反馈没问题。那么问题来了,当两机的TXD和RXD互连、共地之后,显示主从识别不成功(小弟我是以LED灯的亮灭判断的)。程序是从郭天祥那本书上面一模一样copy的。
已经纠结了一周,跪求各位大哥解救!万分感谢!
 TXD和RX交叉连接
TXD和RX交叉连接
对的,是交叉互连的。可是还是不成功,请问你有什么建议吗?
回帖助人的奖励!
要看你的I2C怎么写的, 才知道真正的问题在哪里
回帖助人的奖励!
把程序贴出来看看
主机程序:
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
#define Slave 0x02
#define BN 16
sbit liang=P1^0;& & & & & & & & & & & && &
uchar rbuf[16];
uchar code tbuf[16]={&master transmit&};
void err(void)
while(TI!=1);
& && &TI=0;
uchar master(uchar addr,uchar command)
& &uchar aa,i,p;& && && && && && && && && && && && && && && && && && && &
& &while(1)
& & SBUF=S
& & & & while(TI!=1);
& && && & TI=0;& & & &
& & & & while(RI!=1);
& && && & RI=0;
& & & & if(SBUF!=addr)
& & & & err();& & & &
& & & & else& & & & & & & & & & & & & & & & & & & &&&//以上配对成功
& & & & {& & & &&&liang=0;& & & & & & & & & & & &&&//成功标志&&
& & & && && &TB8=0;& & & & & & & & & & & & & & & && &
& & & & & & & &&&SBUF=
& & & & & & & &&&while(TI!=1);
& & & & & & & && && &&&TI=0;
& & & && && &while(RI!=1);
& && && && && &RI=0;
& & & & & & & & aa=SBUF;
& & & & & & & & if((aa&0x08)==0x08)
& & & & & & & & & & & && & {
& & & & & & & & & & & && && &&&TB8=1;
& & & & & & & & & & & & & & & && & err();
& & & & & & & & & & & && & }
& & & & & & & & & & & && & else
& & & & & & & & & & & && & {
& & & & & & & & & & & && && &&&if(command==0x01)
& & & & & & & & & & & & & & & && & {
& & & & & & & & & & & & & & & && & if((aa&0x01)==0x01)
& & & & & & & & & & & & & & & && & {
& & & & & & & & & & & & & & & && && &&&do
& & & & & & & & & & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & & & & & && & p=0;
& & & & & & & & & & & & & & & & & & & && & for(i=0;i&BN;i++)
& & & & & & & & & & & & & & & & & & & && & {
& & & & & & & & & & & & & & & & & & & && & SBUF=tbuf[i];
& & & & & & & & & & & & & & & & & & & && & p+=tbuf[i];
& & & & & & & & & & & & & & & & & & & && & while(TI!=1);
& & & & & & & && && && && && && && & TI=0;& && && &
& & & & & & & & & & & & & & & & & & & && &}
& & & & & & & & & & & & & & & & & & & && &SBUF=p;
& & & & & & & & & & & & & & & & & & & && &while(TI!=1);
& & & & & & & && && && && && && && & TI=0;
& & & && && && && && && &&&while(RI!=1);
& && && && && && && && && &&&RI=0;
& & & & & & & & & & & & & & & & & & & && & }& & & &
& & & & & & & & & & & & & & & & & & & && & while(SBUF!=0);
& & & & & & & & & & & & & & & & & & & && & TB8=1;
& & & & & & & & & & & & & & & & & & & && & return(0);
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & && && && && & else
& & & & & & & & & & & & & & & & & & & && && &{
& & & & & & & & & & & & & & & & & & & & & & & &&&if((aa&0x02)==0x02)
& & & & & & & & & & & & & & & & & & & & & & & && && &{
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&while(1);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & {&&
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&p=0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&for(i=0;i&BN;i++)
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&{while(RI!=1);
& & & & & & & & & & & & & & & & & & & & & & & & & & & && && && &RI=0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&rbuf[i]=SBUF;
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&p+=rbuf[i];
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&}
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&while(RI!=1);
& & & & & & & & & & & & & & & & & & & & & & & & & & & && && &&&RI=0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&
& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&if(SBUF==P)
& & & & & & & & & & & & & & & & & & & & & & & & & & & && &&&{SBUF=0x00;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & while(TI!=1);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && & TI=0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & {SBUF=0
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & while(TI!=0);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & TI=0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & TB8=1;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & return(0);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & && && && &}
& & & & & & & & & & & & & & & & & & & && && &}
& & & & & & & & & & & & & & & & & & & & & & & &&&liang=0;
& & & & & & & & & & & & & & & & & & & && &}
& & & & & & & & & & & & & & & &&&}
& & & && && && & & & & & }
& & & && && &void main()
& & & & & & & &&&{& & & & & & & &
& & & & & & & && &&&& & & & TMOD=0x20;
& & & & & & & & & & & & & & & & TL1=0
& & & & & & & & & & & & & & & & TH1=0
& & & & & & & & & & & & & & & & PCON=0x00;
& & & & & & & & & & & & & & & & TR1=1;
& & & & & & & & & & & & & & & & SCON=0xf8;& & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & master(Slave,0x01);
& & & & & & & & & & & & & & & & master(Slave,0x02);& & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & while(1);
& & & & & & & & & & & & & & & & }
从机程序:
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
#define Slave 0x02
#define BN 16
uchar trbuf[16];
uchar rebuf[16];&&
void str(void);
void sre(void);
void main(void)
TMOD=0X20;
PCON=0x00;
SCON=0xf0;
void ssio()interrupt 4& & & &
if(SBUF!=Slave)
SBUF=S& & & & & & & & & & & & & & & &
while(TI!=1);
& && &TI=0;
while(RI!=1);
& && &RI=0;
if(RB8==1)& & & & & & & & & & & &
if(a==0x01)
if(RRDY==1)
SBUF=0x01;
SBUF=0x00;
while(TI!=1);
while(RI!=1);
if(RB8==1)
if(a==0x02)
if(TRDY==1)
SBUF=0x02;
SBUF=0X00;
while(TI!=1);
while(RI!=1);
if(RB8==1)
SBUF=0x80;
while(TI!=1);
void str(void)& & & & & & & & & & & & & & & & & & & & & & & && & //发送数据块
uchar p,i;
for(i=0;i&BN;i++)
SBUF=trbuf[i];
p+=trbuf[i];
while(TI!=1);
while(TI!=1);
while(RI!=1);
while(SBUF!=0);
void sre(void)& & & & & & & & & & & & & & & & & & & & & & & && &//接收数据块
uchar p,i=0;
for(i=0;i&BN;i++)
while(RI!=1);
rebuf[i]=SBUF;
p+=rebuf[i];
while(RI!=1);
if(SBUF==p)
SBUF=0x00;
while(TI==0);
把程序贴出来看看
程序已经贴出来了,麻烦帮忙看看谢谢啦~
要看你的I2C怎么写的, 才知道真正的问题在哪里
程序已经贴出来了麻烦帮忙看看谢谢啦~
学习一下!!!!!!!!!!!
楼主的程序看起来比较混乱, 今天我抽空给你写了一个, 我没有做硬件,也没有51的编译器,应该没问题, 主机用查询方式写人, 用P1口显示LED的状态,从机用中断方式,用P1口显示LED的状态, 如果同步就OK。
//*****Master SourceCode for Uart******//
#include &reg52.h&
#define uchar&&unsigned char
#define uint& & unsigned int
const uchar LEDcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay_ms(uint t)
&&uint m,n;
&&for (m=0;m&t;m++)
& &for (n=0;n&1000;n++);
void MasterUART_init(void)
& & SCON = 0x50;
& & TMOD = 0x20;
& & TH1&&= 0xFD;
& & TL1&&= 0xFD;
& & TR1&&= 1;
//& & ES& &= 1;
//& & EA& &= 1;
void MasterSendByte(uchar udat)
while(!TI);
& && &TI = 0;
void MasterSendStr(uchar *str)
while(*str!='\0')
&&SendByte(*str);
& & MasterUART_init();
& & while(1)
& && &for(i=0;i&8; i++)
& && && &MasterSendByte(LEDcode[i]);
& && && &P1=LEDcode[i];
& && && &delay_ms(1000);
//*******Slave_source code for Uart******//
#include &reg52.h&
#define uchar&&unsigned char
#define uint& & unsigned int
void delay_ms(uint t)
&&uint m,n;
&&for (m=0;m&t;m++)
& &for (n=0;n&1000;n++);
void SlaveUART_init(void)
& & SCON = 0x50;
& & TMOD = 0x20;
& & TH1&&= 0xFD;
& & TL1&&= 0xFD;
& & TR1&&= 1;
& & ES& &= 1;
& & EA& &= 1;
& & SlaveUART_init();
& & while(1);
void interrupt_uart() interrupt 4
& & if(TI)
& && &&&TI = 0;
& && &&&REN = 1;
& & if(RI)
& && &&&RI = 0;
& && &&&temp = SBUF;
& && &&&P1=
& && &&&REN&&= 0;
嘿嘿,主机程序main中i没有定义。。。。
楼主的程序看起来比较混乱, 今天我抽空给你写了一个, 我没有做硬件,也没有51的编译器,应该没问题, 主 ...
嘿嘿,主机程序main中i没有定义。。。。
Exactly. You are correct. Thank you very much. modifing as following
& & MasterUART_init();
& & while(1)
& && &for(i=0;i&8; i++)
& && && &MasterSendByte(LEDcode[i]);
& && && &P1=LEDcode[i];
& && && &delay_ms(1000);
回帖助人的奖励!
楼主,我也出现了类似的问题,你的解决了吗,求指导
楼主,我也出现了类似的问题,你的解决了吗,求指导
请问您解决了吗?我也在做这个,希望得到您的指导
换一本书看看,郭天祥书没有全部仿真,个案有可能不能实现。张志良主编的“《单片机实验实训100例》 ISBN 978-7-,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
郭天祥书没有全部仿真,个案有可能不能实现。
换一本书看看,张志良主编的“《单片机实验实训100例》 ISBN 978-7-,北航社出版”全部仿真,能演示,能观看,其中有双机串行通讯方式1、2、3,有电路有程序,你试试。
张志良主编的“《单片机实验实训100例》 ISBN 978-7-,北航社出版”有双机串行通讯方式1、2、3,全部仿真,能演示,能观看。
void MasterSendStr(uchar *str)
while(*str!='\0')
&&SendByte(*str);
求助 请问这段函数是什么意思
void MasterSendStr(uchar *str)
while(*str!='\0')
你总共就俩机通讯还分什么主从啊 直接对着喊就完了 搞这么复杂 郭老师那意思是说一个完整的通讯程序应该怎么写 有呼叫 有应答 有确认 但并不是每个程序都必须那么写 你这么简单的应用自己又不是很熟练 出点问题还不够找错的呢
1. 你能分别给两个片子下载程序 说明片子的通讯部分没问题
2. RX-TX TX-RX GND-GND 这是TTL标准接法 照接就应该不会有问题
3. 以上硬件排除 那就是软件 你先写个简单的 每隔2s从任意一个向另外一个发一位16进制 程序前面定义个数组是要发送的内容 0x01,0X02 0X03 另外一个机器不断的判断接收数据 然后 如果是0x01 亮1灭2 3 如果是0x02 灭1 3亮2 以此类推 这样的程序够简单吧 能行 再往深了写
4. 真到需要分主从也不一定非郭老师那么写 你加一位地址 所有机器收到数据流就判断第一位地址是否呼叫自己 是自己就处理 不是自己就不动作 一样可以分出来
Powered byPC 机和多个单片机通信解决方案(超简单和实用) - liulianddp2的日志 - 电子工程世界-论坛
PC 机和多个单片机通信解决方案(超简单和实用)
已有 2220 次阅读 17:28
&&&&& 前段时间,做了一个小项目,十路继电器的控制方面,要用一台电脑通过串口控制两块单片机板子,每块板子有10路继电器。我是用的STC12C5A32S2芯片。用的RS485通信。
&&&&&&这个是一个多机通信,用的串口通信方式三(串口通信方式一不能用于多机通信,因为涉及到通信通道被哪个模块抢占的问题)。
&&&&& 其实这个有个问题,串口通信方式三,数据位为9位,而如何用串口调试助手与单片机通信呢,串口调试助手发送的数据位只有8位。这个问题不容忽视。否则会出问题的。
&&&&&在网上找了一些类似的例子,并不满意,虽然后来发现这些例子并没有错。
&&&& 下面来说一下,网上的例子局限性吧。
&&&& 串口通信方式三中有个SM2位和RB8位,SM2可以决定要不要侦听串口发送来的信息。RB8位决定串口发送来的信息是数据字节,还是地址字节。
&&&& 其一, 网上的某些例子,写的较复杂。它把地址和数据分开发送和接收。第一次发送或接收地址,第二次发送或接收数据信息。这样既要处理SM2,又要处理RB8,这样势必造成使用的不方便性。我们习惯了将地址信息字节写在一条协议的开头,后面紧跟多个字节的数据,还有校验什么的。
&&& &其二,这些例子当中,也没有提到RB8位该怎么处理,说白了就是并未说明,串口调试助手如何处理RB8位。
&&& 我多次调试发现,如果串口调试助手不做修改,沿用串口通信一的方式发送数据。对单个字节发送不成问题。但对于多个字节的发送(一次发送多个字节)就会有问题。下位机收到的数据会是乱码。
&&& 后来,我又在发送一条协议时,在发送字节之间加个1ms的延时,问题得到一定解决,但不完美。
&&&&再后来我把注意力集中在RB8上,问题才得以解决。
&&& 方法就是,把串口调试助手的停止位设置成2(思想就是,将其中一个停止位当做第九位)。
&&& 这样串口就相当于发送9个数据和一个停止位...
&&& 单片机要发送数据给上位机,将TB8位设置成1,串口调试助手就能收到正确信息。
&&&&接下来说一下其一中提到的问题.
&&& 相信大家对PC机的串口与单个单片机通信不陌生。
&&&&下位机(也就是单片机),程序写起来挺简单。无非是先来个串口初始化,再加个串口中断。使用的是串口通信方式一。
&&& 其实可以将串口通信方式三做的和通信方式一一样简单。只要初始化时将SM2设为0(表示对接收来的数据进行侦听),SM0和SM1都设为1(表示用的是串口通信方式三)。
&&& 然后串口中断中服务程序,不需要再操作SM2了,也不用操作RB8,一切和串口通信方式一一样了。
只是单片机在向上位机发送数据时,TB8设为1。这样就不用把地址和数据分得那么清楚了。对于每一个下位机来说相当于,一直在接收数据,对接收来的数据进行分析,判断地址相符,就做动作和回应。否则接收数据但不动作和回应。&&&
&&&&& 最后说一下RS485通信问题
&&&&& 程序和RS232通信程序差不多,无非是,多个方向控制管教。发送时方向管脚拉高。接收时方向管脚拉低。&
评论 ( 个评论)
EEWORLD 官方微信
Powered by2017年6月 VC/MFC大版内专家分月排行榜第二2017年5月 VC/MFC大版内专家分月排行榜第二2017年1月 VC/MFC大版内专家分月排行榜第二2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2017年4月 VC/MFC大版内专家分月排行榜第三2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 单片机多机通信报告 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信