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