多点CAN通信的测试问题

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在规定时间内没有接收到技术应答应该进行重发处理。就不会因为上述原因造成数据丢失!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值