|
Python和Stm32实现串口通信演示🥝图片展示:PyCharm端发送数据:stm32接收数据并回传:二、说明Python技能树:Python入门技能树。版本:Python3.10。IDE:PyCharm。自制Stm32f103原理图与PCB:【stm32开发】stm32+oled最小系统板资料(原理图、PCB、示例代码)【六一】需要本文章完整项目文件的话(Python串口通信代码+stm32-oled最小系统板资料+stm32串口通信完整项目),可以从该链接下载:【Python+Stm32串口通信】完整项目资料,或者三连本文章之后私聊我免费领取哦~三、Python串口通信代码详解3.1包下载直接:pipinstallpyserial12然后等待包的下载和安装完成。3.2代码详解先上本次文章的完整代码:importserialfromtimeimportsleepdefrecv(serial):whileTrue:data=serial.read_all()ifdata=='':continueelse:breaksleep(0.02)returndatadefsend(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)ifserial.isOpen():print("opensuccess")else:print("openfailed")#这里如果不加上一个whileTrue,程序执行一次就自动跳出了whileTrue:a=input("输入要发送的数据:")send(a)sleep(0.5)#起到一个延时的效果data=recv(serial)ifdata!='':print("receive:",data)ifdata==b'x':print("exit")break123456789101112131415161718192021222324252627282930313233343536373839关于Python实现串口通信的参考文章我都列到文末啦~感谢相关文章的大佬!📜代码分析:首先是包的导入:importserialfromtimeimportsleep123定义串口接收函数:defrecv(serial):whileTrue:data=serial.read_all()ifdata=='':continueelse:breaksleep(0.02)returndata12345678910定义串口发送函数:defsend(send_data):if(serial.isOpen()):serial.write(send_data.encode('utf-8'))#编码print("发送成功",send_data)else:print("发送失败!")1234567主程序部分:if__name__=='\_\_main\_\_':serial=serial.Serial('COM3',9600,timeout=0.5)ifserial.isOpen():print("opensuccess")else:print("openfailed")#这里如果不加上一个whileTrue,程序执行一次就自动跳出了whileTrue:a=input("输入要发送的数据:")send(a)sleep(0.5)#起到一个延时的效果data=recv(serial)ifdata!='':print("receive:",data)ifdata==b'x':print("exit")break12345678910111213141516171819主程序部分的作用就是开启串口,在while循环中发送或者接收串口的数据,并且在接收到数据x之后,结束程序。需要注意的是,下面这部分代码中,9600为波特率,且需要输入正确的端口号,不然程序会报错!serial=serial.Serial('COM3',9600,timeout=0.5)12这部分是字符串前缀,前缀b表示该字符串是bytes类型:ifdata==b'x':12四、Stm32串口通信4.1硬件部分参考板子的原理图,连接好OLED显示屏:关于串口,本篇文章使用的是USART1,如下图:引脚PA9是发送端,PA10是接收端,由于是TTL电平,所以需要一个USB转TTL的模块才可以与电脑的USB串口进行连接:如果需要这块stm32的实物开发板的话(低价出),可以联系我~4.2代码部分在串口通信中,一般使用hex格式进行收发,但是在目前的代码中,我们发送的数据为字符串,所以在stm32的oled显示中,数据和发送的不一致。参考文章:Python串口发送十六进制数据。修改Python中的发送和接收函数:#以十六进制的格式发送数据defsend(send_data):send_data_hex=bytes.fromhex(send_data)if(serial.isOpen()):serial.write(send_data_hex)#编码print("发送成功",send_data_hex)else:print("发送失败!")123456789#以十六进制的格式接收数据defrecv(serial):whileTrue:data=serial.read_all().hex()ifdata=='':continueelse:breaksleep(0.02)returndata1234567891011以十六进制发送和接收的串口通信完整代码:importserialfromtimeimportsleepdefrecv(serial):whileTrue:data=serial.read_all().hex()ifdata=='':continueelse:breaksleep(0.02)returndatadefsend(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)ifserial.isOpen():print("opensuccess")else:print("openfailed")#这里如果不加上一个whileTrue,程序执行一次就自动跳出了whileTrue:a=input("输入要发送的数据:")send(a)sleep(0.5)#起到一个延时的效果data=recv(serial)ifdata!='':print("receive:",data)12345678910111213141516171819202122232425262728293031323334353637✨注意:本文章中stm32的数据接收和发送格式为:uint8\_tSerial_RxData;12voidSerial\_SendByte(uint8\_tByte){ USART\_SendData(USART1,Byte); while(USART\_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}123456这部分根据实际需求修改和调试即可。展示修改后的通信效果,还有一些瑕疵,但是对于普通的项目可以使用了:下面给出stm32的部分代码:main.c:#include"stm32f10x.h"//Deviceheader#include"Delay.h"#include"OLED.h"#include"Serial.h"uint8\_tRxData;intmain(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); } }}1234567891011121314151617181920212223242526Serial.c:#include"stm32f10x.h"//Deviceheader#include#includeuint8\_tSerial_RxData;uint8\_tSerial_RxFlag;voidSerial\_Init(void){ RCC\_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDefGPIO_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_InitTypeDefUSART_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)**1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
|
|