CAN 总线从两个主设备均衡发送数据
CAN bus sending data from two masters with equal balance
我有两个主节点连接到同一个 CAN 总线,都向我的 PC 发送数据。
第一个主控 ID = 0xFFA1
第二个主 ID = 0xFFA2
由于第一个主机 ID 低于第二个,因此它比第二个主机更能控制总线。这会导致数据出现一些延迟。
有没有办法在两个节点之间进行负载均衡,使每个节点发送的消息量几乎相等。
我试着让第一个节点发送数据,同时在两个ID 0xFFA1和0xFFB2之间切换,
第二个节点发送ID为0xFFB1的数据。但这并没有帮助。
在 CAN 中没有 "masters" 这样的东西,在像 CANopen 这样的高层协议中也没有(CANopen 中的 "master" 只是一个管理节点)。谁可以发送由 CAN 标识符定义的内容 - CAN 主要关注数据,而不是节点。重要的是 发送了什么,而不是 谁 是 sending/receiving,因为每条消息都会被广播。
听起来好像您有 2 个节点在总线上疯狂地发送标识符为 0xFFA1 和 0xFFA2 的垃圾邮件,尽可能快地发送,导致 100% 的总线负载。那么发送0xFFA2的节点就会"starve"。发送数据 "as fast as you are able" 永远不是使用 CAN 的正确方法。
相反,您需要定义一个指示实时特性的更高层协议。在控制系统中,这最常见的做法是让节点以固定的时间间隔发送数据,例如每 10 毫秒或 100 毫秒一次。仅此一项就可以解决您的饥饿问题。
如果你想阻止节点同时发送,那么你可以提供一种方法让它们同步。 CANopen 和其他协议中使用的一个技巧是让一个节点以给定的固定时间间隔发送 "sync" 消息。
读取此同步消息后,所有节点应在收到消息后的 x 毫秒内采取行动。
我有两个主节点连接到同一个 CAN 总线,都向我的 PC 发送数据。
第一个主控 ID = 0xFFA1 第二个主 ID = 0xFFA2
由于第一个主机 ID 低于第二个,因此它比第二个主机更能控制总线。这会导致数据出现一些延迟。
有没有办法在两个节点之间进行负载均衡,使每个节点发送的消息量几乎相等。
我试着让第一个节点发送数据,同时在两个ID 0xFFA1和0xFFB2之间切换, 第二个节点发送ID为0xFFB1的数据。但这并没有帮助。
在 CAN 中没有 "masters" 这样的东西,在像 CANopen 这样的高层协议中也没有(CANopen 中的 "master" 只是一个管理节点)。谁可以发送由 CAN 标识符定义的内容 - CAN 主要关注数据,而不是节点。重要的是 发送了什么,而不是 谁 是 sending/receiving,因为每条消息都会被广播。
听起来好像您有 2 个节点在总线上疯狂地发送标识符为 0xFFA1 和 0xFFA2 的垃圾邮件,尽可能快地发送,导致 100% 的总线负载。那么发送0xFFA2的节点就会"starve"。发送数据 "as fast as you are able" 永远不是使用 CAN 的正确方法。
相反,您需要定义一个指示实时特性的更高层协议。在控制系统中,这最常见的做法是让节点以固定的时间间隔发送数据,例如每 10 毫秒或 100 毫秒一次。仅此一项就可以解决您的饥饿问题。
如果你想阻止节点同时发送,那么你可以提供一种方法让它们同步。 CANopen 和其他协议中使用的一个技巧是让一个节点以给定的固定时间间隔发送 "sync" 消息。 读取此同步消息后,所有节点应在收到消息后的 x 毫秒内采取行动。