6-9libmodbus从机实验的一个问题



image
在6-9libmodbus从机实验中,按照modbus正常的数据格式发送数据,可以正常回应,如果在数据帧后边随便加入一个数据,设备回复一个响应的包,然后就再也不回应了

在Modbus通信协议中,每个数据帧必须严格遵守规定的格式,包括起始地址、设备地址、功能码、数据长度、数据内容、CRC校验码和结束符。如果数据帧的格式不正确,接收设备(即Modbus从机)将无法正确解析数据,从而导致通信失败。
像你这样在正常的Modbus数据帧后面随意添加一个数据,这将破坏数据帧的完整性,导致从机无法正确解析。

也就是出错后崩溃了,
你可以继续看后面的视频,后面里面增加了容错机制。
即使数据出错,也可以恢复


可能是我表达的不清楚,现在我换另外一种测试的办法,第一张图片是按照modbus数据来正常的发送数据,他可以正常给我返回

我现在改变CRC校验的最后一个数据,正常的是CA,我改成AA,也会导致最后的问题

现在是发送一个错误的数据帧没有返回,然后我再改成正确的数据发送,他也没有返回的数据了

因为我这里是手动发送的,所以帧与帧之间的超时时间可以不用考虑

按照我的理解,就算我在后边加了一个数据,他应该会走到modbus数据校验不通过的部分,然后把这个包丢弃不用,同样的,我更改了crc校验的数据,他也是校验不通过,重新进入准备接收下一帧的状态,但是现在直接就挂掉了。

韦老师我来反馈了,经过测试,我找到了问题的地方,并简单的做了一下处理,但是不确定我这种方式会不会有其他的隐患,还请老师在看一下。
首先,当CRC校验错误的时候,会把errno的状态等于EMBBADCRC,我查看了一下相关的协议,这部分校验出错的时候一般的情况会直接把这个包丢掉,但是在demo中,他会按照如下步骤进行
第一,执行rc = modbus_reply(ctx, query, rc, mb_mapping);


第二,调试执行到如下一行的时候,系统产生了bus fault错误

以下是我修改的部分:


在代码中,我先校验了一下crc的值是不是等于EMBBADCRC,如果是就把它置位,但是我不确定这种方式会不会有其他的隐患,这个置位的操作合不合理

我的疑问:
1,在CRC校验错误的时候,如果需要回复一个包来回应错误,该怎么组包才不会产生总线异常的错误
2,如果不需要回复,那么我把他直接写成0是不是合理的。