标题: 关于单片机CAN总线有个问题想请教下大家 [打印本页]

作者: 上善若水001    时间: 2022-9-15 19:24
标题: 关于单片机CAN总线有个问题想请教下大家
关于CAN总线有个问题想请教下大家
就是我现在用的是一个主机来控制3个从机。单片机程序流程是主机发送一个广播消息,3个从机接收到消息后执行相关功能,执行完后 3个从机分别给主机发送一个消息证明已经执行完了,然后主机接收完这3个消息后再发一个广播消息,让3个从机继续执行,就这样一直循环。现在的问题是 我把接收消息的程序放到了定时器中断里,10ms读取一次,发现有时候从机就停止执行功能了,我用串口打印的方式查找错误发现是主机这边有时候会接收不到个别从机的数据,但是从机是发送正常的。所以应该是3个从机发送的数据冲突了,导致主机漏掉了数据。我目前的解决办法是让主机接收到哪个从机的数据后就给那个从机发送消息说不用发送了。现实情况是之前的从机偶尔停止情况改善很多,但是还是有,我实在没有办法了,想来求助下大家

1.jpg (92.65 KB, 下载次数: 95)

这是主机

这是主机

2.jpg (72.92 KB, 下载次数: 86)

这是主机

这是主机

3.jpg (110.88 KB, 下载次数: 82)

这是主机

这是主机

作者: 上善若水001    时间: 2022-9-15 19:24
这是从机

5.jpg (108.77 KB, 下载次数: 85)

5.jpg

作者: pcf2000    时间: 2022-9-16 12:38
采用广播的方式发送命令,意味着3从机同时接收到数据,同时执行动作,还有可能同时返回数据,这就会导致总线竞争的,所以要解决好竞争的问题;再一个就是,如果3从机的实时性要求不高,主机可以采取轮询发送命令的方式进行,间隔一定时间轮次发送命令,可以避免总线竞争问题
作者: 圆就是圈圈    时间: 2022-9-16 13:45
这应该是缓冲区的问题,你的缓冲区里边里面应该只能接受一条消息,导致其他消息被顶出了缓冲区或者无人接受
作者: glinfei    时间: 2022-9-16 15:23
我觉得还是总线冲突,反正你运动函数也不返回成功值,不如把从机返回执行命令提前在运动函数前,这样大家基本同时返回值,然后你给每个从机不同延时,这样能减少冲突。还有,也可以在从机发信前,先监听总线是否有信息在发送。反正能用就行,冲突跟干扰一样是不可能彻底解决的。
作者: yzwzfyz    时间: 2022-9-17 09:01
CAN通讯是硬件冲突的,CAN的地址有优先识别,当多路同时发送数据时,地址优先的会抢到总线,直到它发完数据,其它另一个次优先的才能使用总线。
【解决的方案】是:每个设备间隔一段时间发数据就可以了。
间隔多久呢?估算一下,假设4个机子的总数据量一起发完需要T时间,间隔时间>T,就可以了,这是CAN通讯的特长!不必考虑在T时间内,会不会发生冲突。即使你同时发,它也会自动通过硬件,让地址优先的先发,发完后,其它的再发,优先级差的,一定最后发。
也即,CAN数据的真正发送时刻,不是你下达发送命令的时刻,你的命令下达后,只是将数据送入缓冲区,当总线上有空闲时(比你优先的不用了),此刻数据才会被发出。

作者: 上善若水001    时间: 2022-9-17 10:38
pcf2000 发表于 2022-9-16 12:38
采用广播的方式发送命令,意味着3从机同时接收到数据,同时执行动作,还有可能同时返回数据,这就会导致总 ...

感谢老哥的指点了!
作者: 上善若水001    时间: 2022-9-17 10:39
圆就是圈圈 发表于 2022-9-16 13:45
这应该是缓冲区的问题,你的缓冲区里边里面应该只能接受一条消息,导致其他消息被顶出了缓冲区或者无人接受

感谢老哥的指点了!CAN缓冲区有8个字节,我只发了1个,应该不是这里的问题
作者: 上善若水001    时间: 2022-9-17 10:40
glinfei 发表于 2022-9-16 15:23
我觉得还是总线冲突,反正你运动函数也不返回成功值,不如把从机返回执行命令提前在运动函数前,这样大家基 ...

非常感谢老哥的指点!
作者: 上善若水001    时间: 2022-9-17 10:41
yzwzfyz 发表于 2022-9-17 09:01
CAN通讯是硬件冲突的,CAN的地址有优先识别,当多路同时发送数据时,地址优先的会抢到总线,直到它发完数据 ...

厉害!非常感谢老哥的指点,学习了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1