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

保姆级教程:用Python在Jetson Nano上玩转串口,轻松控制STM32(附完整代码)

从零开始:Jetson Nano与STM32的串口通信实战指南

在嵌入式开发领域,Jetson Nano凭借其强大的AI计算能力和丰富的接口资源,成为连接物理世界与数字世界的理想桥梁。而STM32系列单片机则以其稳定性和灵活性,在工业控制、物联网终端等领域占据重要地位。本文将带你从硬件连接到软件调试,一步步实现这两个平台之间的串口通信。

1. 硬件准备与环境搭建

1.1 所需硬件清单

在开始之前,请确保你已准备好以下硬件设备:

  • Jetson Nano开发板(建议使用4GB内存版本)
  • STM32开发板(本文以STM32F4系列为例)
  • USB转TTL串口模块(用于调试和监控)
  • 杜邦线若干(建议使用不同颜色区分功能)
  • 稳压电源或USB供电线

提示:购买杜邦线时,建议选择母对母、公对母、公对公各一组,以适应不同开发板的接口需求。

1.2 Jetson Nano串口配置

Jetson Nano默认启用了串口控制台功能,我们需要先禁用这一设置:

sudo systemctl stop nvgetty sudo systemctl disable nvgetty

然后修改/boot/extlinux/extlinux.conf文件,找到包含console=ttyTHS1的行并删除它。保存后重启系统使更改生效。

1.3 STM32开发环境准备

对于STM32开发,我们推荐使用以下工具链:

  • STM32CubeIDE:官方集成开发环境,包含HAL库和LL库
  • STM32CubeMX:图形化配置工具,可自动生成初始化代码
  • OpenOCD:用于调试和烧录程序

安装完成后,创建一个新项目并配置USART外设:

  1. 选择正确的MCU型号
  2. 在Pinout视图中启用USART2
  3. 配置参数:波特率115200,8位数据位,无校验,1位停止位
  4. 生成代码

2. 硬件连接详解

2.1 引脚对应关系

Jetson Nano的40针GPIO接口中,串口引脚位于第8和第10针:

Jetson Nano引脚功能STM32对应引脚
6GNDGND
8TXDUSART2_RX
10RXDUSART2_TX

2.2 连接注意事项

  • 电平匹配:Jetson Nano的串口为3.3V电平,与STM32F4系列兼容,无需电平转换
  • 防短路措施:连接前务必断电操作,避免误接导致硬件损坏
  • 信号完整性:长距离通信时建议使用屏蔽线,并考虑添加终端电阻

注意:错误的接线可能导致设备损坏。务必再三确认连接正确后再通电。

3. Python串口通信实现

3.1 pyserial库安装与基础使用

在Jetson Nano上安装pyserial库:

pip install pyserial

创建一个简单的串口测试脚本serial_test.py

import serial import time def main(): try: # 配置串口参数 ser = serial.Serial( port='/dev/ttyTHS1', baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1 ) if ser.is_open: print("串口已打开") while True: # 发送数据 send_data = "Hello STM32\n" ser.write(send_data.encode('utf-8')) print(f"发送: {send_data.strip()}") # 接收数据 if ser.in_waiting > 0: received_data = ser.read(ser.in_waiting) print(f"接收: {received_data.decode('utf-8').strip()}") time.sleep(1) except Exception as e: print(f"发生错误: {str(e)}") finally: if 'ser' in locals() and ser.is_open: ser.close() print("串口已关闭") if __name__ == "__main__": main()

3.2 常见问题排查

当通信不成功时,可以按照以下步骤排查:

  1. 检查物理连接

    • 确认GND已正确连接
    • 确认TX-RX交叉连接
    • 检查线缆是否完好
  2. 验证串口配置

    • 波特率双方必须一致
    • 数据位、停止位、校验位设置匹配
    • 流控设置(通常为None)
  3. 权限问题

    ls -l /dev/ttyTHS1

    如果显示权限不足,可以添加当前用户到dialout组:

    sudo usermod -a -G dialout $(whoami)

    然后注销重新登录。

4. STM32固件开发

4.1 使用HAL库实现串口通信

在STM32CubeIDE中,我们可以利用HAL库快速实现串口功能。以下是关键代码片段:

/* 在main.c中添加以下变量 */ uint8_t rxBuffer[128]; uint8_t txBuffer[128]; uint8_t receivedFlag = 0; /* 在main函数初始化部分添加 */ HAL_UART_Receive_IT(&huart2, rxBuffer, 1); /* 添加回调函数 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART2) { // 设置接收完成标志 receivedFlag = 1; // 重新启动接收 HAL_UART_Receive_IT(&huart2, rxBuffer, 1); } } /* 在主循环中添加处理逻辑 */ while (1) { if(receivedFlag) { receivedFlag = 0; // 回传接收到的数据 sprintf((char*)txBuffer, "Echo: %c\n", rxBuffer[0]); HAL_UART_Transmit(&huart1, txBuffer, strlen((char*)txBuffer), HAL_MAX_DELAY); } }

4.2 调试技巧

  • 使用逻辑分析仪:可以捕获实际的串口信号,验证时序和电平
  • 分段测试:先单独测试STM32与PC的通信,再测试Jetson与PC的通信,最后两者对接
  • 添加状态指示灯:利用LED指示通信状态,便于快速诊断

5. 高级应用与性能优化

5.1 数据帧协议设计

简单的文本协议虽然易于调试,但在实际应用中,我们通常需要设计更健壮的通信协议:

# Python端帧处理示例 def build_frame(command, data): header = b'\xAA\x55' length = len(data).to_bytes(2, 'little') checksum = (sum(data) & 0xFF).to_bytes(1, 'little') return header + length + command + data + checksum def parse_frame(raw_data): if len(raw_data) < 5: return None if raw_data[0] != 0xAA or raw_data[1] != 0x55: return None length = int.from_bytes(raw_data[2:4], 'little') if len(raw_data) < 4 + length + 1: return None command = raw_data[4] data = raw_data[5:5+length] checksum = raw_data[-1] if sum(data) & 0xFF != checksum: return None return (command, data)

5.2 多线程处理

为提高通信效率,可以在Python端使用多线程分离发送和接收逻辑:

import threading class SerialManager: def __init__(self, port, baudrate): self.ser = serial.Serial(port, baudrate, timeout=1) self.receive_thread = threading.Thread(target=self._receive_loop) self.running = False def start(self): self.running = True self.receive_thread.start() def stop(self): self.running = False self.receive_thread.join() self.ser.close() def send(self, data): self.ser.write(data) def _receive_loop(self): while self.running: if self.ser.in_waiting > 0: data = self.ser.read(self.ser.in_waiting) print(f"Received: {data.hex()}") time.sleep(0.01)

5.3 性能优化建议

  • 缓冲区管理:合理设置接收缓冲区大小,避免内存浪费或数据丢失
  • 超时设置:根据实际通信频率调整超时参数
  • 错误处理:添加重试机制和错误计数器,提高系统鲁棒性

在实际项目中,我发现最常遇到的问题是波特率不匹配和接线错误。特别是在使用不同厂家的开发板时,务必仔细核对技术文档。另一个实用技巧是在通信开始时加入握手协议,确保双方都已准备好再进行数据传输。

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

相关文章:

  • 自治智能体研究地图:高效追踪前沿、洞悉架构演进与安全评估
  • 智能体行业趋势:流程自动化、系统集成、垂直行业深耕
  • Windows 10/11下用MP3Stego提取音频隐写信息,保姆级图文教程(含密码错误排查)
  • 基于共享TCN结构与Transformer的复杂时间序列预测模型:提升精度与通用性的研究与应用...
  • 从作者投稿到用户阅读:一个微信小说小程序的完整运营逻辑拆解
  • NucleusCoop终极指南:如何免费实现PC游戏本地分屏多人联机
  • AI Agent 三大架构路径:全栈底座、金智维流程执行、Dify 低代码实践
  • CSS如何降低样式表的文件体积_利用CSS变量减少重复属性定义
  • 孤能子视角:“周易“
  • 2025终极指南:如何彻底解决Tiled地图编辑器路径引用问题的3种方法
  • 5分钟掌握Windows安卓应用安装:APK Installer完全指南
  • LiuJuan Z-Image Generator新手教程:权重文件正确放置与界面选择
  • 碧蓝航线Alas自动化脚本:告别重复劳动的全托管解决方案
  • 如何高效使用PCL启动器:Minecraft模组管理的终极指南
  • 2026年3月汽车用品门店口碑推荐,伊旗靠谱的汽车用品门店找哪家,色彩多样,满足个性审美需求 - 品牌推荐师
  • 基于OpenCV和WPF的卡尺算法找圆程序:利用opencvsharp实现精准测量
  • USBCopyer:智能U盘文件自动同步解决方案,告别手动复制的烦恼
  • Windows风扇控制实战:从噪音困扰到静音大师的全流程进阶指南
  • CF679B 解题报告
  • 深入 Open Agent SDK(二):34 个工具的背后——工具协议、三层架构与自定义扩展
  • 从‘八荒我为王’到个人品牌:如何用纯CSS文字特效为你的GitHub主页和博客打造记忆点
  • Steam成就管理器如何实现安全可靠的成就管理?
  • 3个简单步骤,用wxauto实现微信自动化:告别重复操作,解放你的双手
  • 开源好物 26/04
  • 探索计算机校招面试指南:从零基础到一线大厂offer的完整攻略
  • 第八周
  • Rockchip RK3588开发板调试串口(UART)配置全攻略:从ddrbin_tool修改到uboot编译烧写
  • 终极Windows风扇控制软件:FanControl深度配置与优化指南
  • 【MCP 2026国产化适配终极指南】:覆盖飞腾/鲲鹏/海光/兆芯四大平台的7大硬件兼容性雷区与3步通关方案
  • Meshroom完全指南:零基础掌握免费3D重建的终极教程