完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Python串口数据打包发送STM32接收数据解析
尝试使用python中的struct.pack函数打包数据通过串口发送,由STM32接收解析。 1、 struct.pack: struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, …表示要转换的python值。 2、 struct.unpack: struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 上述fmt中,支持的格式为: 注1.q和Q只在机器支持64位操作时有意思; 注2.每个格式前可以有一个数字,表示个数; 注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串; 注4.P用来转换一个指针,其长度和机器字长相关; 注5.最后一个可以用来表示指针类型的,占4个字节; 为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下: python端代码如下: import serial import struct import time # 串口号 默认为 /dev/ttyUSB0 #ser_dev = '/dev/ttyUSB1' ser_dev ='com1' # 创建一个串口实例 ser = serial.Serial(ser_dev, 115200, timeout=1, bytesize=8) def pack_bin_data(bottom_degree, top_degree): ''' h: unsigned short bit=2 b: unsigned char (byte): bit =1 ''' bin_data = struct.pack(">iiBB", # 大端存储 int(a), # 数据1 int(b), # 数据2 0x0D, # 帧尾 0x0A) # 结束符 'n = 0x0A return bin_data ser.write(bin_data ) big-Endian和little-Endian区别: 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。 例如0x12345678 ,在大端模式的排列:0x01(低地址),0x23,0x45,0x67,0x89(高地址)。 在小端模式的排列:0x89(低地址),0x67,0x45,0x23,0x01(高地址)。 32端解析函数如下: / //串口1中断服务程序 void USART1_IRQHandler(void) { u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. u16 USART_RX_STA=0; //接收状态标记 u8 Res; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a) USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000;//接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1)) USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntExit(); #endif } void Data_depack(u8 *data_buf,u8 num) { int btm_degree,top_degree; /* 读取btm角度原始数据 */ btm_degree = (int)(*(data_buf+0)) | (int)(*(data_buf+1)) | (int)(*(data_buf+2)) | (int)(*(data_buf+3)) /* 读取top角度原始数据 */ top_degree = (int)(*(data_buf+4)) | (int)(*(data_buf+5)) | (int)(*(data_buf+6)) | (int)(*(data_buf+7)) ; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
740浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
577浏览 3评论
600浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
562浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 06:32 , Processed in 0.828728 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号