一、安装CAN模块
pip install python-can
pip install python-can[serial]
二、CAN通讯接口选择
1.该对象公开了一个字典,该字典可用于设置 接口和通道。can rc
import can
can.rc['interface'] = 'socketcan'
can.rc['channel'] = 'vcan0'
can.rc['bitrate'] = 500000
from can.interface import Bus
bus = Bus()
2. 还可以为每个 Bus 实例指定接口和通道
import can
bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
bus = can.interface.Bus(bustype='kvaser', channel=0, bitrate=250000)
msg = can.Message(arbitration_id=0x7de, data=[0, 25, 0, 1, 3, 1, 4, 1], is_extended_id=False)
bus.send(msg)
接口名称bustype
名字 | 文档 |
---|
“canalystii” | CANalyst-II |
“cantact” | CANtact CAN接口 |
“etas” | ETAS公司 |
“gs_usb” | Geschwister Schneider 和烛光 |
“iscan” | isCAN卡 |
“ixxat” | IXXAT虚拟通信接口 |
“kvaser” | Kvaser的CANLIB |
“neousys” | Neousys宸曜科技CAN接口 |
“neovi” | 无畏控制系统 neoVI |
“nican” | NI-CAN 美国国家仪器公司 NI-CAN |
“nixnet” | NI-XNET国家仪器NI-XNET |
“pcan” | PCAN基础API |
“robotell” | Robotell CAN-USB接口 |
“seeedstudio” | Seeed Studio USB-CAN分析仪 |
“serial” | CAN over 串行 |
“slcan” | CAN over 串行 / SLCAN |
“socketcan” | SocketCAN接口 |
“socketcand” | socketcand 接口 |
“systec” | SYSTEC接口 |
“udp_multicast” | 组播 IP 接口 |
“usb2can” | USB2CAN接口 |
“vector” | 向量 |
“virtual” | 虚拟 |
三、CAN数据包操作
在CAN通讯中,数据包是最基本的通讯单元。can.Message类就是用来表示CAN数据包。每个数据包都有一个唯一的标识符(ID),用来区分不同的数据包。以下是can.Message类的常用属性和方法。
arbitration_id:数据包ID。
data:数据包的数据,包括0~8个字节。
is_extended_id:ID是否是扩展类型。
dlc:数据包的数据长度。
is_remote_frame():判断数据包是否为远程帧。
is_error_frame():判断数据包是否为错误帧。
is_extended_id():判断数据包ID是否是扩展类型。
is_can_fd():判断数据包是否是CAN-FD类型。
is_error_active():判断错误状态是否为主动错误状态。
is_error_passive():判断错误状态是否为被动错误状态。
四、CAN通讯示例
以下是一个CAN通讯示例程序,用于发送和接收数据包。首先使用can.interface库中的Bus类创建一个CAN总线对象,然后使用send方法发送一个数据包,使用recv方法接收一个数据包。
import can
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=250000)
msg_send = can.Message(arbitration_id=0x7df, data=[0x02, 0x01, 0x0d, 0x55, 0xaa], is_extended_id=False)
bus.send(msg_send)
msg_recv = bus.recv()
print(msg_recv.data)