第一次拿到Jetson Nano开发板时,最让我兴奋的就是它丰富的硬件接口能力。作为嵌入式AI计算的入门神器,串口通信这个看似基础的功能,在实际配置过程中却可能遇到各种"暗礁"。本文将用我在三个实际项目中积累的经验,带你避开所有新手陷阱,完成从硬件连接到Python脚本调试的全流程。
Jetson Nano B01版的40针GPIO接口中隐藏着两个UART串口资源,其中UART1(ttyTHS1)是最常用的通信接口。与树莓派等开发板不同,Nano的串口引脚排列需要特别注意:
- UART1 TX:第8针(TXD)
- UART1 RX:第10针(RXD)
重要提示:连接外部设备时务必确认电压匹配,Nano的UART工作电压为3.3V,直接连接5V设备可能损坏主板
推荐使用以下硬件组合进行测试:
Jetson Nano ──[USB转TTL]── PC
│ └─[跳线帽]─ 8(TX) ↔ 10(RX)
实际接线时常见错误对照表:
官方SDK Manager刷写的镜像虽已包含基础驱动,但串口操作涉及的多层权限管控常成为“隐形杀手”。以下是必须完成的四步配置:
- 解除getty服务占用:
sudo systemctl stop nvgetty sudo systemctl disable nvgetty
- 永久生效的权限方案(优于临时chmod):
sudo usermod -a -G dialout $USER sudo chmod a+rw /dev/ttyTHS1
- Python环境隔离(避免权限污染):
python3 -m venv uart_venv source uart_venv/bin/activate
- 依赖库智能安装:
pip install pyserial –upgrade
遇到PermissionError时,不要盲目使用sudo pip,这会导致后续包管理混乱。正确的做法是:
pip install –user pyserial
下面这个增强版脚本增加了超时控制、数据校验和异常重连机制:
#!/usr/bin/env python3 import serial import serial.tools.list_ports from crc import Calculator, Crc8
class NanoUART:
def __init__(self): self.port = "/dev/ttyTHS1" self.baudrate = self.timeout = 2 self.connection = None self.crc_calc = Calculator(Crc8.CCITT) def connect(self): try: self.connection = serial.Serial( port=self.port, baudrate=self.baudrate, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout ) print(f"Connected to {self.port} at {self.baudrate} bps") return True except Exception as e: print(f"Connection failed: {str(e)}") return False def send_with_retry(self, data, max_retries=3): for attempt in range(max_retries): try: crc = self.crc_calc.checksum(data.encode()) packet = f"{data}|{crc:02X}
“.encode()
self.connection.write(packet) return True except Exception as e: print(f"Attempt {attempt+1} failed: {str(e)}") self.connect() return False def receive_loop(self): buffer = "" while True: try: raw = self.connection.read_until(b'
‘).decode().strip()
if '|' in raw: msg, crc = raw.split('|') if self.crc_calc.checksum(msg.encode()) == int(crc, 16): print(f"Valid: {msg}") else: print("CRC error") elif raw: print(f"Raw: {raw}") except KeyboardInterrupt: print("
Exiting…”)
break except Exception as e: print(f"Error: {str(e)}")
if name == “main”:
uart = NanoUART() if uart.connect(): uart.send_with_retry("Hello from Jetson") uart.receive_loop()
关键改进点解析:
- CRC-8校验:通过
crc库实现数据传输校验 - 自动重连:send_with_retry方法包含连接恢复机制
- 超时控制:设置2秒读取超时防止阻塞
当通信速率要求较高时,需要调整Linux系统的串口缓冲区设置:
sudo stty -F /dev/ttyTHS1 ospeed ispeed sudo sysctl -w kernel.printk=“2 4 1 7”
不同波特率下的实际传输性能测试数据:
对于需要长时间运行的场景,建议添加看门狗监控:
import threading
class Watchdog:
def __init__(self, timeout): self.timeout = timeout self.timer = threading.Timer(timeout, self.handler) def start(self): self.timer.start() def reset(self): self.timer.cancel() self.timer = threading.Timer(self.timeout, self.handler) self.timer.start() def handler(self): print("Watchdog triggered! Resetting...") os.system("sudo reboot")
实际项目中,我更喜欢用逻辑分析仪抓取波形辅助调试。当遇到通信异常时,首先检查:
- TX/RX信号线是否有正常波形
- 波特率误差是否超过3%
- 地线连接是否可靠
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/283468.html