CAN总线通信中,如果是多节点通信。多通信中遇到了问题。问题在补充中: 50
通信中,一个作为主机,多个从机。主机首先向从机请求数据(主机发送一次请求数据,每一个从机都需要回数据),在从机回数据后,主机怎么接收啊?...
通信中,一个作为主机,多个从机。主机首先向从机请求数据(主机发送一次请求数据,每一个从机都需要回数据),在从机回数据后,主机怎么接收啊?
展开
展开全部
首先,CAN总线不分主机,最多是整车厂在网络规划的时候定义了一个功能比较多的节点,各家车厂不一样(如网关),或者类似PowerMaster。但是CAN本身协议里是不存在主、从的。
其次,楼上说的仲裁延时的问题,CAN协议本身是考虑到这个问题的,当然按他的方法通过协议延时可以解决,但是既然CAN协议已经给了我们解决方法那肯定是更科学更有效的,具体的去看CAN的仲裁吧,你需要一个节点的报文发送不存在延时,只需要给它分配一个优先级很高的ID即可,当然这得从网络规划的角度出发,不是这么简单说说的。
回到你的问题,你说的主机请求数据,在CAN中只能是远程帧(一个远程标志位为1,数据场为空的帧),当这个帧出现在总线上时,拥有这个ID数据的节点就要发送这个同ID的完整帧(远程帧标志位为0)。但是只能有一个节点接受这个远程帧的请求。
这里强调一个概念,同一个ID的帧只能由一个节点发送,不然可想而知总线上都是冲突。
你补充问一下,你想实现什么效果吧
其次,楼上说的仲裁延时的问题,CAN协议本身是考虑到这个问题的,当然按他的方法通过协议延时可以解决,但是既然CAN协议已经给了我们解决方法那肯定是更科学更有效的,具体的去看CAN的仲裁吧,你需要一个节点的报文发送不存在延时,只需要给它分配一个优先级很高的ID即可,当然这得从网络规划的角度出发,不是这么简单说说的。
回到你的问题,你说的主机请求数据,在CAN中只能是远程帧(一个远程标志位为1,数据场为空的帧),当这个帧出现在总线上时,拥有这个ID数据的节点就要发送这个同ID的完整帧(远程帧标志位为0)。但是只能有一个节点接受这个远程帧的请求。
这里强调一个概念,同一个ID的帧只能由一个节点发送,不然可想而知总线上都是冲突。
你补充问一下,你想实现什么效果吧
追问
那请问您一个问题:如果两个节点同时抢占总线,ID值小的抢占了总线,ID值小的值还会发么?还是被覆盖了 丢失了?
展开全部
读CAN控制器的接收缓冲区的数据即可。注意,要是你下面的节点很多,建议对每一个节点回复数据的时间做一个简单的协议延时(如根据每个从节点的ID来延时),不然总线仲裁的时间会很长,影响通信效率;另外是你的主机处理接收缓冲区的速度要足够快,不然可能会丢数据(总线溢出)。
更多追问追答
追问
我有两个节点:A节点与B节点,他们之间进行通信。A节点有一个发送报文对象send_a和一个接收报文对象receive_a,其send_a的ID为0x000 0000 0000和receive_a的ID为0x000 0000 0001,B节点有一个发送报文对象send_b和一个接收报文对象receive_b,send_b的ID为0x000 0000 0001,receive_b的ID为0x 000 0000 0000。现在的问题是:如果A节点和B节点同时发送信息,则,谁会收到信息,收到信息的先后顺序?其实就是问他们的仲裁机制
追答
地址低(ID小)的数据先发出。
参考资料: pfautoecu.com
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询