多点CAN通信的测试问题

    xiaoxiao2021-03-25  158

    CAN总线上单片机与服务器双向通信,服务器发一次数据等待单片机响应,响应完成继续发送,没有响应等待1秒再次发送;单片机向服务器发送数据同理。CAN总线上共三个节点:STM32+CAN收发器组成的设备1与设备2还有以太网转CAN模块。

    问题描述:

    设备1、设备2、以太网转CAN模块进行频繁的数据通信,但测试次数一多容易出现如下问题:设备1向以太网转CAN模块发送1帧数据,根据程序显示明明已经发送成功了,但是在服务器端却没有收到这帧数据,导致总线上产生丢包问题。

    思考过程:

    在CAN的通信过程中有一个成功接收应答位ACK,当STM32通过CAN发送1帧数据时,是根据其它节点返回的ACK位来判断是否发送成功的。以我的理解,原本以为当设备1发送1帧数据时,只有可以过滤出设备1的ID号的设备才会返回这个ACK接收应答。所以,这就搞不明白了,如果是这样那么接收端明显已经接受到了这帧数据才会返回的ACK位,为什么在接收端所有的接收数据中却没有这帧数据?数据到哪里去了?

    问题答案:

    经过领导解答才明白原来并不是只有过滤出设备1 ID号的设备才会接收并返回ACK应答,而是总线上的任意一个设备都可以接收到这帧数据并返回ACK,这是在底层完成的,还没有到达ID号过滤这层操作。当设备1发出数据检测到返回的ACK应答后这个数据帧就结束了,信息已经发送成功。所以当总线上的数据交流比较频繁时,就会出现数据丢包的情况,当设备1发送1帧数据到总线上,目标是被以太网转CAN模块接收,但是此时以太网转CAN模块正在忙别的事情没有接收到数据,而这帧数据却被设备2接收到了,所以设备2返回了一个ACK应答,当设备2进行数据过滤时发现这不是发给自己的数据所以丢弃处理。而此时设备1因为接收到了ACK返回,所以提示数据发送成功。这就造成数据已经成功发送到总线上,而接收端却没有接收到这帧数据的问题。

    解决方案:

    在CAN总线上的数据交换过程中,不能以CAN协议中的ACK应答位为判断标准,而是要自己在上层协议中添加判断,比如设备1向设备2发送一帧数据,设备2接收到这帧数据后要进行技术应答,当设备1接收到技术应答后这帧数据才算完成。如果设备1在规定时间内没有接收到技术应答应该进行重发处理。就不会因为上述原因造成数据丢失!

    转载请注明原文地址: https://ju.6miu.com/read-1350.html

    最新回复(0)