找回密码
 会员注册
查看: 21|回复: 0

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

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-9-7 15:26:03 | 显示全部楼层 |阅读模式
Python实现串口通信(Python+Stm32)详解引言在现代的嵌入式系统开发和自动化控制中,串口通信是一种非常常见的通信方式。Python作为一种易于学习且功能强大的编程语言,结合Stm32微控制器,能够实现高效、灵活的串口通信。本文将详细介绍如何使用Python和Stm32实现串口通信,涵盖硬件连接、软件编程、代码解析及演示等内容。一、实现效果通过Python脚本,我们可以向Stm32发送数据,并接收来自Stm32的响应。这种通信方式广泛应用于数据采集、设备控制等场景。二、说明本文将以Python的pyserial库为基础,结合Stm32微控制器,演示串口通信的实现过程。需要注意的是,这里的Stm32开发板假设已具备基本的串口通信功能,如USART1。三、Python串口通信代码详解3.1包下载首先,你需要安装Python的pyserial库,用于串口通信。可以通过pip命令快速安装:pipinstallpyserial13.2代码部分下面是Python串口通信的详细代码示例及解析。importserial#导入serial库,用于串口通信fromtimeimportsleep#导入time库中的sleep函数,用于延时#定义接收函数defrecv(serial_port):"""从串口接收数据。参数:serial_port(serial.Serial):已打开的串口对象。返回:bytes:接收到的数据,如果没有数据则返回空bytes。"""whileTrue:#无限循环,直到接收到数据data=serial_port.read_all()#读取所有可用的数据ifdata:#如果data不为空,则跳出循环breaksleep(0.02)#短暂延时后再次尝试读取,避免CPU占用过高returndata#定义发送函数defsend(serial_port,send_data):"""向串口发送数据。参数:serial_port(serial.Serial):已打开的串口对象。send_data(str):要发送的数据,字符串类型。"""ifserial_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)#设置端口号、波特率、超时时间ifserial_port.isOpen():print("串口打开成功")else:print("串口打开失败,请检查端口号和连接")try:#主循环,用于持续接收和发送数据whileTrue:#接收用户输入send_data=input("输入要发送的数据(输入'x'退出):")ifsend_data.lower()=='x':#如果用户输入'x',则退出程序break#发送数据send(serial_port,send_data)#延时,等待数据接收sleep(0.5)#接收数据received_data=recv(serial_port)ifreceived_data:print("接收到数据:",received_data.decode('utf-8'))#将接收到的bytes解码为字符串后打印exceptKeyboardInterrupt:print("程序被用户中断")finally:#关闭串口ifserial_port.isOpen():serial_port.close()print("串口已关闭")12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970代码解析:导入模块:导入serial模块用于串口通信,以及time模块中的sleep函数用于延时。定义接收函数:recv函数用于接收串口数据,通过无限循环不断尝试读取数据,直到有数据可读或程序被中断。使用serial_port.read_all()读取所有可用的数据,并通过短暂延时减少CPU占用。定义发送函数:send函数负责发送数据,首先检查串口是否打开,然后使用serial_port.write()发送编码后的数据。注意,发送的数据需要是bytes类型,因此这里使用send_data.encode('utf-8')进行编码。主程序:设置串口参数(端口号、波特率、超时时间),并通过无限循环接收用户输入的数据,发送并接收响应。当接收到特定数据(如’x’)或程序被中断时,退出循环并关闭串口。四、Stm32串口通信4.1硬件部分在硬件方面,你需要将Stm32开发板的串口(如USART1)通过USB转TTL模块连接到电脑的USB串口。通常,USART1的TX(发送端)连接到PA9,RX(接收端)连接到PA10。4.2代码部分在Stm32端,你需要编写相应的串口接收和发送代码。这里以HAL库为例,展示一个简化的串口发送函数:#include"stm32f1xx_hal.h"UART_HandleTypeDefhuart1;//假设已经配置好huart1结构体voidUSART_SendByte(uint8_tByte){HAL_UART_Transmit(&huart1,&Byte,1,HAL_MAX_DELAY);//发送单个字节}//在主函数或其他适当的位置调用USART_SendByte函数发送数据123456789注意:这里的代码仅为示例,实际项目中需要根据具体的硬件和库函数进行调整。接收数据通常涉及到中断处理或轮询方式,具体实现会相对复杂一些。五、总结通过本文,我们详细介绍了如何使用Python的pyserial库与Stm32微控制器实现串口通信。代码部分涵盖了从串口初始化、数据发送、数据接收到程序异常处理和资源清理的完整流程。希望这些内容能够帮助你在项目中成功实现串口通信功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 06:03 , Processed in 0.460495 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表