首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用串口的CANopen PDO

使用串口的CANopen PDO
EN

Stack Overflow用户
提问于 2009-01-13 09:39:24
回答 2查看 3.5K关注 1票数 3

我正在努力理解CANopen协议。

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

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

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

回答 2

Stack Overflow用户

发布于 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教程。不幸的是,它们中的大多数使一切听起来比实际情况复杂得多。所以,四处看看,直到你找到一个似乎可以理解的。

票数 6
EN

Stack Overflow用户

发布于 2014-10-04 03:17:55

有许多可以运行串行端口的CAN接口-- VSCOM、Vector和许多其他接口。也有免费的程序,允许您发送和接收原始的CAN帧- CANhacker等。谷歌为其中一些。

我还没有找到一个可以解释CANopen的免费程序--大多数都是付费程序。例外是Linux的Wireshark -它使用SocketCAN来提取数据包并可以解析所有的CANopen帧。

我运行CAN总线1 Mbit/s,并使用VSCOM接口在串口上监视它。

CANFestival是一个很好的开源堆栈,它可以很容易地移植到Linux和裸机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/438458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档