我正在尝试理解CANopen协议。
目前,我没有任何CAN硬件或CANopen堆栈可供试验。
我想知道如何编写Java程序来简单地解释在RS-232端口接收的CANopen消息。
答案 0 :(得分:5)
我不知道任何连接到串口的CAN接口(基于带CAN和串口的微控制器创建一个不太难)。但是,标准串行端口速度太慢,无法支持CAN中可用的更高速度。
通常,在将API用于CAN接口时,您将能够读取包含ID,长度和最多8个字节数据的消息。你不需要关心SOF / EOF。即使直接在低级别与CAN控制器接口(也就是说,如果您有一个CAN接口,您需要自己编写驱动程序/ API),您仍然不需要关心这些细节。而且你根本不想在不使用CAN控制器的情况下尝试访问CAN总线......
如果你想假装你有一个CAN接口,你可以创建一个存根函数,它返回这三个项目:一个ID,一个数据长度和一个64位数据缓冲区。这基本上是所有CAN接口API将为您提供的。在传输CAN消息时,您将使用相同的参数(ID,长度数据)。
PDO是通过使用CAN ID字段来定义的。理论上,设备的PDO数量实际上并不是那么有限,但预定义的连接集仅为每个节点分配了少量(四个)PDO。
PDO是标准CAN帧。如上所述,CAN ID标识PDO。在预定义的连接集(大多数设备遵循)中,所有消息的CAN ID由功能部分和模块ID部分组成(模块ID可以为设备硬编码,或者可以通过拨码开关配置)。 CAN ID的第10-7位是功能代码,位6-0是模块编号。例如,来自模块ID为0x10的设备的TxPDO1将具有CAN ID 0x190。 11位CAN ID的高4位((CAN_ID & 0x780) >> 7)
为您提供功能代码(TxPDO1 = 3),其余位(CAN_ID & 0x7f)
给出模块ID(在本例中为是0x10)。因此,如果您在CAN总线上读取CAN ID为0x190的消息,您就会知道这是来自模块ID为0x10的设备的PDO。
(一种更简单的表达方式可能是说TxPDO1的CAN ID设置为0x180 + <module ID>
,TxPDO2的CAN ID设置为0x280 + <module ID>
等。
如何解释PDO中的数据取决于您的设备。
我建议你找一个好的CANopen教程。不幸的是,他们中的大多数都让一切听起来都比实际上复杂得多。所以环顾四周,直到找到一个看起来可以理解的东西。
答案 1 :(得分:1)
有许多CAN接口可以通过串行端口运行 - VSCOM,Vector等等。还有免费的程序,允许您发送和接收原始CAN帧 - CANhacker等谷歌的一些。
我还没有找到一个可以解释CANopen的免费程序 - 大部分是付费程序。 Linux的例外情况是Wireshark - 它使用SocketCAN来提取数据包并解析所有CANopen帧。
我的CAN总线速度为1 Mbit / s,并使用VSCOM接口在串口上监控。
CANFestival是一个很好的开源堆栈,很容易移植到Linux和裸机。