大家在做 485 通信的时候,一般采用什么软件协议,是自定义的协议还是直接用 MODBUS?
我们这里是做工业产品的,数字电源和采集板之类的,用 485 通信比较多。
现在大多采用两种通信协议,自定义通信协议或 MODBUS 通信协议,感觉 MODBUS 通信协议很不好用,主要体现在以下几个方面:
1,ASC2 模式时,一个 16 位数据将被分成 4 个 8 位数发送,这不仅浪费宽带,还给发送接收增加额外的逻辑
2,RTU 模式时,数据包用 CRC 校验验证数据的正确性,CRC 给低端 8 位 CPU 带来压力。数据包与数据包之间要相隔传送 3.5 个字节(可能是位)以上的时间,否则不认为这里是两个数据包的分界,当总线上不停的有数据在传送时,下位机要准确的判断两个数据包的分界,需要宝贵的实时处理能力。当波特率为 57600 时,3.5 字节的传送时间仅为半毫秒。我们可以自己约定据包之间的时间间隔大于 20ms 来解决这问题,但这样与通用设备通信时有丢包的风险。
3,modbus 可能出现得太早(1979),它的数据收发是以字节(8位数)为单位处理的,而我们当前使用的数据以 16位数为主,它的字节个数不是偶数个,难以在底层把它们拼接成 16 位数。我们在读取发送数据时,要关心读取到的缓冲区和发送出去的缓冲区的各个字节所代表的意义,像在写汇编,需要消耗更的的脑力,体验不好,出错的风险成倍增加。
4,modbus 用在工控行业,他们的固定常用命令我们没几条用得上。
5,modbus 不适用于做 DSP 的 bootloader。DSP 的 bootloader 必需运行于 ram 中,运行代码要越短越好。
大家有没有人研究替代 MODBUS 的通信协议?希望达到以下要求:
1,有包头包尾,更容易区分数据包
2,有校验,不能通过校验的数据包舍弃
3,有地址,地址为 0 时是广播命令,所有从机接收到后都认为是对自己的命令,地址不为 0 时是一对一命令。
4,有握手,从机对非广播命令做出响应
5,能发送完整的数据,也就是数据包有包头(EE)、包尾(EF)两个字节,数据包中间还是允许出现包头包尾字节。
6,在底层收发容易加工,单片机运算没有压力。
7,要有更好的数据结构,所有数据底层可以统一加工成 16 位数据格式,软件调用时,访问的是 16 位数据的数组或结构体。底层发送接收的,是以 8 位数据为最小单位的,大多数据串口都是这样的。
8,不容易出错,在 128 个节点的网络中,主机要可靠的通信到特定从机。有硬件干扰时,可以重试通信。
|