1引言
rs-485由电子工业协eia(electronics?industry?association)于1983年制定。它具有了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为tia/eia-485-a标准。
rs-485采用平衡发送和差分接收,具有抑制共模干扰的能力。其传输时的电气协议规定:当a线的电压低于b线时,传送的是信号1,当a线的电压高于b线时,传送的是信号0。a线和b线能承受的共模信号为-7v~ 12v,这里讲的共模信号是指a线或b线对地的电压。一个标准发送器能够直接驱动几个接收器,且发送器可以被关闭使其输出端变成高阻,因此只需2条连线既可实现一个半双工的通信网络。rs-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。
2硬件电路和通信时序
由rs-485组成单主机-多从机的集散式控制系统的简图如图1所示。
图1rs-485总线的结构图
对于单片机异步通信,除了直接连接tx和rx端外,不同于rs-232通信协议,rs-485一定要用单片机的一个i/o引脚负责数据接收或发送方向的控制。用rs-485协议组成的主从通信方式中,所有的通信由一个主机掌控,其它所有从机平时处于接收模式,一旦某一个从机被主机呼叫,就将其通信状态改成为发送模式,待数据发送完毕后又转为接收模式。系统硬件连接电路原理图如图2所示。
图2系统硬件连接原理图
2.1上位机主控端
由于上位机上只有传统的9针d型串口,要和多个下位机节点组成数据通信网络,需要将rs-232通信协议转换,rs-485协议方式,需要用到max232和max485芯片各一块,其电路原理图如图3所示。
图3rs-232到rs-485的电平转换图
rs-232-485转换器主要包括了电源、rs-232电平转换、rs-485电平转换三部分。该电路的rs-232电平转换电路使用了市场上常见的max232集成电路,rs-485电平转换电路采用了max485集成电路。为了使用方便,电源部分设计成无源方式,整个电路的供电直接从pc机的rs232接口中的dtr(4脚)和rts(7脚)取出。pc串口每根线可以提供大约9ma的电流,因此两根线提供的电流就足够供给本电路使用。经实验,本电路只使用其中一条线也能够正常工作。使用本电路需注意pc程序必须使串口的dtr和rts输出高电平,经过d3稳压后得到vcc,经过实际测试,vcc电压大约在4.7v左右。因此,电路中要说d3起的作用是稳压和限压功能。
max485是通过两个引脚re(2脚)和de(3脚)来控制数据的输入和输出。当re为低电平时,max485数据输入有效;当de为高电平时,max485数据输出有效。在半双工使用中,通常可以将这两个脚直接相连,然后由pc或者单片机输出的高低电平就可以让max485在接收和发送状态之间转换了。由于本电路dtr和rts都用于了电路供电,因此使用tx线和max232的另外一个通道及ql来控制max485的状态切换。平时max232的9脚输出高电平,经ql倒相后,使max485的re和de为低电平而处于数据接收状态。当pc机发送数据时,max232的9脚输出低电平,经ql倒相后,使max485的re和de为高电平而处于数据发送状态。
2.2下位机从动端
pic16f877单片机具有一个通用同步异步接收发送器usart,又名串行通讯接口(sci),可工作于全双工异步工作模式和半双工同步工作模式,它是一种利用portc口的rc6和rc7两个引脚作为通讯的两线制串行通讯接口。为了把portc口的rc6和rc7两个引脚分别设置成串行通讯接口的发送(tx)脚和接收(rx)脚,必须要把usart的接收状态和控制寄存器tcsta的bit7(spen)位和trisc寄存器的bit7置1,把trisc寄存器的bit6置0。为了使usart分别工作于接收或发送状态,就必须设置相应的状态寄存器和控制寄存器。
usart发送器和接收器在功能上是完全独立的,要使usart工作在异步通讯方式,它们所用的数据格式和波特率就必须是相同的。这里使用常用的格式:波特率9600,无校验,8个数据位,1个停止位。
在编写程序时首先要设置好usart异步通讯模块工作模式及相关寄存器,主要有以下模块寄存器:txsta(数据发送控制及状态寄存器),rcsta(数据接收控制及状态寄存器),spbrg(波特率控制寄存器),intcon、piei、piri(相关的中断控制寄存器),txreg(串行数据发送寄存器),tcteg(串行数据接收寄存器)。
在pic单片机中,决定usart通信波特率高低的,只有spbrg寄存器和txsta寄存器中的bgrh位,不占用任何其它定时器资源。波特率发生器的工作时钟取自于单片机主振荡器的振荡频率输出,通过设置spbrg寄存器和bgrh控制位对振荡频率分频,最后产生所需的波特率值。
当brgh=0时,为低速波特率发生方式;brgh=1则产生高速波特率。这里使用高速波特率,因为这样可以减少与标准波特率值的误差。异步通信告诉波特率的计算方法如下:若单片机的工作振荡频率为fosc,,spbrg寄存器值为x,则高速波特率的计算公式为:
(1)
在设计过程中,我们一般是先选定需要得到的波特率,然后计算spbrg的设定值x,变换式(1),即得:
(2)
异步通信波特率设定时得注意事项:当选用标准波特率时,如果一味追求一步通信时波特率的准确度,那就应该选择11.0592mhz作为单片机的工作振荡频率。但其实大可不必如此计较。异步通信允许波特率存在一定的偏差,只要偏差值在士3%之内就可以保证正常通信,所以对于常用的1200bps~9600bps波特率的设定,可选的振荡频率可以有很多种,用户完全可以根据自己所设计系统的其他功能要求而兼顾选择振荡频率。使得单片机的振荡频率越低,功耗就越小,系统抗干扰能力也越强。另外,对于所选的波特率如果既可以用低速方式又可以用高速方式时,在程序中应尽量选择高速方式,这样得到的实际波特率误差相对较小。
2.3通信时序
由于rs-485通信是一种半双工通信,发送和接受共用同一物理通道,在任意时刻只允许一台单片机处于发送状态,因此要求应答的单片机必须在侦听到总线上呼叫信号己经发送完毕,并且在没有其他单片机应答信号的情况下才能应答。如果在时序上配合不好,就会发生总线冲突,使整个系统的通信瘫痪,无法正常工作。上位机与下位机之间如何进行数据传输,怎么提高通信的效率和可靠性,以及对通信过程中的故障处理,帧格式的约定,都需要一套详尽的通信协议。
由于rs-485标准只制定了物理层电气标准,对上层通信协议没有规定,这给设计者提供了很大的灵活性。一套完整的通信协议既要求结构简单,功能完备,又要求具有可扩充性与兼容性,并且尽量标准化。
3报文通信时的简单协议
slip(serial?line?intemet?protocol)协议是串行线路网际协议,它是最早的、也是仅有的两个串行ip协议之一。它实现了在串行通信线路上运行tcp/ip协议及其应用服务的功能,为用户上网提供了拨号ip模式。这里由它派生出改进协议:
(1)发送数据时的报文组装
●取一个关键字0x55,一个报文的传输以0x55为引导,中间可以有任意多的字节数,最后以0xaa结束一个报文。关键字0x55和0xaa不参与检验和运算。
●如果传输的原始数据中含有0x55,则将其替换成0xff 0x05,求校验和时仍按一个0x55计算。
●如果传输的原始数据中含有0xaa,则将其替换成0xff 0x0a,求校验和时仍按一个0xaa计算。
●如果传输的原始数据中含有0xff,则将其替换成0xff 0x00,求校验和时仍按一个0xff计算。
●其余数据原样发送。
例如:当有0x55、,0x5a,0xaa,0xas,0xff这5个字节数据需要发送时,加上它们的算术校验和0xfd,原始数据总共6个字节。按上述方法整合成的一个报文为:0x55,0xff,0x05,0x5a,0xff,0x0a,0xas,0xff,0x00,0xfd,0xff,总共11个字节。
(2)接收数据时的报文解读
接受方将接收所有的数据并存入数组,主程序从数组中逐个取出数据并进行解读,其过程如下:
●等待出现第一个0x55,以判断一个数据包的开始。一旦读到0x55,立即进行一个报文接收的初始化工作,包括数组单元清0,字节计数器清0等工作。
●从队列中读取一个数据,如果不是0x55、0xaa或0xff,则直接将数据存入数组。
●如果读到0xff,则继续读其下一个数据,若是0x05,则替换回原始数据0x55;若是0x0a,则替换回原始数据xaa,若是0x00,则替换回原始数据0xff。若都不是,则数据传输出错。
●当读到xaa时,一个报文结束,关串口接收中断,串口中断流程图如图4所示。
图4接收数据帧时的串口中断流程图
4结论
本文作者创新点:在多mcu之间中长距离通信的诸多方案中,rs-485因硬件设计简单、控制方便、成本低廉等优点。本文完成了基于rs-485的单主机一多从机的集散式控制系统的设计,包括上位机主控端与下位机从动端,并详细分析了其通信时序。
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』