当前位置: 首页 > news >正文

用Jetson Nano和Python玩转串口:一个脚本实现双向通信与数据回显测试

用Jetson Nano和Python玩转串口:一个脚本实现双向通信与数据回显测试

在嵌入式开发中,串口通信就像设备之间的"悄悄话"通道。想象一下,你的Jetson Nano需要和Arduino交换传感器数据,或者与工业控制器传递指令,UART(通用异步收发传输器)就是最直接的对话方式。本文将带你用Python的pyserial库,在Jetson Nano上构建一个智能回显测试系统——不仅能接收数据,还能像镜子一样原样返回,这是验证通信链路健康的经典方法。

1. 硬件准备与系统配置

1.1 认识Jetson Nano的UART接口

Jetson Nano开发板提供了多个UART接口,其中最常用的是/dev/ttyTHS1。通过40针GPIO扩展接头可以看到:

引脚编号功能物理位置
8TXD发送端
10RXD接收端
6GND接地

连线要点

  • Jetson的TXD应连接对方设备的RXD
  • Jetson的RXD连接对方设备的TXD
  • 务必共地(GND连接)

注意:使用杜邦线连接时,线长不宜超过1米,过长可能导致信号衰减

1.2 环境配置三步曲

  1. 安装pyserial库

    sudo apt-get update sudo apt-get install python3-pip sudo pip3 install pyserial
  2. 设置串口权限

    sudo chmod 666 /dev/ttyTHS1

    或者更安全的方式是添加用户到dialout组:

    sudo usermod -a -G dialout $USER
  3. 验证设备节点

    ls -l /dev/ttyTHS1

    正确输出应类似:

    crw-rw-rw- 1 root dialout 204, 64 May 10 14:30 /dev/ttyTHS1

2. Python串口通信核心代码解析

2.1 初始化串口对象

import serial import time ser = serial.Serial( port='/dev/ttyTHS1', # 设备路径 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, # 数据位 parity=serial.PARITY_NONE, # 校验位 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=1 # 读超时(秒) )

参数详解

参数常见值说明
baudrate9600, 19200, 115200等必须与对方设备一致
bytesizeFIVEBITS到EIGHTBITS通常使用8位数据
parityPARITY_NONE/ODD/EVEN无校验/奇校验/偶校验
stopbitsSTOPBITS_ONE/ONE_POINT_FIVE/TWO通常1位停止位

2.2 实现智能回显功能

def echo_test(): try: while True: # 发送欢迎消息 ser.write(b"Jetson UART Echo Server Ready\n") # 检查接收缓冲区 if ser.in_waiting > 0: # 读取数据 received = ser.read(ser.in_waiting) print(f"Received: {received.decode('utf-8', errors='replace')}") # 回显数据 ser.write(received) # 特殊处理回车符 if b'\r' in received: ser.write(b'\n') time.sleep(0.1) except KeyboardInterrupt: print("\nProgram terminated by user") finally: ser.close()

代码亮点

  • 使用in_waiting属性动态获取缓冲区字节数
  • errors='replace'参数优雅处理非UTF-8字符
  • 单独处理回车符提升终端显示友好度

3. 高级功能扩展

3.1 数据帧协议设计

简单而实用的帧格式示例:

[STX][数据长度][数据内容][校验和][ETX]

实现代码片段:

def send_packet(data): stx = b'\x02' etx = b'\x03' length = len(data).to_bytes(1, 'big') checksum = sum(data).to_bytes(1, 'big') packet = stx + length + data + checksum + etx ser.write(packet) def receive_packet(): while True: if ser.in_waiting >= 5: # 最小帧长度 if ser.read() == b'\x02': # STX length = int.from_bytes(ser.read(1), 'big') payload = ser.read(length) checksum = int.from_bytes(ser.read(1), 'big') if ser.read() == b'\x03': # ETX if sum(payload) == checksum: return payload

3.2 多线程通信架构

from threading import Thread, Lock class UARTManager: def __init__(self): self.ser = serial.Serial('/dev/ttyTHS1', 115200) self.receive_buffer = bytearray() self.lock = Lock() def start(self): Thread(target=self._receive_thread, daemon=True).start() def _receive_thread(self): while True: with self.lock: if self.ser.in_waiting: self.receive_buffer.extend(self.ser.read(self.ser.in_waiting)) def send(self, data): with self.lock: self.ser.write(data) def get_received(self): with self.lock: data = self.receive_buffer.copy() self.receive_buffer.clear() return data

4. 实战调试技巧

4.1 常见问题排查表

现象可能原因解决方案
接收乱码波特率不匹配检查双方波特率设置
数据截断缓冲区溢出增加读取频率或缓冲区大小
无法打开设备权限不足检查用户组和权限设置
通信完全失败TX/RX接反交换TXD和RXD连接线
间歇性通信中断接地不良确保GND可靠连接

4.2 性能优化建议

  1. 调整内核缓冲区

    sudo sysctl -w kernel.printk="2 4 1 7"
  2. 使用DMA模式(需修改设备树):

    /dma-channel@0 { status = "okay"; };
  3. Python性能技巧

    • 使用bytearray替代频繁的bytes拼接
    • 考虑使用select模块监控串口活动
    • 对于高波特率(>1Mbps),建议使用C扩展

在最近的一个物联网网关项目中,我们发现当波特率提升到3Mbps时,Python的解释执行开始成为瓶颈。这时将核心通信模块改用Cython重写后,吞吐量提升了近8倍。不过对于大多数115200bps的应用场景,Python+pyserial的组合已经绰绰有余。

http://www.jsqmd.com/news/742122/

相关文章:

  • 从蓝图到实践:基于事件驱动架构构建多智能体系统
  • 科技早报|2026年5月2日:AI 编程工具开始按用量收费
  • ## 001、AI Agent 概述:什么是智能体?从概念到2026年的演进
  • GPT-Image 2隐藏玩法:一句指令让AI自动分离图片图层,设计效率翻倍
  • 别再只盯着空间注意力了!手把手教你用PyTorch复现SENet,搞懂通道注意力机制
  • iOS微信红包助手:告别手慢烦恼,智能抢红包的终极指南
  • 开源GRC平台CISO助手:从合规框架到风险管理的实战指南
  • 原神FPS解锁终极指南:免费开源工具突破60帧限制
  • PlatformIO + VS Code:嵌入式开发环境配置的革命性解决方案
  • 你的位置准吗?聊聊百度地图定位那些坑:GPS、纠偏与坐标系的实战避雷指南
  • 使用Taotoken CLI工具一键配置多开发环境与统一API密钥
  • ARM Fast Models缓存追踪组件原理与应用
  • # 002、AI Agent 的核心能力:感知、推理、规划、执行、记忆
  • ChatGPT自定义指令:打造专属AI助手,提升对话效率与个性化体验
  • Helm GCS插件实战:零运维搭建私有Chart仓库
  • iOS激活锁绕过终极指南:使用applera1n免费解锁你的iPhone
  • # 003 大语言模型(LLM)作为 Agent 的“大脑”:GPT、Claude、Gemini 对比
  • RoboMaster 2023赛季大能量机关识别:从OpenCV二值化到目标点计算的保姆级代码拆解
  • Python AI推理慢到崩溃?3个被99%开发者忽略的CUDA Graph陷阱正在拖垮你的LLM服务
  • MCP协议实战:构建AI代码库助手,实现深度上下文编程
  • MerlionClaw:一个设计精巧的网络数据采集与处理框架
  • 别再踩坑了!UniApp H5页面与WebView通信,用window.postMessage的完整配置流程(含代码示例)
  • QQ音乐加密文件解锁指南:3步让你的音乐自由播放
  • 2026方形不锈钢水箱专业厂家盘点:304不锈钢水箱/BDF不锈钢水箱/PP雨水收集系统/回用型雨水收集系统/地埋式不锈钢水箱/选择指南 - 优质品牌商家
  • 从‘余额500提现3000’到实战:用Turbo Intruder插件挖掘10类高频并发漏洞的完整流程
  • 告别LOOP!用ABAP 7.40的Line_exists一行代码搞定内表条件判断
  • P1-VL模型:物理竞赛AI解题的双通道视觉推理系统
  • 3步掌握PatreonDownloader:免费高效的Patreon内容批量下载终极指南
  • PCL2启动器2.10.1:为什么它能让你的Minecraft体验提升3个层次?
  • PEEK项目:基于视觉语言模型的通用机器人操作系统