Jetson AGX Orin串口设备仅可用一次,退出后无法通信求助
Jetson平台Zebra MS4717扫描器退出程序后无法通信的问题排查
问题概况
- 设备:Zebra MS4717条码扫描器,通过USB CDC的SSI协议通信,稳定挂载为
/dev/ttyACM0 - 异常现象:自研程序运行时通信完全正常,但程序退出后,无论是重启自研程序,还是用
screen /dev/ttyACM0 9600、pyserial miniterm工具连接,都无法和扫描器通信,唯一恢复方式是重新插拔设备 - 排除硬件问题:该扫描器在其他电脑上运行无异常,问题出在Jetson平台
- 自研程序使用pyserial的核心代码片段:
import serial serial_port = "/dev/ttyACM0" baud_rate = 9600 with serial.Serial(serial_port, baud_rate, timeout=0.1) as device_serial: device_serial.flush() while True: try: # read a line from the serial port barcode_byte_string = device_serial.readline() if len(barcode_byte_string) > 0: # convert the byte string to a string and strip the newline character barcode = barcode_byte_string.decode("utf-8").rstrip() # publish the barcode to the topic self.publish_barcode(barcode, serial_port) except serial.SerialException as e: # exit with error code 1. This will cause the application to be restarted. sys.exit(1) except Exception as e: break
排查与解决思路
1. 强制串口资源释放,避免异常泄漏
虽然代码用了with上下文管理器理论上会自动关闭串口,但遇到serial.SerialException直接sys.exit(1)可能绕过资源释放流程,导致设备被残留进程占用。
- 修改异常处理逻辑,手动关闭串口并重置信号后再退出:
except serial.SerialException as e: device_serial.dtr = False device_serial.rts = False device_serial.close() sys.exit(1) except Exception as e: device_serial.dtr = False device_serial.rts = False device_serial.close() break
- 退出程序后,用
lsof /dev/ttyACM0命令检查是否有残留进程占用串口,存在的话用kill -9 <进程ID>强制终止。
2. 重新加载USB CDC驱动
Jetson的USB CDC驱动可能存在设备状态异常问题,无需插拔设备,尝试重新加载驱动恢复:
sudo rmmod cdc_acm sudo modprobe cdc_acm
可以将这两行命令做成脚本,快速恢复通信,验证是否为驱动层面的问题。
3. 调整串口控制信号
部分USB串口设备会根据DTR/RTS信号状态切换工作模式,程序退出时如果这些信号未恢复默认状态,设备可能进入休眠或不可用状态,在代码退出前手动重置这些信号(如上面代码修改示例)。
4. 检查系统权限与串口锁定
- 确认当前用户拥有
tty和dialout组权限,运行groups查看,没有的话执行:
sudo usermod -aG tty,dialout $USER
- 检查
/var/lock目录下是否存在对应串口的锁定文件,若有则删除后尝试重新连接。
内容的提问来源于stack exchange,提问作者mihien
相关产品推荐
相关产品推荐

