基于RS485总线的多机通信系统设计.docx
《基于RS485总线的多机通信系统设计.docx》由会员分享,可在线阅读,更多相关《基于RS485总线的多机通信系统设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于RS485总线的多机通信系统设计
2.2RS-485
RS-485标准接口是单片机系统种常用的一种串行总线之一。
RS-485通信方式RS-485标准是由EIA(电子工业协会)和TIA(通讯工业协会)共同制订和开发的。
RS-485作为一种多点差分数据传输的电气规范,已成为业界最广泛应用的标准通信接口之一。
理论上,RS-485标准最多接入32个设备(受芯片驱动能力的影响),可以工作在半双工或全双工模式下,最大传输距离约为1219米,最大传输速率约为10Mbps[1]。
然而通常RS-485网络采用平衡双绞线作为传输媒体,平衡双绞线的长度与传输速率成反比,只有在20Kbps的传输速率下,才可能达到最大传输距离。
一般15米长的双绞线最大传输速率仅为1Mbps。
不过对于速率要求不是很高的控制系统来说已经足够了。
RS-485采用平衡发送和差分接收方式来实现通信:
在发送端TXD将串行口的TTL电平信号转换成差分信号A、B两路输出,经传输后在接收端将差分信号还原成TTL电平信号。
两条传输线通常使用双绞线,又是差分传输,因此有极强的抗共模干扰的能力,接收灵敏度也相当高。
同时,最大传输速率和最大传输距离也大大提高。
如果以10Kbps速率传输数据时传输距离可达12m,而用100Kbps时传输距离可达1.2km。
如果降低波特率,传输距离还可进一步提高。
另外RS-485实现了多点互连,最多可达256台驱动器和256台接收器,非常便于多器件的连接。
不仅可以实现半双工通信,而且可以实现全双工通信。
2.3多机通信原理
在多机通信中,每台从机均分配有一个从机地址,主机与从机之间进行串行通信时,通常是主机先呼叫某从机地址,唤醒被叫从机后,主、从两机之间进行数据交换。
而未被呼叫的从机则继续进行各自的工作。
可是,如果在主机与某被呼叫从机进行数据交换过程中,其他从机如果不采取相应的数据识别技术,则这些从机就会因为串行通信线上有数据传输而时时被打断,影响正常的工作。
利用单片机的串口工作方式2、方式3可以很好解决上述问题。
在多机通信过程中,从机首先要解决的是如何识别主机发送的是地址信息还是数据信息。
当发送的是地址信息时,各从机都响应串口中断,接收主机下发的一帧地址数据。
而当主机发送数据帧时,无关从机可不响应串口中断。
解决的方法是:
当主机发送一帧地址信息时,应保持这帧数据的第9位为1(即TB8=1)。
从机按照工作方式2或工作方式3运行时,将串口寄存器SCON中的控制位SM2置为1,当所接收的一帧数据的第9位为1,所有从机都产生串口中断,接收这一帧地址数据并与各自的从机地址进行比较,以判断主机是否要与本机通信。
接收到的地址数据与从机地址相等达到为被呼叫从机,该从机将串口控制寄存器SCON中的控制位SM2清为0,去接收主机发送来的数据帧(数据帧的第9位为0),此时不管接收到的第9位数据是否为1或0,都要产生串口中断,这就保证了主机与被呼叫从机间的正常数据通信。
数据通信结束后,该从机又重新将串行口控制寄存器SCON中的控制位SM2置为1,为下一次与主机进行通信做好准备。
其他从机则一直在SM2=1下继续自己的工作,不会因为主、从机之间的数据通信而被打断。
多机通信的实现,主要靠主、从机正确地设置与判断多机通信控制位SM2和发送或接收的第9位数据(TB8或RB8)。
当主机给从机发送信息时,要根据发送信息的性质来设置TB8,发送地址信号时,设置TB8=1;发送数据或命令时,设置TB8=0。
当从机的SM2为1时,该从机只接收地址帧(RB8位为1),对数据帧(RB8位为0)将不予理睬。
而当SM2为0时,该从机接收所有发送来的信息。
多机通信过程如下:
(1)使所有从机的SM2置1,处于只接收地址帧的状态(即从机复位);
(2)主机发送一地址帧信息,其中包含8位地址,第9位为地址、数据标志位,第9位置1表示发送的是地址;
(3)从机接收到地址帧后,各自中断CPU,把接收到的地址与本地址作比较;
(4)地址相符的从机,使SM2清零以接收主机随后发来的所有信息,对于地址不相符的从机,仍保持SM2=1状态,对主机随后发送的数据不予理睬,直到主机发送来新的地址帧;
(5)主机发送数据或控制信息给被寻址的从机;
(6)被寻址的从机,因SM2=0,可以接收主机发送过来的所有数据,当从机接收数据结束时,置位SM2,返回接收地址帧状态(复位状态);
(7)当主机改为与另外从机联系时,可再发地址帧寻址其从机,而先前被寻址过的从机恢复SM2=1。
第4章系统问题及其解决
4.1通信规则
由于MAX485通讯是一种半双工通讯,发送和接收共用同一物理信道。
在任意时刻只允许一台单机处于发送状态。
因此要求应答的单机必须在侦听到总线上呼叫信号已经发送完毕,并且没有其它单机发出应答信号的情况下,才能应答。
半双工通讯对主机和从机的发送和接收时序有严格的要求。
如果在时序上配合不好,就会发生总线冲突,使整个系统的通讯瘫痪,无法正常工作。
要做到总线上的设备在时序上的严格配合,必须要遵从以下几项原则:
(1)复位时,主从机都应该处于接收状态。
MAX485芯片的发送和接收功能转换是由芯片的RE*,DE端控制的。
RE*=1,DE=1时,MAX485发送状态;RE*=0,DE=0时,MAX485处于接收状态。
一般使用单片机的一根口线连接RE*,DE端。
在上电复位时,由于硬件电路稳定需要一定的时间,并且单片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,加上上电时各电路的不稳定,可能向总线发送信息。
因此,如果用一根口线作发送和接收控制信号,应该将口线反向后接入MAX485的控制端,使上电时MAX485处于接收状态。
另外,在主从机软件上也应附加若干处理措施,如:
上电时或正式通讯之前,对串行口做几次空操作,清除端口的非法数据和命令。
(2)控制端RE*,DE的信号的有效脉宽应该大于发送或接收一帧信号的宽度。
在全双工通讯过程中,发送和接收信号分别在不同的物理链路上传输,发送端始终为发送端,接收端始终为接收端,不存在发送、接收控制信号切换问题。
在RS-485半双工通讯中,由于MAX485的发送和接收都由同一器件完成,并且发送和接收使用同一物理链路,必须对控制信号进行切换。
控制信号何时为高电平,何时为低电平,一般以单片机的TXC(发送完成标记),RXC(接收完成标记)信号作参考。
发送时,检测TXC是否建立起来,当TXC为高电平后关闭发送功能转为接收功能;
接收时,检测RXC是否建立起来,当RXC为高电平后,接收完毕,又可以转为发送。
在理论上虽然行得通,但在实际联调中却出现传输数据时对时错的现象。
根据查证有关资料,并借助示波器反复测试,才发现一个值得注意的问题,我们可以查看单片机的时序:
单片机在串行口发送数据时,只要将8位数据位传送完毕,TXC标志即建立,但此时应发送的第九位数据位(若发送地址帧时)和停止位尚未发出。
如果在这是关闭发送控制,势必造成发送帧数据不完整。
如果单片机多机通讯采用较高的波特率,几条操作指令的延时就可能超过2位(或1位)数据的发送时间,问题或许不会出现。
但是如果采用较低波特率,如9600,发送一位数据需104μs左右,单靠几条操作指令的延时远远不够,问题就明显地暴露出来。
接收数据时也同样如此,单片机在接收完8个数据位后就建立起RXC信号,但此时还未接收到第九位数据位(若接收地址帧时)和停止位。
所以,接收端必须延时大于2位数据位的时间(1位数据位时间=1/波特率),再作应答,否则会发生总线冲突。
(3)总线上所连接的各单机的发送控制信号在时序上完全隔开。
为了保证发送和接收信号的完整和正确,避免总线上信号的碰撞,对总线的使用权必须进行分配才能避免竞争,连接到总线上的单机,其发送控制信号在时间上要完全隔离。
总之,发送和接收控制信号应该足够宽,以保证完整地接收一帧数据,任意两个单机的发送控制信号在时间上完全分开,避免总线争端。
第5章软件设计
5.1系统结构
该多机通信系统的系统结构图如图5-1所示,系统采用半双工主从通信方式,主机可以读取从机的数据或写数据到从机,并将数据送终端进行显示;从机主要负责对分布的电子设备进行监测或控制,用中断的方式接收主机发来的命令并做出回应。
图5-1系统结构图
5.2通信协议
5.2.1信息格式
该协议的信息格式如下:
(1)编码格式;二进制代码。
(2)波特率:
9600b/s。
(3)通信方式:
半双工。
(4)每个字符由u位组成;
1位:
起始位(0);
8位:
数据位;
1位:
地址/数据识别位(1为地址,o为数据);
l位:
停止位
(1)。
(5)字符发送顺序;低位在先
(6)帧结束标志:
通信线路空闲3.5ms以上
(7)帧校验方式:
数据和(2字节)
(8)主机询问的一般格式见表5-2:
表5-2主机询问的一般格式
从机地址码:
两字节二进制数,后一字节是前一字节的反码。
命令码:
一字节二进制数,O1H代表主机读,02H代表主机写。
数据个数:
表示主机要读写的字节个数,一字节二进制数。
校验和:
两字节二进制数,是将从机地址码、命令和数据按字节从头依次相加,生成两字节的校验和。
(9)从机应答的一般格式(如表5-3)
表5-3从机应答的一般格式
图中信息段的定义同图2。
5.2.2定时与重发
本通信协议定时规定如下:
(1)帧发送时限;70ms.超过此时限结束发送。
(2)主机等待从机应答时限:
7ms,超过此时限,酌情重发。
(3)主机重发次数:
不超过4次,超过后,判通信失败。
5.2.3通信过程
一次完整的通信过程分为3个阶段:
主机询问、从机应答和链路释放。
主机询问阶段,主机以帧的形式将从机地址码、命令、数据和校验码传送到指定从机;从机应答阶段,从机解释接收的命令码,并组织相应帧信息回送到主机;链路释放阶段,从机清除接收缓冲区及相关变量,准备与主机下次通信。
任何一次完整的通信过程都是由主机方发起的,从机在被主机寻址前只能处于侦听状态,从机在接收到地址码的第2个字节后,立即判断是否寻址自己,如果是.继续接受下面的数据,否则不与理睬。
5.3通信软件设计
5.3.1从机通信软件设计
在该系统中,从机的主要任务是对被检测设备进行故障检测和故障定位,通信软件的主要功能是接收主机的命令并将检测的结果回送主机。
从机通信软件由2部分组成:
串行中断服务程序和定时器TO中断服务程序。
串行中断服务程序用于接收或发送数据;TO中断服务程序用于当从机接收完一帧信息后进行解释并启动通信向主机应答,另外也用于当从机发送超时后的一些处理。
从机上电后处于侦听状态,当主机寻址时,便进人中断服务程序,其程序流程图如图5-4所示。
图5-4串行通信中断服务程序流程图
首先判断是接收中断还是发送中断,若是接收中断,则清除RI,同时启动字符间隔定时器TO,并置收发标志为收。
当接收完第2个字节后,各从机立即判断是否寻址本机,若是,则置SM2为‘0’,继续接收主机送来的数据;若不是,则禁止T0定时,不在接收后面的数据。
当被寻址从机接收完一帧信息后,字符间隔定时器会产生定时中断,进入TO中断服务程序。
图5-5是TO中断服务程序流程图。
图5-5TO中断服务程序流程图
进入TO中断服务程序后,首先清除TO中断请求标志,停止TO定时器,接着判断是接收完成还是发送超时,若是接收完成,再判断校验和是否正确,若正确,对接收的命令进行解释,看是主机读还是主机写操作,若是主机读,则将数据打包,送到专门用于通信的数组,接着,禁止接收,置本机为应答工作方式,最后启动发送,发送第一个字节,同时启动发送时限定时器TO。
当一个字节发送完后,便进入通信中断服务程序,继续发送余下数据。
如果在上边判校验和时,发现不正确,则置SM2为‘1’,恢复本机的侦听状态,以便接收主机的重发信息。
5.3.2主机通信软件设计
该系统主机的主要任务是循环读取从机的检测结果,并送终端显示,其通信软件由3部分组成:
主程序中负责寻址从机的寻址模块、通信中断服务程序和TO中断服务程序。
寻址模块程序流程图见图5-6。
图5-6寻址模块程序流程图
对从机寻址是按照从机的编号顺序进行的,即从1号从机开始,主机发送该从机信息帧的第1个字节启动寻址,同时启动发送超时定时器TO,然后检测通信结束标志.当主机成功的接收到该从机的应答信息后,便会置位该标志,完成与该从机的通信。
接下来,寻址下一从机,直到所有从机都被寻址。
最后,主机完成其它功能后,又从1号从机开始下一循环的寻址。
通信中断服务程序和TO中断服务程的设计方法与从机的大同小异,在此不再介绍。
第6章程序设计
程序是单片机灵魂,没有对应的程序,单片机系统是无法完成任何动作的,解决所涉及的问题的。
编写程序必须对机器的指令系统非常的熟悉,而且不能脱离具体的机器,因此程序不能在不同的机器上通用。
未了使本系统能够成功运行,程序是必不可少的,所以这次编写了一个主机程序,两个从机程序。
6.1主机程序如下:
#include
#include
#include
unsignedcharcort=0;
sbitP3_5=P3^5;
/*********************************
按键扫描子程序
*********************************/
key_serial()interrupt0using1
{
++cort;
}
/*********************************
发送子程序
*********************************/
voidmaster(void)
{
if(cort==1)
{
SBUF=0x01;
while(TI!
=1);TI=0;
P3_5=0;
SM2=0;
while(RI!
=1);RI=0;
P2=SBUF;
SM2=1;
P3_5=1;
}
if(cort==2)
{
SBUF=0x02;
while(TI!
=1);TI=0;
SM2=0;
P3_5=0;
while(RI!
=1);RI=0;
P2=SBUF;
SM2=1;
P3_5=1;
}
if(cort==3)cort=1;
SM2=1;
}
/***************主程序****************/
voidmain(void)
{
P2=0xff;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf8;
EA=1;
EX0=1;
IT0=1;
P3_5=1;
while
(1)
{
master();//发送
}
}
6.2从机1程序如下:
#include
#include
#include
unsignedcharserial_receiver;
sbitP3_5=P3^5;
/****************************************
串行口中断子程序
****************************************/
voidserial(void)interrupt4using1
{
ES=0;
RI=0;
if(SBUF==0x01)
{
P3_5=1;
SM2=0;
P1=0x10;
SBUF=0x10;
while(TI!
=1);TI=0;
}
SM2=1;
ES=1;
P3_5=0;
}
/*****************主程序******************/
voidmain(void)
{
P1=0x00;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
EA=1;
ES=1;
P3_5=0;
while
(1)
{
_nop_();
}
}
6.3从机2程序如下:
#include
#include
#include
unsignedcharserial_receiver;
sbitP3_5=P3^5;
/****************************************
串行口中断子程序
****************************************/
voidserial(void)interrupt4using1
{
ES=0;
RI=0;
if(SBUF==0x02)
{
P3_5=1;
SM2=0;
P1=0x80;
SBUF=0x80;
while(TI!
=1);TI=0;
}
SM2=1;
ES=1;
P3_5=0;
}
/*****************主程序******************/
voidmain(void)
{
P1=0x00;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
EA=1;
ES=1;
P3_5=0;
while
(1)
{
_nop_();
}
}
WelcomeTo
Download!
!
!
欢迎您的下载,资料仅供参考!