CANopen PDO使用串行端口

时间:2009-01-13 09:39:25

标签: java serial-port can-bus canopen

我正在尝试理解CANopen协议。

目前,我没有任何CAN硬件或CANopen堆栈可供试验。

我想知道如何编写Java程序来简单地解释在RS-232端口接收的CANopen消息。

  • 是否有作为串口安装的CAN接口?
  • 我是否可以编写程序来处理CANopen消息?我只希望能够接收和解释消息。是否像为输入流创建缓冲区一样简单,然后根据SOF和EOF将传输分解为单独的消息?我怎么知道什么是SOF / EOF,因为它只有1位长?
  • 为什么CAN节点的PDO数量有限制?
  • 如何处理PDO以识别发送它的节点以及数据类型和值? PDO是标准CAN框架吗?

2 个答案:

答案 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和裸机。