【Python】Python实现串口通信(Python+Stm32)

这篇具有很好参考价值的文章主要介绍了【Python】Python实现串口通信(Python+Stm32)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎉欢迎来到Python专栏~Python实现串口通信


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:Python学习专栏
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

一、实现效果

🥝视频演示:

Python和Stm32实现串口通信演示

🥝图片展示:
PyCharm端发送数据:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32
stm32接收数据并回传:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

二、说明

Python技能树:Python入门技能树。
版本:Python 3.10。
IDE:PyCharm。
自制Stm32f103原理图与PCB:【stm32开发】stm32+oled最小系统板资料(原理图、PCB、示例代码)【六一】

需要本文章完整项目文件的话(Python串口通信代码+stm32-oled最小系统板资料+stm32串口通信完整项目),可以从该链接下载:【Python+Stm32串口通信】完整项目资料,或者三连本文章之后私聊我免费领取哦~
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

三、Python串口通信代码详解

3.1 包下载

直接:

pip install pyserial

然后等待包的下载和安装完成。

3.2 代码详解

先上本次文章的完整代码

import serial
from time import sleep

def recv(serial):
    while True:
        data = serial.read_all()
        if data == '':
            continue
        else:
            break
        sleep(0.02)
    return data

def send(send_data):
    if (serial.isOpen()):
        serial.write(send_data.encode('utf-8'))  # 编码
        print("发送成功", send_data)
    else:
        print("发送失败!")

if __name__ == '__main__':
    serial = serial.Serial('COM3', 9600, timeout=0.5)
    if serial.isOpen() :
        print("open success")
    else :
        print("open failed")

    #这里如果不加上一个while True,程序执行一次就自动跳出了
    while True:
        a = input("输入要发送的数据:")
        send(a)
        sleep(0.5)  # 起到一个延时的效果
        data =recv(serial)
        if data != '' :
            print("receive : ",data)
            if data == b'x':
                print("exit")
                break

关于Python实现串口通信的参考文章我都列到文末啦~感谢相关文章的大佬!

📜代码分析:
首先是包的导入:

import serial
from time import sleep

定义串口接收函数:

def recv(serial):
    while True:
        data = serial.read_all()
        if data == '':
            continue
        else:
            break
        sleep(0.02)
    return data

定义串口发送函数:

def send(send_data):
    if (serial.isOpen()):
        serial.write(send_data.encode('utf-8'))  # 编码
        print("发送成功", send_data)
    else:
        print("发送失败!")

主程序部分:

if __name__ == '__main__':
    serial = serial.Serial('COM3', 9600, timeout=0.5)
    if serial.isOpen() :
        print("open success")
    else :
        print("open failed")

    #这里如果不加上一个while True,程序执行一次就自动跳出了
    while True:
        a = input("输入要发送的数据:")
        send(a)
        sleep(0.5)  # 起到一个延时的效果
        data =recv(serial)
        if data != '' :
            print("receive : ",data)
            if data == b'x':
                print("exit")
                break

主程序部分的作用就是开启串口,在while循环中发送或者接收串口的数据,并且在接收到数据x之后,结束程序

需要注意的是,下面这部分代码中,9600为波特率,且需要输入正确的端口号,不然程序会报错!

serial = serial.Serial('COM3', 9600, timeout=0.5)

这部分是字符串前缀,前缀b表示该字符串是bytes类型

if data == b'x':

四、Stm32串口通信

4.1 硬件部分

参考板子的原理图,连接好OLED显示屏
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32
关于串口,本篇文章使用的是USART1,如下图:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32
引脚PA9是发送端,PA10是接收端,由于是TTL电平,所以需要一个USB转TTL的模块才可以与电脑的USB串口进行连接:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

如果需要这块stm32的实物开发板的话(低价出),可以联系我~

4.2 代码部分

在串口通信中,一般使用hex格式进行收发,但是在目前的代码中,我们发送的数据为字符串,所以在stm32的oled显示中,数据和发送的不一致。

参考文章:Python 串口发送十六进制数据。

修改Python中的发送和接收函数:

#以十六进制的格式发送数据
def send(send_data):
    send_data_hex = bytes.fromhex(send_data)
    if (serial.isOpen()):
        serial.write(send_data_hex)  # 编码
        print("发送成功", send_data_hex)
    else:
        print("发送失败!")
#以十六进制的格式接收数据
def recv(serial):
    while True:
        data = serial.read_all().hex()
        if data == '':
            continue
        else:
            break
        sleep(0.02)
    return data

以十六进制发送和接收的串口通信完整代码:

import serial
from time import sleep

def recv(serial):
    while True:
        data = serial.read_all().hex()
        if data == '':
            continue
        else:
            break
        sleep(0.02)
    return data

def send(send_data):
    send_data_hex = bytes.fromhex(send_data)
    if (serial.isOpen()):
        serial.write(send_data_hex)  # 编码
        print("发送成功", send_data_hex)
    else:
        print("发送失败!")

if __name__ == '__main__':
    serial = serial.Serial('COM3', 9600, timeout=0.5)
    if serial.isOpen() :
        print("open success")
    else :
        print("open failed")

    #这里如果不加上一个while True,程序执行一次就自动跳出了
    while True:
        a = input("输入要发送的数据:")
        send(a)
        sleep(0.5)  # 起到一个延时的效果
        data =recv(serial)
        if data != '' :
            print("receive : ",data)

✨注意:
本文章中stm32的数据接收和发送格式为

uint8_t Serial_RxData;
void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

这部分根据实际需求修改和调试即可。

展示修改后的通信效果,还有一些瑕疵,但是对于普通的项目可以使用了:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

下面给出stm32的部分代码:

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

uint8_t RxData;

int main(void)
{
	OLED_Init();
	OLED_ShowString(1, 1, "RxData:");
	
	Serial_Init();
	
	while (1)
	{
		if (Serial_GetRxFlag() == 1)
		{
			RxData = Serial_GetRxData();
			Serial_SendByte(RxData);
			OLED_ShowHexNum(1, 8, RxData, 2);
		}
	}
}

Serial.c:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
	}
}

int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}

uint8_t Serial_GetRxFlag(void)
{
	if (Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData;
}

void USART1_IRQHandler(void)
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);
		Serial_RxFlag = 1;
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

最后来两张和电脑连接的图片:
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32
python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

五、参考文章

python中串口通信的步骤及实现。

python实现串口收发。

详解Python中字符串前“b”,“r”,“u”,“f”的作用。

Python字符串前缀u、r、b、f含义。

Python Serial串口的简单数据收发。

python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

🧸结尾文章来源地址https://www.toymoban.com/news/detail-600748.html


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【FPGA零基础学习之旅#9】状态机基础知识
  • 【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
    python与stm32通信,Python学习专栏,stm32开发,python,stm32,开发语言,串口通信,嵌入式硬件,Python+Stm32

到了这里,关于【Python】Python实现串口通信(Python+Stm32)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32串口通信详解(嵌入式学习)

    STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(10)
  • FPGA与stm32实现串口通信(stm32发,FPGA收)

    FPGA与stm32实现串口通信(stm32发,FPGA收)

    要使用FPGA与STM32实现串口通信,以下是一般的步骤: 配置STM32的串口模块:使用STM32的库函数或者寄存器配置,选择一个可用的串口模块(例如USART1、USART2等)并设置相应的波特率、数据位、停止位等参数。确保STM32串口的引脚与FPGA连接正确。 配置FPGA与STM32之间的通信接口:

    2024年02月14日
    浏览(11)
  • STM32学习笔记3 正点原子miniSTM32串口通信实验

    STM32学习笔记3 正点原子miniSTM32串口通信实验

    初学者学习总结,如有错误,请大神指正 目的:用 STM32 的串口来发送和接收数据。 ALIENTEK MiniSTM32 V3 版开发板选择的是 STM32F103RCT6 作为 MCU,拥有5 个串口分别为 USART1、USART2、USART3、UART4、UART5, 其中只有USART1挂载在APB2总线上,其余均挂载在APB1总线上 APB1操作速度限于36MHz,A

    2024年02月04日
    浏览(10)
  • STM32通过DMA方式实现串口通信

    目录 一、DMA工作原理  二、创建工程项目 三、编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码

    2024年02月15日
    浏览(15)
  • STM32CubeMX实现USART串口通信

    STM32CubeMX实现USART串口通信

    硬件:stm32f103c8t6核心板 软件:STM32CubeMX 6.6.1 keil5 mdk 这里就不再详细介绍了,详细请参考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点

    2023年04月17日
    浏览(8)
  • STM32(1)-简单实现串口收发与通信

    STM32(1)-简单实现串口收发与通信

    本文通过串口收发实验来说明具体的串口的使用过程,以及与其他外设通过串口进行通信从而实现相关功能。 前言 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工,异步时钟控制,设备之间是点对点的传输。对应的STM32引脚分别是RX和TX端

    2024年02月08日
    浏览(7)
  • # STM32中断方式实现串口通信(标准库)

    # STM32中断方式实现串口通信(标准库)

    主要任务 : 1)当stm32接收到字符“s”时, 停止持续发送 “hello windows!”; 当接收到字符“t”时, 持续发送 “hello windows!”; 2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!” 实验工具: (1)软件 标

    2024年02月11日
    浏览(15)
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信(Serial Communications)实现单片机与电脑或者其它外设进行通信,通信时只需两根线(TX,RX)就可以实现数据传输。STM32f103有三个串口,分别为串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代码是配置三个串口: usart.c usart.h main.c 注意,

    2024年02月12日
    浏览(12)
  • 【嵌入式学习-STM32F103-USART串口通信】

    【嵌入式学习-STM32F103-USART串口通信】

    4-1 基本流程 4-2 整体代码 4-2-1 main.c 4-2-2 Serial.c 4-2-3 Serial.h 5-1 查询 5-2 中断 5-3 整体代码 5-3-1 main.c 5-3-2 Serial.c 5-3-3 Serial.h 6-1 使用状态机接收数据包的思路 6-2 串口收发HEX数据包 6-2-1 main.c 6-2-2 Serial.c 6-2-3 Serial.h 6-3串口收发文本数据包 6-3-1 main.c 6-3-2 Serial.c 6-3-3 Serial.h 全双工:打

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包