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("串口已关闭")
代码解析:
- 导入模块:导入
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_HandleTypeDef huart1; // 假设已经配置好huart1结构体void USART_SendByte(uint8_t Byte) {HAL_UART_Transmit(&huart1, &Byte, 1, HAL_MAX_DELAY); // 发送单个字节
}// 在主函数或其他适当的位置调用USART_SendByte函数发送数据
注意:这里的代码仅为示例,实际项目中需要根据具体的硬件和库函数进行调整。接收数据通常涉及到中断处理或轮询方式,具体实现会相对复杂一些。
五、总结
通过本文,我们详细介绍了如何使用Python的pyserial
库与Stm32微控制器实现串口通信。代码部分涵盖了从串口初始化、数据发送、数据接收到程序异常处理和资源清理的完整流程。希望这些内容能够帮助你在项目中成功实现串口通信功能。