Jetson Xavier NX使用pyserial读取RS232称重终端返回乱码如何解决
排查与解决步骤
1. 排除系统默认串口参数干扰
你在Jetson端运行代码前,先手动通过stty命令强制设置串口参数,避免内核驱动默认配置覆盖你代码里的设置:
stty -F /dev/ttyUSB0 9600 cs8 -cstopb parenb -parodd
上述参数对应你代码里的配置:9600波特率、8数据位、1停止位、偶校验。设置完成后先直接用cat /dev/ttyUSB0测试,看返回是否正常。
2. 排查USB转RS232芯片驱动兼容性问题
你用的是USB转RS232转接板的话,JetPack 4.5对应的旧版本内核里,CH340/CH341系列芯片的驱动存在偶校验处理错误的已知bug,正好和你的现象匹配:硬件、代码都一致,只有arm64平台返回乱码。
首先用lsusb命令查看你转接板的芯片型号:
- 如果是CH340/CH341芯片,有两种解决方法:
- 优先换用FT232系列芯片的转接板,该系列驱动在arm架构下兼容性极高,不会出现奇偶校验处理异常的问题
- 升级JetPack版本到4.6及以上,新版本内核已经修复了CH341驱动的奇偶校验bug
- 如果是其他芯片,可尝试搜索对应芯片arm64架构的最新驱动重新编译安装
3. 关闭串口占用服务
Ubuntu默认开启的ModemManager服务会自动扫描串口发送AT指令,会干扰普通串口数据的读取,先临时停止该服务测试:
sudo systemctl stop ModemManager
测试正常后如果需要永久关闭,可执行:
sudo systemctl disable ModemManager
4. 确认串口参数生效
可以在你的pyserial代码打开串口后,增加一行打印串口配置的逻辑,对比Jetson和x86设备上的参数是否完全一致:
print(ser.get_settings())
如果参数存在差异,说明驱动不支持你设置的参数,需要更换转接板或驱动。
内容的提问来源于stack exchange,提问作者Максим
相关产品推荐
相关产品推荐

