本文完成 Jetson 串口收发功能测试完整记录长报文接收异常故障的排查过程一、环境说明硬件Jetson Orin Nano 40Pin排针系统JetPack 6.2.2 / L4T R36.5串口/dev/ttyTHS1硬件UARTA引脚对应Pin8UART1 TX 发送引脚Pin10UART1 RX 接收引脚二、引脚复用配置启用UART1出厂40Pin引脚默认为GPIO必须切换功能才能使用串口打开引脚配置工具sudo/opt/nvidia/jetson-io/jetson-io.py进入40pin配置将Pin8、Pin10设置为uarta保存配置重启设备生效校验引脚状态确认复用配置正常sudocat/sys/kernel/debug/pinctrl/2430000.pinmux/pinconf-groups|grep-A5uart1标准正常输出122 (uart1_rx_pr3): pull2 tristate1 enable-input1 open-drain0 io-reset0 123 (uart1_tx_pr2): pull0 tristate0 enable-input0 open-drain0 io-reset0注释RX为输入带上拉TX为推挽输出IO无硬件复位串口硬件通路就绪。三、硬件接线1. 自回环测试自发自收排除外部设备干扰杜邦线直接短接 Pin8 ↔ Pin10完成串口闭环测试。2. 外接电脑串口模块测试Pin8(TX) → 模块RXPin10(RX) → 模块TX共GND。四、Python串口测试环境部署依赖安装推荐系统apt包稳定无冲突sudoaptupdatesudoaptinstallpython3-serial校验库是否正常导入python3-cimport serial; print(serial.__version__)实时收发测试脚本 uart_test.pyimportserialimporttimedefmain():serNonelast_send_time0send_interval1counter1try:serserial.Serial(port/dev/ttyTHS1,baudrate115200,parityserial.PARITY_NONE,stopbitsserial.STOPBITS_ONE,bytesizeserial.EIGHTBITS,timeout0)print(✅ 串口打开成功 /dev/ttyTHS1 115200)print(每1秒自动发送递增数字实时打印接收数据)whileTrue:current_timetime.time()# 定时发送数据ifcurrent_time-last_send_timesend_interval:send_dataf{counter}\nser.write(send_data.encode(utf-8))print(发送,send_data.strip())counter1last_send_timecurrent_time# 非阻塞读取接收缓存ifser.in_waiting0:raw_dataser.read(ser.in_waiting)try:recv_strraw_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字节收发完全正常测试数据b123456\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损坏测试数据b1234567\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底层根治按论坛方式修改设备树删除UART1serial3100000节点DMA相关配置强制串口运行PIO中断模式彻底消除8字节限制长短报文均可正常收发。暂未进行实测验证方案2不修改设备树拆包处理软件临时兼容方案对长数据做分包发送每包最大7字节包与包之间增加1ms延时保证硬件FIFO不会积累到8字节规避DMA异常触发。缺点仅适用于可自主控制发送逻辑的场景外部设备主动下发长报文时仍会出现数据损坏。七、总结硬件接线、引脚复用配置无误时短报文串口通信正常单包数据长度≥8字节会触发内核DMA驱动Bug数据收发全零损坏稳定长期使用推荐修改设备树关闭DMA不改动系统底层则只能采用7字节分包发送临时兼容。