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