使用python-can结合SLCAN接收CAN报文少量后卡顿问题求助
SLCAN适配器通过python-can接收报文卡顿,仅少量报文后无响应?
问题描述
使用SLCAN适配器接收CAN报文时,python-can模块仅能接收少量报文后出现卡顿,但通过串口终端手动发送SLCAN命令时工作完全正常。尝试过官方的receive_all.py示例及asyncio示例,初始化代码如下:
with can.Bus(interface="slcan", channel="COM15@115200", bitrate=500000) as bus:
程序输出少量报文后立即卡顿:
Bouncing 100 messages... Timestamp: 1678807742.127211 ID: 0bb00c02 X Rx DL: 4 44 1c 00 00 Timestamp: 1678807742.128206 ID: 01408000 X Rx DL: 8 90 2c f5 0b 07 11 80 10 Timestamp: 1678807742.128206 ID: 1a3c82f2 X Rx DL: 2 02 00
卡顿后退出程序并重启,偶尔会一次性输出大量积压的CAN报文。怀疑问题出在PySerial层面。
环境信息:
- 操作系统:Windows 10
- Python:3.11.2
- Python-can:4.1.0
- Pyserial:3.5
已重新安装所有依赖模块,且SLCAN适配器本身经串口终端验证工作正常。
可能的原因及解决办法
1. PySerial串口参数配置不合理
python-can的slcan后端默认的PySerial配置可能不匹配你的适配器,比如缓存过小、超时时间过长导致阻塞。可以手动指定串口参数,尤其是硬件流控和超时时间:
import can from serial import Serial # 手动配置串口,启用硬件流控并缩短超时 serial_port = Serial( port="COM15", baudrate=115200, timeout=0.1, write_timeout=0.1, rtscts=True, dsrdtr=True ) # 将配置好的串口传入slcan总线 with can.Bus( interface="slcan", channel=serial_port, bitrate=500000 ) as bus: for msg in bus: print(msg)
2. python-can版本兼容性问题
部分旧版本的python-can对slcan报文的解析存在阻塞逻辑,尝试升级到最新版本:
pip install --upgrade python-can
如果适配器支持,也可以尝试切换到slcan.socketcan接口(需要适配器支持SocketCAN协议)。
3. Windows串口驱动或硬件兼容性问题
Windows下的虚拟串口常存在延迟或缓存问题,可尝试以下操作:
- 更换USB端口,优先使用USB 2.0端口(部分SLCAN适配器对USB 3.0兼容性差)
- 更新适配器的USB串口驱动到最新版本
- 打开设备管理器,找到对应串口→右键属性→端口设置→高级,将“延迟时间”调整为最低值
4. 同步接收逻辑导致的阻塞
如果使用同步接收方式(如bus.recv()无超时),长时间阻塞会导致串口缓存溢出。改用带短超时的接收逻辑,避免程序卡死:
import time import can with can.Bus(interface="slcan", channel="COM15@115200", bitrate=500000) as bus: while True: # 设置短超时,避免阻塞 msg = bus.recv(timeout=0.01) if msg: print(msg) # 给系统留出处理串口缓存的时间 time.sleep(0.001)
内容的提问来源于stack exchange,提问作者HenkJanSnot
相关产品推荐
相关产品推荐

