一、安装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)