简介
CAN是控制器局域网(Controller Area Network, CAN)的简称,CAN属于总线是串行通信网络
汽车CAN线的存在形式
汽车上有两种CAN线,高速CAN和低速CAN
每组CAN线由一组双绞线组成,CAN线的传输速度与线长有关,40m以内可以以最高速度1Mbps的速度传输
高速CAN(CAN_H): 125kbps-1Mbps
低速CAN(CAN_L): 5kbps-125kbps
隐形信号时,CAN_H和CAN_L的电压都为2.5V,为信号1。显性信号时,CAN_H电压为3.5V,CAN_L电压为1.5V,为信号0
can通信
数据帧(Data Frame):CAN通信使用数据帧进行信息传递。 数据帧是由数据域、标识符、控制域、CRC校验码和一些其他字段组成的。 其中,数据域是实际携带数据的部分,可以包含0至8个字节的数据
标识符(Identifier):标识符是数据帧的主要组成部分,用于标识数据的类型和发送源。 标识符可以区分不同的消息,使得多个设备可以同时在同一总线上进行通信,实现数据的分类和发送源的识别
控制域(Control Field):控制域是数据帧的一个字段,用于控制CAN网络中节点的行为。 其中包括数据的位数(如11位标准帧和29位扩展帧)、数据帧类型(如数据帧和远程帧)以及一些其他的控制信息
CRC校验码(Cyclic Redundancy Check):CRC校验码是用于检测数据帧传输过程中是否发生了错误的校验码。 接收方在接收数据帧时,通过计算数据域和CRC校验码的校验结果,可以判断数据帧是否出错
一、安装CAN模块
pip install python-can
# 许多接口可以同时安装其依赖项python-can,例如接口serial包含pyserial可以使用serial额外安装的依赖项:
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
# USB转CAN 通讯接口常用的驱动库是PEAK,需要先安装,然后使用PEAK驱动库提供的接口进行通讯操作
bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
# PCI-CAN 通讯接口常用的驱动库是Kvaser,需要先安装,然后使用Kvaser驱动库提供的接口进行通讯操作。以下是一个简单的示例程序。
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类的常用属性和方法。
# 1. 属性
arbitration_id:数据包ID。
data:数据包的数据,包括0~8个字节。
is_extended_id:ID是否是扩展类型。
dlc:数据包的数据长度。
# 2. 方法
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)