嵌入式技术论坛
直播中

goodmbby

8年用户 1208经验值
擅长:处理器/DSP
私信 关注
[问答]

请教各位使用libmodbus作为主机读取输入寄存器的值出错是何原因

请教各位,使用libmodbus作为主机读取输入寄存器的值,一段时间后后,读取错误,使用modbus_set_debug(),发现是接收从机的数据丢失一部分,导致crc错误。从机使用的是modbus slave 工具。

回帖(6)

王浩

2022-9-19 14:21:02
RTU ?有开串口 DMA 吗?
串口丢数很常见,论坛上很多反应串口丢失数据的。这边建议先降低波特率试试,如果有改善就可以钉死是串口驱动处理不过来的问题了。
举报

goodmbby

2022-9-19 14:21:11
嗯,RTU模式,串口没有开DMA,波特率是9600,数据量不大,就是一段时间后就出问题了,在调试信息里面可以看到丢失了从机响应包固定长度的数据,10个字节
举报

goodmbby

2022-9-19 14:21:16
应该说从调试信息上看,接收的从机数据长度跟主机发送的长度一样,但是接收的数据又是从机数据的中间的固定的一部分
举报

王浩

2022-9-19 14:21:30
波特率还行,应该不至于这么严重。
你说从调试信息上看,是在设备这边把 modbus 接收的所有数据在串口终端里打印输出了?
既然能打印出来,说明数据接收完整了的。然后向解析部分传递的过程丢了?

你最后贴出来代码,一个是你说的“从调试信息上看,接收的从机数据长度跟主机发送的长度一样”这个位置的调试信息执行的位置;一个是 crc 错误的位置。找到这两个位置的代码,就可以定位到原因了。
举报

goodmbby

2022-9-19 14:21:44
调试信息两边都有,设备端显示数据发送成功,监控设备的发送数据也是ok的,主机这边是丢失数据
举报

王浩

2022-9-19 14:21:55
先缩小范围,哪边收数据错误了从哪边入手,既然有数据收到,虽然不全,发送丢失的可能性极小。这种接收不全的,多半是接收处理不过来丢了部分数据。

首先确定数据长度对不对,是如果长度不对,逐字节比对发送和接收到的数据,找到什么位置丢失的数据。

如果长度相等,比对中间哪些数据不一样了。从不一样的数据里找找有没有规律。

还有一种可能接收能处理过来,所有数据都接收了,但是接收最后一个字节前,因为意外情况,内存被非法修改了,导致校验的时候出错,这也是一种可能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分