一、概述
在数据通信、计算机网络以及工业上的分布式控制系统中,经常需要采用串行通信来达到远程信息交换的目的。目前,有多种接口标准可用于串行通信,包括RS-232、RS-422、RS-423和RS-485[2]。RS232是最早的串行接口标准,在短距离、较低波特率串行通信中得到了广泛应用。其后发展起来的RS-422、RS-485是平衡传送的电气标准,比起RS-232非平衡的传送方式在电气指标上有了大幅度的提高。
RS-485串行接口的电气标准实际上是RS-422的变型,它属于七层OSI(Open System Interconnection,开放系统互连)模型物理层的协议标准。由于性能优异、结构简单、组网容易,RS-485总线标准得到了越来越广泛的应用。其互连方式如图1所示。
图1 RS-485互连示意图
RS-485采用平衡发送和差分接收方式来实现通信:在发送端TXD将串行口的TTL电平信号转换成差分信号A、B两路输出,经传输后在接收端将差分信号还原成TTL电平信号。两条传输线通常使用双绞线,又是差分传输,因此有极强的抗共模干扰的能力,接收灵敏度也相当高。同时,最大传输速率和最大传输距离也大大提高。如果以10Kbps速率传输数据时传输距离可达12m,而用100Kbps时传输距离可达1.2km。如果降低波特率,传输距离还可进一步提高。另外RS-485实现了多点互连,最多可达32台驱动器和32接收器,非常便于多器件的连接。不仅可以实现半双工通信,而且可以实现全双工通信。下面以RS-485总线型网络为原型,介绍它的软硬件构成。
二、RS-485总线型多点互连设计
1、硬件电路设计
图2 RS-485总线型网络原理图
分布式多点数据采集系统或集中控制系统的网络拓扑一般采用总线方式,传送数据采用主从站的方法。图2所示是用RS-485构成的总线型网络系统,采用主从方式进行多机通信。主机可以是PC机、工控机或单片机,从机一般是单片机。每个从机拥有自己固定的地址,由主机控制完成网上的每一次通信。R为平衡电阻,通常取为120欧。
开始时所有从机复位,即处于监听状态,等待主机的呼叫。当主机向网上发出某一从机的地址时,所有从机接收到该地址并与自己的地址相比较。如果相符,说明主机在呼叫自己,应发回应答信号,表示准备好开始接收后面的命令和数据;否则不予理睬,继续监听呼叫地址。主机收到从机的应答后,则开始一次通信。通信完毕,从机继续处于监听状态,等待呼叫。
图3 单片机的RS-485接口
采用单片机和RS-485接口的原理图如图3所示。由于使用半双工方式,RS-485接口芯片采用的是SN75LBC184集成电路。这是具有瞬变高压抑制功能的芯片,能抗雷击、静电放电,避免因交流电故障引起的非正常高压脉冲冲击。A、B为RS-485总线接口,DI是发送端,RO为接收端,分别与单片机串行口的TXD、RXD连接,RE、DE为收发使能端,由单片机的 P1.4口作为收发控制。数据采集或控制信号的输出通过P0口进行,P2的口线可用来控制A/D或D/A转换。
2、网络协议
SN75LBC184仅能保证在物理层上二进制信号流的畅通。为了能使具体的命令、数据在网络上正确地传输,在数据链路层必须提供一定的网络协议,保证在物理层的比特流出现错误时进行检测和校正,同时实现生成数据帧和命令帧的功能。
主机发出的信息分为地址和数据,它们必须区分开。单片机[1]串行口模式3是波特率可变的9位通信方式,可编程位(TB8)由主机单片机自动打包区别地址和数据,TB8为1表示地址字节,否则是数据字节。从机接收时则根据这一位来区别地址和数据。
通信开始前,所有的从机处于复位状态,监听主机的地址呼叫。FFH的呼叫地址将使所有的从机复位。这时的从机只对TB8为1的地址字节敏感,对数据字节不予理睬。如果有地址呼叫,则中断所有的从机。每个从机都把接收到的呼叫地址和本机地址相比较,如果相符,则该从机开始接收数据帧。其他从机则保持不变,后面的数据字节由于TB8为0,它们不接收,继续监听地址呼叫。通信的从机完成通信后自动转入复位状态。
通信的数据长度必定大于一个字节,必须将他们合成一帧。网络数据协议帧的格式如表1所示。
表1 网络数据协议
第一部分只有一个字节,代表该帧的长度为N+2。第二部分是N个数据的数据包。具体地说,当主机发给从机的时候,数据包包括命令字及参数;当从机回送给主机的时候,包括状态字以及必要的数据。最后一部分是采用CCITT(Consultative Committee International for Telephony and Telegraph,国际电报电话咨询委员会)的CRC(Cyclic Redundancy Cheek,循环冗余校验)码,长度是两个字节。
三、服务软件
按照网络?议的帧格式编写的通信软件通过物理层最终完成主机与从机之间的数据交换。在总线型拓扑结构构成的分布式数据采集系统中,主机和各从机间传送的命令和数据是二进制的直接传送,并且从机还要完成采集数据和控制的任务,主机要完成集中处理的任务,所以服务软件要使主机和各从机协调一致地工作,尽量减小通信对其他工作的影响。
下面以单片机构成的总线型多点数据采集系统为例,给出用C51编写的RS-485通信部分服务软件。
1、主机程序
#define uchar unsigned char
...
sbit tr=p1.4:
void main()
{
//初始化
PCON=0; //SMODE=0
TMOD=0x20; //定时器1设为模式2,作为串行口的波特率发生器
EA=0; //禁止定时器中断
TH1=0xf3;
TL1=0xf3; //定时起始值,6MHz晶振时波特率为1200bps
SCON=0xd8; //串行口模式3,TB8=1发送地址呼叫
TR1=1; //启动定时器1
while(TI=0); //等待发送结束
TI=0;
...
}
//发送子程序
uchar SendMsg(uchar msg,uchar len,uchar IDnum)
//msg:发送缓冲区指针;len:要发送的数据长度;IDnum:从机号
{
...
TB8=1;
tr=1;
SBUF=0xff; //复位从机
while(TI=0);
TI=0;
SBUF=IDnum; //呼叫从机
while(TI=0);
TI=0;
tr=0;
while(RI=0); //等待从机回应 RI=0; //清除串行口中断标志
//下面是数据帧
TB8=0;
tr=1;
SBUF=len+2;
while(TI=0)
TI=0
for(i=0;i
{
SBUF=*(msg+i);
while(TI=0);
TI=0;
}
//下面计算 @#@冗余校验码并发送
...
//等待从机回应,看是否接收正确
...
return 0; //正确返回
}
2、从机程序
#define ADDRESS 0x01
...
sbit tr=P1.4;
//中断接收程序
void sevice-serial(void)interrupt 4 using 1
{
uchar rs;
RI=0;
ES=0; //关串行口中断
tr=0;
rs=SBUF;
if(rs=0xff) //是复位命令
{
SM2=1;
ES=1;
return;
}
if(rs!=ADDRESS) //不是呼叫本机
{
ES=1;
return;
}
SM2=0;
tr=1;
SBUF=ADDRESS; //用本机地址作为应答
while(TI=0);
TI=0;
tr=0;
//下面开始接收
...
}
四、结束语
本文着重讨论了用RS-485构成网络系统的基本组网方法,当然在具体的应用中还会有一些变化。由于RS-485具有性能优异、组网简单的优点,它在集中控制系统、分布式控制系统中的应用相当广泛,特别是在要求远距离传输的应用中。由于其硬件电路已比较成熟,设计中的问题主要集中在网络协议和服务软件的设计上。 网络协议是保证通信畅通的关键,在一定程度上也影响着网络通信的可靠性,即它必须能够抵抗实际运作环境的干扰。另外通信只是整个系统中的一个部分,系统还必须完成诸如数据采集和控制的功能。这就要求通信占用尽量少的时间,以求达到整个系统的高效率。在通信数据量一定的情况下,采用较高的波特率当然比较好,但高的波特率必定要降低传输距离,在实际应用中必须仔细衡量。更好的办法就是采用数据压缩算法,在传输前对数据进行压缩,可使通信数据量大大减少,网络效率成倍提高。
1楼
0
0
回复
在数据通信、计算机网络以及工业上的分布式控制系统中,经常需要采用串行通信来达到远程信息交换的目的。目前,有多种接口标准可用于串行通信,包括RS-232、RS-422、RS-423和RS-485[2]。RS232是最早的串行接口标准,在短距离、较低波特率串行通信中得到了广泛应用。其后发展起来的RS-422、RS-485是平衡传送的电气标准,比起RS-232非平衡的传送方式在电气指标上有了大幅度的提高。
RS-485串行接口的电气标准实际上是RS-422的变型,它属于七层OSI(Open System Interconnection,开放系统互连)模型物理层的协议标准。由于性能优异、结构简单、组网容易,RS-485总线标准得到了越来越广泛的应用。其互连方式如图1所示。
图1 RS-485互连示意图
RS-485采用平衡发送和差分接收方式来实现通信:在发送端TXD将串行口的TTL电平信号转换成差分信号A、B两路输出,经传输后在接收端将差分信号还原成TTL电平信号。两条传输线通常使用双绞线,又是差分传输,因此有极强的抗共模干扰的能力,接收灵敏度也相当高。同时,最大传输速率和最大传输距离也大大提高。如果以10Kbps速率传输数据时传输距离可达12m,而用100Kbps时传输距离可达1.2km。如果降低波特率,传输距离还可进一步提高。另外RS-485实现了多点互连,最多可达32台驱动器和32接收器,非常便于多器件的连接。不仅可以实现半双工通信,而且可以实现全双工通信。下面以RS-485总线型网络为原型,介绍它的软硬件构成。
二、RS-485总线型多点互连设计
1、硬件电路设计
图2 RS-485总线型网络原理图
分布式多点数据采集系统或集中控制系统的网络拓扑一般采用总线方式,传送数据采用主从站的方法。图2所示是用RS-485构成的总线型网络系统,采用主从方式进行多机通信。主机可以是PC机、工控机或单片机,从机一般是单片机。每个从机拥有自己固定的地址,由主机控制完成网上的每一次通信。R为平衡电阻,通常取为120欧。
开始时所有从机复位,即处于监听状态,等待主机的呼叫。当主机向网上发出某一从机的地址时,所有从机接收到该地址并与自己的地址相比较。如果相符,说明主机在呼叫自己,应发回应答信号,表示准备好开始接收后面的命令和数据;否则不予理睬,继续监听呼叫地址。主机收到从机的应答后,则开始一次通信。通信完毕,从机继续处于监听状态,等待呼叫。
图3 单片机的RS-485接口
采用单片机和RS-485接口的原理图如图3所示。由于使用半双工方式,RS-485接口芯片采用的是SN75LBC184集成电路。这是具有瞬变高压抑制功能的芯片,能抗雷击、静电放电,避免因交流电故障引起的非正常高压脉冲冲击。A、B为RS-485总线接口,DI是发送端,RO为接收端,分别与单片机串行口的TXD、RXD连接,RE、DE为收发使能端,由单片机的 P1.4口作为收发控制。数据采集或控制信号的输出通过P0口进行,P2的口线可用来控制A/D或D/A转换。
2、网络协议
SN75LBC184仅能保证在物理层上二进制信号流的畅通。为了能使具体的命令、数据在网络上正确地传输,在数据链路层必须提供一定的网络协议,保证在物理层的比特流出现错误时进行检测和校正,同时实现生成数据帧和命令帧的功能。
主机发出的信息分为地址和数据,它们必须区分开。单片机[1]串行口模式3是波特率可变的9位通信方式,可编程位(TB8)由主机单片机自动打包区别地址和数据,TB8为1表示地址字节,否则是数据字节。从机接收时则根据这一位来区别地址和数据。
通信开始前,所有的从机处于复位状态,监听主机的地址呼叫。FFH的呼叫地址将使所有的从机复位。这时的从机只对TB8为1的地址字节敏感,对数据字节不予理睬。如果有地址呼叫,则中断所有的从机。每个从机都把接收到的呼叫地址和本机地址相比较,如果相符,则该从机开始接收数据帧。其他从机则保持不变,后面的数据字节由于TB8为0,它们不接收,继续监听地址呼叫。通信的从机完成通信后自动转入复位状态。
通信的数据长度必定大于一个字节,必须将他们合成一帧。网络数据协议帧的格式如表1所示。
表1 网络数据协议
第一部分只有一个字节,代表该帧的长度为N+2。第二部分是N个数据的数据包。具体地说,当主机发给从机的时候,数据包包括命令字及参数;当从机回送给主机的时候,包括状态字以及必要的数据。最后一部分是采用CCITT(Consultative Committee International for Telephony and Telegraph,国际电报电话咨询委员会)的CRC(Cyclic Redundancy Cheek,循环冗余校验)码,长度是两个字节。
三、服务软件
按照网络?议的帧格式编写的通信软件通过物理层最终完成主机与从机之间的数据交换。在总线型拓扑结构构成的分布式数据采集系统中,主机和各从机间传送的命令和数据是二进制的直接传送,并且从机还要完成采集数据和控制的任务,主机要完成集中处理的任务,所以服务软件要使主机和各从机协调一致地工作,尽量减小通信对其他工作的影响。
下面以单片机构成的总线型多点数据采集系统为例,给出用C51编写的RS-485通信部分服务软件。
1、主机程序
#define uchar unsigned char
...
sbit tr=p1.4:
void main()
{
//初始化
PCON=0; //SMODE=0
TMOD=0x20; //定时器1设为模式2,作为串行口的波特率发生器
EA=0; //禁止定时器中断
TH1=0xf3;
TL1=0xf3; //定时起始值,6MHz晶振时波特率为1200bps
SCON=0xd8; //串行口模式3,TB8=1发送地址呼叫
TR1=1; //启动定时器1
while(TI=0); //等待发送结束
TI=0;
...
}
//发送子程序
uchar SendMsg(uchar msg,uchar len,uchar IDnum)
//msg:发送缓冲区指针;len:要发送的数据长度;IDnum:从机号
{
...
TB8=1;
tr=1;
SBUF=0xff; //复位从机
while(TI=0);
TI=0;
SBUF=IDnum; //呼叫从机
while(TI=0);
TI=0;
tr=0;
while(RI=0); //等待从机回应 RI=0; //清除串行口中断标志
//下面是数据帧
TB8=0;
tr=1;
SBUF=len+2;
while(TI=0)
TI=0
for(i=0;i
{
SBUF=*(msg+i);
while(TI=0);
TI=0;
}
//下面计算 @#@冗余校验码并发送
...
//等待从机回应,看是否接收正确
...
return 0; //正确返回
}
2、从机程序
#define ADDRESS 0x01
...
sbit tr=P1.4;
//中断接收程序
void sevice-serial(void)interrupt 4 using 1
{
uchar rs;
RI=0;
ES=0; //关串行口中断
tr=0;
rs=SBUF;
if(rs=0xff) //是复位命令
{
SM2=1;
ES=1;
return;
}
if(rs!=ADDRESS) //不是呼叫本机
{
ES=1;
return;
}
SM2=0;
tr=1;
SBUF=ADDRESS; //用本机地址作为应答
while(TI=0);
TI=0;
tr=0;
//下面开始接收
...
}
四、结束语
本文着重讨论了用RS-485构成网络系统的基本组网方法,当然在具体的应用中还会有一些变化。由于RS-485具有性能优异、组网简单的优点,它在集中控制系统、分布式控制系统中的应用相当广泛,特别是在要求远距离传输的应用中。由于其硬件电路已比较成熟,设计中的问题主要集中在网络协议和服务软件的设计上。 网络协议是保证通信畅通的关键,在一定程度上也影响着网络通信的可靠性,即它必须能够抵抗实际运作环境的干扰。另外通信只是整个系统中的一个部分,系统还必须完成诸如数据采集和控制的功能。这就要求通信占用尽量少的时间,以求达到整个系统的高效率。在通信数据量一定的情况下,采用较高的波特率当然比较好,但高的波特率必定要降低传输距离,在实际应用中必须仔细衡量。更好的办法就是采用数据压缩算法,在传输前对数据进行压缩,可使通信数据量大大减少,网络效率成倍提高。