Java 使用串行端口打开PDO

Java 使用串行端口打开PDO,java,serial-port,can-bus,canopen,Java,Serial Port,Can Bus,Canopen,我正在努力理解CANopen协议 目前,我没有任何CAN硬件或CANopen堆栈可供试验 我想知道如何编写一个Java程序来简单地解释在RS-232端口接收到的CANopen消息 是否有作为串行端口安装的CAN接口 我能写一个程序来处理CANopen消息吗?我只想能够接收和解释信息。它是否简单到为输入流创建一个缓冲区,然后根据SOF和EOF将传输分解为单独的消息?由于SOF/EOF只有1位长,我如何知道它是什么 为什么对CAN节点的PDO数量有限制 如何处理PDO以识别发送它的节点以及数据类型

我正在努力理解CANopen协议

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

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

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

我不知道有哪个CAN接口连接到串行端口(基于带有CAN和串行端口的微控制器创建一个接口并不难)。但是,标准串行端口速度太慢,无法支持CAN中提供的更高速度

通常,在将API用于CAN接口时,您将能够读取由ID、长度和最多8字节数据组成的消息。您不需要关心SOF/EOF。即使在底层直接与CAN控制器接口(即,如果您有一个需要自己编写驱动程序/API的CAN接口),您仍然不需要关心这些细节。您根本不想在不使用CAN控制器的情况下尝试访问CAN总线

如果你想假装你有一个CAN接口,你可以创建一个存根函数来返回这三项:一个ID,一个数据长度和一个64位数据缓冲区。这基本上就是所有CAN接口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的消息,您将知道这是来自模块ID为0x10的设备的PDO

(表达这一点的一种更简单的方式可能是,TxPDO1的CAN ID设置为0x180+
,TxPDO2的CAN ID设置为0x280+
,等等。)

如何解释PDO中的数据取决于您的设备


我建议你找一个好的CANopen教程。不幸的是,它们中的大多数使一切听起来比实际情况复杂得多。因此,四处看看,直到找到一个看起来可以理解的接口。

有许多CAN接口可以通过串行端口运行—VSCOM、Vector和许多其他接口。还有一些免费的程序可以让你发送和接收原始的罐头框架,比如CANhacker等等,谷歌搜索其中的一些

我还没有找到一个免费的程序来解释CANopen——大多数是付费程序。Linux是个例外——它用来拉入数据包,可以解析所有CANopen帧

我以1Mbit/s的速度运行CAN总线,并使用VSCOM接口在串行端口上对其进行监控

是一个很好的开源堆栈,可以轻松地移植到Linux和裸机上