【jetson】串口通信测试和异常问题排查

📅 2026/7/14 6:31:53 👁️ 阅读次数 📝 编程学习
【jetson】串口通信测试和异常问题排查

本文完成 Jetson 串口收发功能测试,完整记录长报文接收异常故障的排查过程

一、环境说明

  1. 硬件:Jetson Orin Nano 40Pin排针
  2. 系统:JetPack 6.2.2 / L4T R36.5
  3. 串口:/dev/ttyTHS1(硬件UARTA)
  4. 引脚对应
  • Pin8:UART1 TX 发送引脚
  • Pin10:UART1 RX 接收引脚

二、引脚复用配置(启用UART1)

出厂40Pin引脚默认为GPIO,必须切换功能才能使用串口

  1. 打开引脚配置工具
sudo/opt/nvidia/jetson-io/jetson-io.py
  1. 进入40pin配置,将Pin8、Pin10设置为uarta
  2. 保存配置,重启设备生效;
  3. 校验引脚状态,确认复用配置正常
sudocat/sys/kernel/debug/pinctrl/2430000.pinmux/pinconf-groups|grep-A5"uart1"

标准正常输出:

122 (uart1_rx_pr3): pull=2 tristate=1 enable-input=1 open-drain=0 io-reset=0 123 (uart1_tx_pr2): pull=0 tristate=0 enable-input=0 open-drain=0 io-reset=0

注释:RX为输入带上拉,TX为推挽输出,IO无硬件复位,串口硬件通路就绪。

三、硬件接线

1. 自回环测试(自发自收,排除外部设备干扰)

杜邦线直接短接 Pin8 ↔ Pin10,完成串口闭环测试。

2. 外接电脑串口模块测试

Pin8(TX) → 模块RX;Pin10(RX) → 模块TX;共GND。


四、Python串口测试环境部署

依赖安装(推荐系统apt包,稳定无冲突)

sudoaptupdatesudoaptinstallpython3-serial

校验库是否正常导入:

python3-c"import serial; print(serial.__version__)"

实时收发测试脚本 uart_test.py

importserialimporttimedefmain():ser=Nonelast_send_time=0send_interval=1counter=1try:ser=serial.Serial(port="/dev/ttyTHS1",baudrate=115200,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=0)print("✅ 串口打开成功 /dev/ttyTHS1 @115200")print("每1秒自动发送递增数字,实时打印接收数据")whileTrue:current_time=time.time()# 定时发送数据ifcurrent_time-last_send_time>=send_interval:send_data=f"{counter}\n"ser.write(send_data.encode("utf-8"))print("发送:",send_data.strip())counter+=1last_send_time=current_time# 非阻塞读取接收缓存ifser.in_waiting>0:raw_data=ser.read(ser.in_waiting)try:recv_str=raw_data.decode("utf-8").strip()print("实时收到:",recv_str)except:print("原始十六进制数据:",raw_data.hex())time.sleep(0.001)# 降低空循环CPU占用exceptKeyboardInterrupt:print("\n检测到中断,程序退出")finally:ifser:ser.close()print("✅ 串口资源已关闭")if__name__=="__main__":main()

正常接收发送

五、故障现象复现与根因分析

现象1:单包≤7字节,收发完全正常

测试数据:b'123456\n'共7字节

发送长度: 7 字节 发送HEX: 31 32 33 34 35 36 0a 接收长度: 7 字节 接收HEX: 31 32 33 34 35 36 0a ✅ 收发正常

注:硬件FIFO未达到8字节触发阈值,走PIO超时中断,驱动无异常。

现象2:单包≥8字节,接收数据全0损坏

测试数据:b'1234567\n'共8字节

发送长度: 8 字节 发送HEX: 31 32 33 34 35 36 37 0a 接收长度: 8 字节 接收HEX: 00 00 00 00 00 00 00 00 ❌ 数据异常

更长64字节字符串表现一致:前半段全部为0x00,仅末尾不足8字节片段数据正常。

故障根源

L4T R36.5 内置Tegra UART驱动可能存在DMA缺陷:
串口接收FIFO累计满8字节后自动切换DMA批量搬运模式,内核未将DMA缓存数据正常下发至用户态,上层读取到未初始化空内存(全0)。
英伟达官方论坛有关该问题讨论:
https://forums.developer.nvidia.com/t/dma-on-dev-ttyths1-corrupts-receiving-data/369191

两种处理方案

方案1:底层根治

按论坛方式修改设备树,删除UART1serial@3100000节点DMA相关配置,强制串口运行PIO中断模式,彻底消除8字节限制,长短报文均可正常收发。(暂未进行实测验证

方案2:不修改设备树,拆包处理,软件临时兼容方案

对长数据做分包发送,每包最大7字节,包与包之间增加1ms延时,保证硬件FIFO不会积累到8字节,规避DMA异常触发。
缺点:仅适用于可自主控制发送逻辑的场景;外部设备主动下发长报文时,仍会出现数据损坏。

七、总结

  1. 硬件接线、引脚复用配置无误时,短报文串口通信正常;
  2. 单包数据长度≥8字节会触发内核DMA驱动Bug,数据收发全零损坏;
  3. 稳定长期使用推荐修改设备树关闭DMA;不改动系统底层则只能采用7字节分包发送临时兼容。