自己编写MODBUS协议代码所踩过的坑
串口数据接收完之后,到通过IO口重新使用接收的时间间隔。
在发送完最后一个字节的发送完成中断中,直接将控制IO口使能485芯片的接收。殊不知,由于电容导致的信号延时,串口数据还没有完全发送到总线,485芯片就被置为接收状态,导致最后几个bit的数据误码;
没有正确理解发送完成中断以及发送缓存器空中断之间的差别;
发送完成中断一般是指串口数据已经从移位寄存器从端口送出。但是并不说明已经被送到RS485总线。从MCU的IO口到RS485总线还需要考虑隔离光耦、电容、RS485芯片的延时;
发送缓存器空中断是指腾出了缓存的位置,可以缓存数据。此时,上一个数据可能还在移位寄存器中被紧张有序地按位移出到IO口,此时把RS485芯片置为接收。还正在移位的数据就嗝屁了。
一定要搞清楚选用的中断是发送完成中断还是缓存器空的中断;
在发送中断中,不能立即切为接收,应当延时一段时间,我现在的做法是不管三七二十一,在发送中断中,如果判断为最后一个byte,则延时1.7ms将RS485设置为接收;
不应该启动定时器进行延时,定时器资源很宝贵,应该在100us左右的定时器中断中,通过变量计数来进行1.7ms左右的延时;
MODBUS从设备多少时间会应答
每一个串口数据之间的时间间隔
作为Modbus从设备时,收到数据之后,多少时间应答
来源:头条号-IT自动化交流
赞 (0)