Python与STM32F103串口通讯

本文介绍了如何使用Python通过pyserial库与STM32F103进行串口通讯。内容包括Python上位机程序的编写,STM32下位机简单的串口收发程序,以及实际效果展示。通过连接COM端口,实现了数据的双向传输。同时鼓励读者尝试用Python开发串口助手类型的上位机界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

要想用python与stm32通讯,首先就要安装python的相关库—pyserial。
其次准备一块32芯片烧录好串口收发程序准备测试,如果手头没有32的话,下载安装虚拟串口进行调试吧。具体安装方法自行百度。废话就不多说了直接上我的案例程序吧。

Python 上位机程序

以下功能具体封装成函数了,在实际开发中,接收数据可以和线程配合使用。

import serial

# 串口打开函数
def open_ser():
    port = 'com4'  # 串口号
    baudrate = 9600  # 波特率
    try:
        global ser
        ser = serial.Serial(port,baudrate,timeout=0.5)
        if(ser.isOpen()==True):
            print("串口打开成功")
    except Exception as exc:
        print("串口打开异常",exc)
        
# 数据发送
def send_msg():
    try:
        send_datas = input("请输入要发送的数据\n")
        ser.write(str(send_datas).encode("gbk"))
        print("已发送数据:",send_datas)
    except Exception as exc:
        print("发送异常", exc)
        
# 接收数据
def read_msg():
    try:
        print("等待接收数据"
### 实现STM32F103C8T6树莓派4B之间串口通信 为了实现STM32F103C8T6树莓派4B之间的串口通信,需要分别配置两者的UART模块并编写相应的初始化代码。以下是详细的说明: #### STM32F103C8T6 UART 初始化 在STM32F103C8T6上使用标准库进行UART初始化时,可以按照以下方式设置。 ```c #include "stm32f10x.h" void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 配置USART1的TX和RX引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART参数 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } ``` 上述代码完成了STM32F103C8T6上的UART1初始化[^1]。波特率设为`115200`,数据位长度为`8`,无校验位,停止位为`1`。 --- #### 树莓派4B UART 配置 对于树莓派4B,可以通过修改`/boot/config.txt`文件启用UART功能,并禁用蓝牙占用UART资源。 编辑`config.txt`文件: ```bash sudo nano /boot/config.txt ``` 添加或修改以下内容: ```ini enable_uart=1 dtoverlay=pi3-disable-bt ``` 保存退出后重启设备: ```bash sudo reboot ``` 接着,在Python中通过PySerial库发送和接收数据。安装PySerial库: ```bash pip install pyserial ``` 示例代码如下: ```python import serial import time ser = serial.Serial('/dev/ttyAMA0', baudrate=115200, timeout=1) def send_data(data): ser.write(data.encode()) def receive_data(): while True: data = ser.readline().decode('utf-8').strip() if data: return data if __name__ == "__main__": try: send_data("Hello from Raspberry Pi!") response = receive_data() print(f"Received: {response}") except KeyboardInterrupt: ser.close() ``` 此代码实现了向STM32发送字符串并通过串口读取返回的数据[^2]。 --- #### 数据交互测试 假设STM32接收到消息后将其回传给树莓派,则可以在STM32端增加以下函数用于处理收发逻辑: ```c uint8_t RxBuffer[100]; uint8_t TxBuffer[100]; void USART_SendString(const char* str) { while (*str != '\0') { USART_SendData(USART1, *str++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } int main(void) { USART_Config(); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) { uint8_t ch = USART_ReceiveData(USART1); sprintf((char*)RxBuffer, "%c", ch); strcat((char*)TxBuffer, (const char*)&ch); if (ch == '\n' || ch == '\r') { USART_SendString((const char*)TxBuffer); memset(TxBuffer, 0, sizeof(TxBuffer)); } } } } ``` 该程序会逐字节接收来自树莓派的消息并将它们拼接成完整的字符串再回传[^3]。 --- #### 注意事项 1. 确保硬件连接正确:将STM32的`PA9`(TX)连接到树莓派的`GPIO14`(RX),以及`PA10`(RX)连接到树莓派的`GPIO15`(TX)。 2. 使用共地(GND)来同步信号电平。 3. 如果遇到通信异常,请检查双方波特率是否一致。 ---
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值