首页 > Python资料 博客日记
【Python】Python实现串口通信(Python+Stm32)_python串口通信
2024-08-11 16:00:07Python资料围观63次
Python和Stm32实现串口通信演示
🥝图片展示:
PyCharm端发送数据:
stm32接收数据并回传:
二、说明
Python技能树:Python入门技能树。
版本:Python 3.10。
IDE:PyCharm。
自制Stm32f103原理图与PCB:【stm32开发】stm32+oled最小系统板资料(原理图、PCB、示例代码)【六一】
需要本文章完整项目文件的话(Python串口通信代码+stm32-oled最小系统板资料+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显示屏:
关于串口,本篇文章使用的是USART1,如下图:
引脚PA9
是发送端,PA10
是接收端,由于是TTL电平
,所以需要一个USB转TTL
的模块才可以与电脑的USB串口进行连接:
如果需要这块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);
}
这部分根据实际需求修改和调试即可。
展示修改后的通信效果,还有一些瑕疵,但是对于普通的项目可以使用了:
下面给出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;
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/2941d904b66cefcccb3135102dc776da.png)
![img](https://img-blog.csdnimg.cn/img_convert/03c8c72945ec6d3b62236d34753f2755.png)
![img](https://img-blog.csdnimg.cn/img_convert/15147a3308f63432da98d67371e81d3b.png)
![img](https://img-blog.csdnimg.cn/img_convert/63fde6160ab67e62982a0d1a7d1d9f72.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
2733)]
[外链图片转存中...(img-H7KnjOOk-1712963112733)]
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj