检测CAN总线中错误的适当方法是什么?

检测CAN总线中错误的适当方法是什么?,c,algorithm,embedded,pic,can-bus,C,Algorithm,Embedded,Pic,Can Bus,我正在与一个电池通信,该电池通过CAN总线协议(J1939)发送数据。我用的是PIC18F26K83。我的目标是在显示器上显示剩余的充电状态。例如,我在60个数组中有值%99,在40个数组中有值%1,然后我将显示%99)。然而,它看起来不是一个可靠的解决方案,因为我不知道我收到了多少垃圾数据。请注意,我不能使用一些错误检测算法,如校验和,因为我无法访问batter中的微控制器,我只能使用接收器端(显示器)。 编辑:我知道CAN总线中存在CRC,但有时它似乎不起作用,因为有时我会收到垃圾。是的,您

我正在与一个电池通信,该电池通过CAN总线协议(J1939)发送数据。我用的是PIC18F26K83。我的目标是在显示器上显示剩余的充电状态。例如,我在60个数组中有值%99,在40个数组中有值%1,然后我将显示%99)。然而,它看起来不是一个可靠的解决方案,因为我不知道我收到了多少垃圾数据。请注意,我不能使用一些错误检测算法,如校验和,因为我无法访问batter中的微控制器,我只能使用接收器端(显示器)。
编辑:我知道CAN总线中存在CRC,但有时它似乎不起作用,因为有时我会收到垃圾。

是的,您可以使用CRC计算,因为通信控制器也会在接收器端计算CRC。例如,这就是检测CRC错误的方法。详细说明:

电池发送完整信息;消息在物理层受到干扰;接收方(您的PIC)接收消息并计算其CRC与消息中包含的CRC标记不匹配; PIC CC将出现REC错误+1,并且不会向电池确认消息

您将在接收器端检测到各种类型的CAN信息错误,但位错误除外,位错误也不相关,因为它将导致信息不完整


基本上,如果消息已损坏(垃圾)
,您不应该依靠收到的CAN消息内容推断电池电量。它在到达PIC的应用层之前被简单地丢弃

“对于其中60个阵列中的99%和40个阵列中的%1,我将使用dipslay 99)”嗯?我不明白你想做什么。我不知道你如何通过编程实现这一点,也不知道你到底想通过编程实现什么,但通过使用CANalyzer(无需升级)工具,你可以分析你在can总线上得到的任何东西。@Lundin例如,我以100的数组大小收集收到的数据。让我们想象一下,我收到了400毫秒的数据99,这使得数组的前40个元素成为99。数组[1],…..数组[40]=99,对于600毫秒长,我接收的所有数据都是1:array[41],…..array[100]=1。在这种情况下,我会认为数据是1,我会显示它。@Joey Mallone显然你应该使用CANanalyser而不是CANalyser:)这些工具有着如此富有想象力的名称。只要给他们打电话就可以了,除非你为Ixxat或Vector工作:)@Lundin,我没有<代码>:),除了我的知识相对于其他非矢量分析工具是有限的。所以,据我所知,CAN协议本身就可以进行这种错误检测。当我收到一条消息时,它已经成功地通过了CRC计算,对吗?正确,CAN协议内置了错误检测和错误处理机制。如果您在应用程序中读取消息负载,这意味着它可以毫无问题地通过较低的层。因此,我没有收到垃圾,它们是实际的数据。是发射机发送了错误的数据。这意味着电池有时发送错误的数据。是的。也许它是另一个消息ID,或者它是一个多路复用的PDU,您只有一种解释。或者简单地说,电池发送一个循环消息,无论是否有信息填充它。