Answers:
CAN规范的第6.1节:
位错误:在总线上发送位的单元也监视总线。当监视的位值与发送的位值不同时,必须在该位时间检测到位错误。例外是在仲裁字段的填充位流中或在ACK时隙中发送“隐性”位。
因此,首先发送一个“ 1”而另一个发送“ 0”的节点将注意到一个比特错误,然后通过发送错误标志(见3.1.3节)以正常方式发出错误信号,如正式描述的那样在第6.2节中。
非正式地,如果该节点是错误活动的(应该是通常情况),它将发送6个显性位的错误标志,所有其他节点也将检测到(作为填充错误)。这样会完全破坏该消息:
然后,每个发送器将尝试重新发送-根据重新发送的精确时间,一个可以在另一个之前充分启动,然后再进行总线的增益控制。否则,可能会再次发生相同的顺序。(否则,另一个更高优先级的消息可能会使它们同时退出一段时间!)
扩展的答案受@clabbacchio下面的答案的启发。
您提到了“讨厌的节点”,而clabbacchio提出了一个有效的观点,即如果两个节点在不同的时间发送,则每个接收器都需要决定如何处理其多次接收。
去年的一次黑客攻击就证明了这一点。本文在“ PSCM规范”部分中讨论了攻击者如何与总线上的常规消息同步并在“好” ECU即将发送该消息之前播放其恶意消息。接收方ECU接受较早的消息,更新其消息计数器,然后将“好”消息丢弃为错误消息,因为其消息计数器尚未增加。
在您的问题中,您做出以下假设:
谁拥有那些占主导地位的比特,谁就会被传输。
假设这两个消息是在完全相同的时间发送的,这是更普遍问题的一种特殊情况。Martin的有效答案涵盖了这个特定问题,但是忽略了(更一般的)两个节点在不同时间进行传输的情况。
在这种情况下,将在总线上流通两条具有相同ID但有效载荷不同的消息,并且接收者的逻辑是区分这两条消息并确定是否是他们需要接收的内容。如果他们无法区分这两个消息,则它们可能会误解数据并导致更严重的问题,而不仅仅是错误帧。
例如,说一条消息包含温度传感器的读数,另一条消息包含执行器在同一字节上的目标位置(应该永远不要发生),您可能会让执行器在不知道的情况下将其作为目标。