USB CDC串口转 CAN
本协议用于 USB CDC串口协议收发经典 CAN 报文,为变长协议,支持标准帧和扩展帧,单帧数据区最大 8 字节。CAN FD 请使用 USB CDC串口转 FDCAN。
如果在 Linux 上使用 SocketCAN,请参考 SocketCAN / gs_usb。SocketCAN 不使用本页的 ST / ET 帧头。
USB CDC串口转 CAN 报文均以 0x0D 0x0A 结尾。
经典 CAN 波特率使用 AT+SETFDCAN=<arb_baud>,<data_baud> 中的 arb_baud。data_baud 只用于 CAN FD 数据段,不影响经典 CAN。
协议格式
类型 |
帧格式 |
|---|---|
经典 CAN 扩展帧 |
|
经典 CAN 标准帧 |
|
字段说明
字段 |
说明 |
|---|---|
|
ASCII |
|
ASCII |
|
|
|
29 bit 扩展帧 CAN ID,放在 4 字节字段低 29 bit |
|
11 bit 标准帧 CAN ID,放在 2 字节字段低 11 bit |
|
标准帧保留字段,固定 |
|
数据长度编码,取值 |
|
CAN 数据,长度由 |
|
报文尾 |
经典 CAN 的“数据长度编码”,字段范围 0x00~0x08。
编码字段值 |
真实数据长度 |
|---|---|
|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
扩展帧示例
帧头 |
Channel |
CANID |
Len |
Data |
帧尾 |
|---|---|---|---|---|---|
|
|
|
|
|
|
标准帧示例
帧头 |
Channel |
Reserved |
CANID |
Len |
Data |
帧尾 |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
Python 示例
完整代码样例请参考 usb2can_cybergear_sine_demo_v6.py
TAIL = bytes([0x0D, 0x0A])
def build_usb_can_ext(channel: int, can_id: int, data: bytes) -> bytes:
if not 0 <= can_id <= 0x1FFFFFFF:
raise ValueError("extended CAN ID must be 0..0x1FFFFFFF")
data = data[:8]
return (
bytes([0x45, 0x54, channel & 0xFF])
+ can_id.to_bytes(4, "big")
+ bytes([len(data)])
+ data
+ TAIL
)
def build_usb_can_std(channel: int, can_id: int, data: bytes) -> bytes:
if not 0 <= can_id <= 0x7FF:
raise ValueError("standard CAN ID must be 0..0x7FF")
data = data[:8]
return (
bytes([0x53, 0x54, channel & 0xFF, 0x00, 0x00])
+ can_id.to_bytes(2, "big")
+ bytes([len(data)])
+ data
+ TAIL
)