Python串口数据打包发送STM32接收数据解析

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)) ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值