Jetson Nano新手必看:用Python3搞定UART串口通信(附禁用控制台避坑指南)

张开发
2026/4/16 10:16:26 15 分钟阅读

分享文章

Jetson Nano新手必看:用Python3搞定UART串口通信(附禁用控制台避坑指南)
Jetson Nano硬件通信实战Python3 UART串口开发全流程指南第一次拿到Jetson Nano开发板时最让人兴奋的莫过于通过代码直接控制硬件接口。但当我真正尝试用Python操作UART串口时却发现系统默认的控制台服务成了拦路虎——发送的数据总是莫名其妙被截断。这个问题困扰了我整整两天直到发现nvgetty服务这个隐藏设定。本文将带你完整走通从环境配置到实际通信的全流程特别针对那些官方文档没有明确说明的坑点。1. 硬件准备与环境配置1.1 认识Jetson Nano的串口接口Jetson Nano开发板的40针GPIO接头中UART1默认映射在ttyTHS1设备节点上对应物理引脚8-TX和10-RX。与树莓派等开发板不同NVIDIA在出厂系统中默认启用了串口控制台服务这是大多数通信失败的根源。关键硬件清单TTL转USB适配器如CP2102、CH340等杜邦线建议使用母对母万用表可选用于电压检测注意Jetson Nano的UART工作电压为3.3V务必确认你的转换器兼容该电平标准否则可能损坏设备。1.2 禁用系统控制台服务这是最关键的准备工作也是新手最容易忽略的步骤。执行以下命令序列# 停止当前运行的服务 sudo systemctl stop nvgetty # 禁止开机自启 sudo systemctl disable nvgetty # 刷新设备规则 sudo udevadm trigger # 建议重启生效 sudo reboot禁用后可以通过以下命令验证是否成功systemctl status nvgetty正确的状态应显示inactive (dead)。如果遇到权限问题可能需要检查/etc/systemd/system/nvgetty.service文件是否存在。2. Python串口通信基础实现2.1 安装必要软件包推荐使用Python3的serial库进行开发sudo apt-get update sudo apt-get install python3-serial验证安装是否成功python3 -c import serial; print(serial.__version__)2.2 最小化通信示例创建一个uart_demo.py文件包含以下基础代码import serial import time # 配置串口参数 ser serial.Serial( port/dev/ttyTHS1, baudrate115200, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) try: print(串口通信测试开始 (按CtrlC终止)) while True: # 发送数据 ser.write(bHello UART\n) # 接收数据 if ser.in_waiting 0: received ser.readline() print(f接收到: {received.decode(utf-8).strip()}) time.sleep(1) except KeyboardInterrupt: print(程序终止) finally: ser.close()运行脚本需要超级用户权限sudo python3 uart_demo.py3. 进阶应用与调试技巧3.1 多线程双向通信实现实际项目中常需要同时处理发送和接收下面是一个改进版架构import serial import threading class UARTManager: def __init__(self): self.ser serial.Serial(/dev/ttyTHS1, 115200, timeout1) self.running True def receiver_thread(self): while self.running: if self.ser.in_waiting: data self.ser.readline().decode(utf-8).strip() print(f[接收] {data}) def start(self): self.thread threading.Thread(targetself.receiver_thread) self.thread.start() try: while self.running: message input(输入发送内容 (或输入quit退出): ) if message.lower() quit: break self.ser.write(f{message}\n.encode(utf-8)) finally: self.running False self.thread.join() self.ser.close() if __name__ __main__: manager UARTManager() manager.start()3.2 常见问题排查指南问题现象可能原因解决方案无法打开设备权限不足/服务冲突使用sudo执行/确认nvgetty已禁用发送数据无响应接线错误/波特率不匹配检查TX/RX交叉连接/确认双方波特率接收乱码电平不匹配/参数错误确认3.3V电平/检查数据位停止位设置随机断开电源不稳定使用独立电源供电/检查接地硬件连接检查清单Jetson TX → 转换器 RXJetson RX → 转换器 TX共地连接GND到GND确认转换器驱动已安装Windows设备管理器检查4. 扩展应用场景4.1 与Arduino通信实例通过UART可以实现Jetson Nano与Arduino的协同工作。以下是Arduino端的示例代码void setup() { Serial.begin(115200); } void loop() { if (Serial.available()) { String received Serial.readStringUntil(\n); Serial.print(Arduino收到: ); Serial.println(received); } delay(100); }对应的Python端可以这样交互def arduino_control(): ser serial.Serial(/dev/ttyTHS1, 115200, timeout1) try: while True: command input(控制Arduino (1-LED ON, 0-LED OFF): ) ser.write(f{command}\n.encode()) response ser.readline() print(response.decode(utf-8).strip()) finally: ser.close()4.2 数据日志记录系统结合Python的文件操作可以创建简单的串口数据记录器import serial from datetime import datetime def log_serial_data(log_fileuart_log.txt): ser serial.Serial(/dev/ttyTHS1, 115200) with open(log_file, a) as f: try: while True: if ser.in_waiting: data ser.readline().decode(utf-8).strip() timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) log_entry f{timestamp} - {data}\n f.write(log_entry) f.flush() # 确保及时写入 except KeyboardInterrupt: ser.close()5. 性能优化与安全实践5.1 缓冲区管理技巧高速通信时需要特别注意缓冲区处理# 清空输入缓冲区 ser.reset_input_buffer() # 清空输出缓冲区 ser.reset_output_buffer() # 设置缓冲区大小默认值通常足够 ser.set_buffer_size(rx_size1024, tx_size1024)5.2 错误处理最佳实践健壮的工业级代码应该包含完善的错误处理import serial from serial.tools import list_ports def safe_serial_connect(): max_retries 3 for attempt in range(max_retries): try: # 自动检测可用端口 available_ports list_ports.comports() if not available_ports: raise RuntimeError(未检测到可用串口设备) ser serial.Serial( port/dev/ttyTHS1, baudrate115200, timeout2, write_timeout2 ) return ser except serial.SerialException as e: print(f尝试 {attempt 1} 失败: {str(e)}) if attempt max_retries - 1: raise time.sleep(1)5.3 系统服务自动化对于生产环境可以创建systemd服务自动管理串口应用创建/etc/systemd/system/uart_service.service[Unit] DescriptionJetson UART Communication Service Afternetwork.target [Service] ExecStart/usr/bin/python3 /path/to/your_script.py Restartalways Userroot [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable uart_service sudo systemctl start uart_service

更多文章