问题描述
我在具有以下操作系统规范的基于 Linux 的设备上运行 python 代码:
NAME=buildroot
VERSION=2020.11.1
此设备使用三线接口(CAN_H、CAN_L、GND)连接到 PLC。
我编写了一个代码,使用 CAN 总线协议向 PLC 发送消息。这是通过 python-can
包完成的。
import can
def send():
#USB interface
#bus = can.interface.Bus(bustype='pcan',channel='PCAN_USBBUS1',bitrate=500000)
#on linux
bus = can.interface.Bus(bustype='socketcan',channel='vcan0',bitrate=500000)
#on windows
#bus = can.interface.Bus(bustype='serial',channel='COM1',bitrate=500000)
msg = can.Message(arbitration_id=0x68005,data=[0x10,0x11,0x12],is_extended_id=True)
try:
bus.send(msg)
print("Message sent on {}".format(bus.channel_info))
except can.CanError:
print("Message NOT sent")
if __name__ == '__main__':
send()
面临的问题是设备没有向 PLC 发送任何数据。这可能是由于为 bustype
和 channel
设置的选项不正确。
任何人都可以建议为具有三个 CAN 线的物理接口提供 bustype
和 channel
什么吗?
解决方法
警告:我不熟悉 python-can 库,但我熟悉 socketcan。
vcan0 是一个虚拟罐通道,您可以设置它以启用应用程序之间的虚拟通信(例如测试)。
实际的 CAN 设备(例如 PCAN-USB)被列为 can0、can1、canX。 请注意,在某些嵌入式系统上,这可能不成立(例如,它可以以 can1 开头)。
编辑:我忘了提到您可以像这样获得所有网络接口的列表,从而包括 CAN 接口:
$ ifconfig -a