Python实现串口通信(Python+Stm32)详解

Python实现串口通信(Python+Stm32)详解

引言

在现代的嵌入式系统开发和自动化控制中,串口通信是一种非常常见的通信方式。Python作为一种易于学习且功能强大的编程语言,结合Stm32微控制器,能够实现高效、灵活的串口通信。本文将详细介绍如何使用Python和Stm32实现串口通信,涵盖硬件连接、软件编程、代码解析及演示等内容。

一、实现效果

通过Python脚本,我们可以向Stm32发送数据,并接收来自Stm32的响应。这种通信方式广泛应用于数据采集、设备控制等场景。

二、说明

本文将以Python的pyserial库为基础,结合Stm32微控制器,演示串口通信的实现过程。需要注意的是,这里的Stm32开发板假设已具备基本的串口通信功能,如USART1。

三、Python串口通信代码详解
3.1 包下载

首先,你需要安装Python的pyserial库,用于串口通信。可以通过pip命令快速安装:

pip install pyserial
3.2 代码部分

下面是Python串口通信的详细代码示例及解析。

import serial  # 导入serial库,用于串口通信
from time import sleep  # 导入time库中的sleep函数,用于延时# 定义接收函数
def recv(serial_port):"""从串口接收数据。参数:serial_port (serial.Serial): 已打开的串口对象。返回:bytes: 接收到的数据,如果没有数据则返回空bytes。"""while True:  # 无限循环,直到接收到数据data = serial_port.read_all()  # 读取所有可用的数据if data:  # 如果data不为空,则跳出循环breaksleep(0.02)  # 短暂延时后再次尝试读取,避免CPU占用过高return data# 定义发送函数
def send(serial_port, send_data):"""向串口发送数据。参数:serial_port (serial.Serial): 已打开的串口对象。send_data (str): 要发送的数据,字符串类型。"""if serial_port.isOpen():  # 检查串口是否已打开serial_port.write(send_data.encode('utf-8'))  # 将字符串编码为bytes后发送print("发送成功", send_data)else:print("发送失败!串口未打开。")# 主程序
if __name__ == '__main__':# 初始化串口serial_port = serial.Serial('COM3', 9600, timeout=0.5)  # 设置端口号、波特率、超时时间if serial_port.isOpen():print("串口打开成功")else:print("串口打开失败,请检查端口号和连接")try:# 主循环,用于持续接收和发送数据while True:# 接收用户输入send_data = input("输入要发送的数据(输入'x'退出):")if send_data.lower() == 'x':  # 如果用户输入'x',则退出程序break# 发送数据send(serial_port, send_data)# 延时,等待数据接收sleep(0.5)# 接收数据received_data = recv(serial_port)if received_data:print("接收到数据:", received_data.decode('utf-8'))  # 将接收到的bytes解码为字符串后打印except KeyboardInterrupt:print("程序被用户中断")finally:# 关闭串口if serial_port.isOpen():serial_port.close()print("串口已关闭")

代码解析

  1. 导入模块:导入serial模块用于串口通信,以及time模块中的sleep函数用于延时。
  2. 定义接收函数recv函数用于接收串口数据,通过无限循环不断尝试读取数据,直到有数据可读或程序被中断。使用serial_port.read_all()读取所有可用的数据,并通过短暂延时减少CPU占用。
  3. 定义发送函数send函数负责发送数据,首先检查串口是否打开,然后使用serial_port.write()发送编码后的数据。注意,发送的数据需要是bytes类型,因此这里使用send_data.encode('utf-8')进行编码。
  4. 主程序:设置串口参数(端口号、波特率、超时时间),并通过无限循环接收用户输入的数据,发送并接收响应。当接收到特定数据(如’x’)或程序被中断时,退出循环并关闭串口。
四、Stm32串口通信
4.1 硬件部分

在硬件方面,你需要将Stm32开发板的串口(如USART1)通过USB转TTL模块连接到电脑的USB串口。通常,USART1的TX(发送端)连接到PA9,RX(接收端)连接到PA10。

4.2 代码部分

在Stm32端,你需要编写相应的串口接收和发送代码。这里以HAL库为例,展示一个简化的串口发送函数:

#include "stm32f1xx_hal.h"UART_HandleTypeDef huart1; // 假设已经配置好huart1结构体void USART_SendByte(uint8_t Byte) {HAL_UART_Transmit(&huart1, &Byte, 1, HAL_MAX_DELAY); // 发送单个字节
}// 在主函数或其他适当的位置调用USART_SendByte函数发送数据

注意:这里的代码仅为示例,实际项目中需要根据具体的硬件和库函数进行调整。接收数据通常涉及到中断处理或轮询方式,具体实现会相对复杂一些。

五、总结

通过本文,我们详细介绍了如何使用Python的pyserial库与Stm32微控制器实现串口通信。代码部分涵盖了从串口初始化、数据发送、数据接收到程序异常处理和资源清理的完整流程。希望这些内容能够帮助你在项目中成功实现串口通信功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架,由 Google Brain 团队开发。它用于数据流图的计算,尤其擅长深度学习任务。在 TensorFlow 中,数据流图(Data Flow Graph)是其核心概念之一,它定义了计算…

Blackbox AI : 全新的人工智能编码助手 您的高效AI开发全能助手

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 提起AI 智能编码助手,相信到了如今大家都不陌生。其对我们开发的代码时的效率有显著的提升,可以说…

效果惊人!LivePortrait开源数字人技术,让静态照片生动起来

不得了了,快手已经不是众人所知的那个短视频娱乐平台了。 可灵AI视频的风口尚未过去,又推出了LivePortrait--开源的数字人项目。LivePortrait让你的照片动起来,合成逼真的动态人像视频,阿里通义EMO不再是唯一选择。 让图像动起来 LivePortrait 主要提供了对眼睛和嘴唇动作的…

Mattermost:一个强大的开源协作平台

Mattermost是一个强大的开源协作平台,基于云原生架构,为企业级用户提供安全、可扩展且自托管的消息传递解决方案。 一、平台特点 开源与定制性:Mattermost是一个开源项目,用户可以根据自身需求定制界面、添加功能或扩展其功能&am…

[大师C语言(第四十一篇)]C语言指针数组与数组指针技术详解

C语言中的指针和数组是两个核心概念,它们在许多高级编程任务中扮演着重要角色。本文将深入探讨C语言中的指针数组与数组指针,包括它们的基本概念、使用场景和技术细节。我们将通过详细的解释和实用的代码案例来展示如何有效地使用这些技术。 第一部分&a…

matlab 卷积和多项式乘法

目录 一、算法原理1、原理概述2、主要函数二、代码实现1、通过卷积计算多项式乘法2、向量卷积3、卷积的中心部分三、参考链接一、算法原理 1、原理概述 两个向量 u u u和 v v v的卷积,表示

大屏自适应容器组件 v-scale-screen

在vue中,v-scale-screen可用于大屏项目开发,实现屏幕自适应,可根据宽度自适应,高度自适应,和宽高等比例自适应,全屏自适应。 仓库地址:github国内地址:gitee 一、安装 npm instal…

qr 获取当前路径

qDebug() 函数在 Qt 应用程序中用于输出调试信息。这些信息通常被发送到标准输出(stdout)或标准错误(stderr),具体取决于你的应用程序是如何配置的。在大多数开发环境中,你可以通过以下方式查看 qDebug() 输…

React setState

老生常谈之setState 是同步的还是异步的? 设想setState是同步的,那也就是每次调用setState都要进行新旧虚拟DOM的对比,然后将差异化的dom更新到页面上,性能损耗很大 所以react把setState设置为了异步,当状态更新时不…

【Unity2D 2022:Audio】添加游戏音乐和音效

一、添加背景音乐 1. 创建空的游戏物体,名为BackgroundMusic 2. 为音频播放器添加音频源(Audio Source)组件 3. 将背景音乐音频赋值到AudioClip(红色) 4. 设置循环播放(蓝色) 二、添加草莓拾取…

springboot封装请求参数json的源码解析

源码位置: org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters(org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type…

解答 | http和https的区别,谁更好用

TTP(超文本传输协议)和HTTPS(安全超文本传输协议)的主要区别在于安全性和数据传输的方式。 一、区别 1、协议安全性: HTTP:使用明文形式传输数据,不提供数据加密功能,数据在传输过…

coze搭建工作流和Agent

coze搭建工作流和Agent Agent LLM 记忆感知规划使用工具 LLM是大语言模型,prompt提示词影响LLM的输出质量 描述需求——>背景——>解决思路,提示词文档。 当有明确的需求和实现需求的路径时,可以通过搭建工作流来完成标准化任务为…

函数声明与函数表达式的区别?

一、区别如下: 函数声明的方法定义的函数,函数名是必须的,函数表达式的函数名是可选的。函数声明的方法定义的函数,函数可以在函数声明之前调用,函数表达式的函数只能在声明之后调用。 函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数…

Python爬虫原理以及3个小案例(源码)

一、爬虫原理 网络爬虫是一种用于自动获取网页内容的程序。它模拟用户浏览网页的过程,通过发送HTTP请求获取网页的源代码,并利用解析和提取技术来获取所需的数据。 1. HTTP请求与响应过程 爬虫向目标网站发送HTTP请求,请求包含URL、请求方…

Linux内核 -- DMA控制器之dmaengine框架的注册与使用流程

Linux Kernel dmaengine 框架 简介 Linux内核的dmaengine框架是一个用于管理DMA(Direct Memory Access)操作的通用框架。它抽象了不同DMA控制器的实现,使得上层代码可以方便地进行DMA传输。 初始化流程 1. 驱动注册 每个DMA控制器驱动都…

定义变量和声明变量、定义类和声明类

一、定义变量和声明变量 在编程中,定义变量和声明变量是两个相关但不同的概念,尤其是在静态类型的编程语言中。静态类型的编程语言比如Java 1、声明变量 (1)定义:声明变量是指告诉编译器变量的名字、类型和在某些情…

Mysql:时区问题

Mysql:时区问题 1、时区配置 Mysql默认使用系统的时区 mysql> show global variables like %time%zone%; -------------------------- | Variable_name | Value | -------------------------- | system_time_zone | | | time_zone | SYSTEM…

Multi-Wing Optimiser风扇选型软件介绍

Multi-Wing Optimiser风扇选型软件

一、YOLO V10安装、使用、训练大全

YOLO V10安装、使用、训练大全 一、下载官方源码二、配置conda环境三、安装YOLOV10依赖四、使用官方YOLO V10模型1.下载模型2.使用模型2.1 图片案例 五、制作数据集1.数据集目录结构2.标注工具2.1 安装标注工具2.2 运行标注工具2.3 设置自动保存2.4 切换yolo模式2.5 开始标注2.…