最近有一个项目,需要读取9个表测量值,每个表都支持485通信,而一般PC并没有这么多串口,所以采用485总线形式,一主多从,读取各个表测量值。
我是一个初学者,在这里总结记录一下,若有不足之处,请大家多多补充,互相学习进步。
先简单介绍下RS485通信,对于初学者这些知识点容易疏忽。
-
常用RS485总线为两线制,半双工。
即串口某一刻只能做一件事,收数据或者发数据,收发数据不能同时 -
传输时间
RS485串口使用前要设置波特率,比如9600bps,那么发送一个8字节的指令,需要
8X8/9600X1000=6.67ms
测量表返回一个21字节内容需要:21X8/9600X1000=17.5ms
所以使用485总线发送指令时,中间要间断一段时间,这个时间除了发送字节时间外,还包括测量表反应时间等其他时延,这个可以通过做实验测出。即主机自发送一条读指令到完整接收从机返回内容间时间。 -
RS485总线采用轮询方式依序读取
以一主八从为例,主机每隔一段时间发一次指令,比如50ms,这个50ms包括主机发送指令时间和接收从机返回内容时间。即主机接收完一个从机数据再发下一条指令,而不是只管发,不等收。可以把两线(AB)比作独木桥,同一时间只能一个方向人过,如果主机发送指令时间间隔短 ,势必会与从机返回数据发送碰撞。 -
Modbus-RTU 协议
目前大部分RS485总线传输协议都是Modbus-RTU 协议,具体协议内容网上很多,这里不再详述。
这里讲一下CRC校验码,CRC校验码是由前面数据计算得来,当从机地址发生改变时,指令CRC校验码需要重新计算。网上有在线CRC计算,很快。