当前位置:   article > 正文

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

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
  • 1
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不为空,则跳出循环
            break
        sleep(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

代码解析

  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函数发送数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

五、总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/1008878
推荐阅读
相关标签
  

闽ICP备14008679号