STM32之串口传输结构体

本文介绍了一种STM32与QT上位机之间的数据传输方法,包括如何将16位数据拆分为8位数据进行发送,并详细展示了在上位机端解析这些数据的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传输数据还可以,上位机解析数据耽误了一个下午的时间特此来记录一下!这里将16位数据转成8位数据转发到上位机。

STM32端口

这次协议帧头定义的是 0xAA0xBB0xFF0xEE0xBB确保数据的准确性!!!

uint16_t VLpress  = 1000;

uint16_t AC1press = 999;

uint16_t AC2press = 998;

uint16_t ASpress  = 997;

uint16_t SRpress  = 996;

uint16_t BCpress  = 995;

typedef struct My_Test
{
  uint8_t head;     //帧头
	uint8_t head1;     //帧头
	
  uint8_t VLpressH;	//VL压力高八位
	uint8_t VLpressL; //VL压力低八位
	
	uint8_t AC1pressH;//AC1压力高八位
	uint8_t AC1pressL;//AC21力低八位
	
	uint8_t AC2pressH;//AC2压力高八位
	uint8_t AC2pressL;//AC2压力低八位
	
	uint8_t ASpressH; //AS高力低八位
	uint8_t ASpressL; //AS压力低八位
	
	uint8_t SRpressH; //SR压力高八位
	uint8_t SRpressL; //SR压力低八位
	
	uint8_t BCpressH; //BC压力高八位
	uint8_t BCpressL; //BC压力低八位
	
  uint8_t end;    //帧尾
	uint8_t end1;    //帧尾
	uint8_t end2;    //帧尾
	
}My_Test;
 
//实际使用
My_Test mytest;
 
void My_Struct_Test(My_Test *mytest)
{
	mytest->head = 			  0xAA;  //帧头数据
	mytest->head1 = 			0xBB;  //帧头数据
	
	mytest->VLpressH  =  ((VLpress&0xff00)>>8);
	mytest->VLpressL  =  (VLpress&0x00ff);
	
	mytest->AC1pressH =  ((AC1press>>8)&0xff);
	mytest->AC1pressL =  (AC1press&0xff);
	
	mytest->AC2pressH =  ((AC2press>>8)&0xff);
	mytest->AC2pressL =  (AC2press&0xff);
	
	mytest->ASpressH  =  ((ASpress>>8)&0xff);
	mytest->ASpressL  =  (ASpress&0xff);
	
	mytest->SRpressH  =  ((SRpress>>8)&0xff);
	mytest->SRpressL  =  (SRpress&0xff);
	
	mytest->BCpressH  =  ((BCpress>>8)&0xff);
	mytest->BCpressL  =  (BCpress&0xff);
	
  mytest->end = 		  0xFF;  //帧尾数据
	mytest->end1 = 		  0xEE;  //帧尾数据
	mytest->end2 = 		  0xBB;  //帧尾数据
}

发送函数定义,通过指针的方式发送结构体数据,一位一位的发送数据,直到发送完成!!!!

void send_data(My_Test*mytest,uint8_t len)
{
  static uint8_t* date=0,i=0;
  for(i=0;i<len;i++) //使用sizeof计算结构体
  {
    date = (((uint8_t *)&mytest->head)+i); //从帧头开始 然后依次向下指向
		HAL_UART_Transmit(&UART1_Handler,date,len,1000);	//发送接收到的数据
		while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
  }
}

在主函数中调用即可:

My_Struct_Test(&mytest);           //赋值
send_data(&mytest,sizeof(mytest)); //发送一个结构体

QT上位机解析数据!!!

因为没有把接收的数据进行类型转换,耽误了不少时间!!!

这里最关键的是要把接收数据的字节进行类型转换 VLpress = (((uchar)bytes.at(2)<<8)|(uchar)bytes.at(3)),必须要这样,否则会出错,显示负数!!!

/*
 * 串口接收数据并且解析数据
*/
void Widget::serialPortReadyRead()
{
    bytes = serialPort->readAll();
    bytes.resize(17);


    if((bytes.at(0) == '\xAA')&&(bytes.at(1) == '\xBB')&&(bytes.at(14) == '\xFF')&&(bytes.at(15) == '\xEE')&&(bytes.at(16) == '\xBB')){
        VLpress  = (((uchar)bytes.at(2)<<8)|(uchar)bytes.at(3)),
        AC1press = (((uchar)bytes.at(4)<<8)|(uchar)bytes.at(5)),
        AC2press = (((uchar)bytes.at(6)<<8)|(uchar)bytes.at(7)),
        ASPress  = (((uchar)bytes.at(8)<<8)|(uchar)bytes.at(9)),
        SRpress  = (((uchar)bytes.at(10)<<8)|(uchar)bytes.at(11)),
        BCpress  = (((uchar)bytes.at(12)<<8)|(uchar)bytes.at(13));
        StrI1 = QString::number(VLpress);
        StrI2 = QString::number(AC1press);
        StrI3 = QString::number(AC2press);
        StrI4 = QString::number(ASPress);
        StrI5 = QString::number(SRpress);
        StrI6 = QString::number(BCpress);
        QList <QString>list2;
        list2<<StrI1<<StrI2<<StrI3<<StrI3<<StrI5<<StrI6;
        for(int i = 0;i<6;i++){
          pressEdit[i]->setText(list2[i]);
        }

结果:

结果如图所示:
发送和接收的数据是一致的!!!!
请添加图片描述

STM32传输结构体的方法可以通过将结构体转换为字节数组来实现。在引用\[1\]中的代码中,通过使用sprintf函数将结构体Envmsg中的数据格式化为字符串,并存储在buffer数组中。然后,在sendenv函数中,通过调用add_struct函数来填充结构体。接下来,通过将结构体的地址强制转换为u8类型的指针,并指定传输的长度,使用USART_SendData函数将结构体数据通过串口发送出去。最后,通过循环等待发送完成的标志位,确保数据发送完整。 在主函数中,可以调用sendenv函数来发送结构体数据。例如,可以通过调用sendenv((u8*)&env, sizeof(Envmsg))来发送Envmsg结构体数据。 需要注意的是,接收方需要根据发送方的传输方式和结构体定义来解析接收到的数据。在引用\[3\]中提到了在QT上位机中解析数据的方法,但具体的实现细节需要根据实际情况进行调整。 #### 引用[.reference_title] - *1* *2* [使用stm32发送结构体中的数据](https://blog.csdn.net/qq_41923988/article/details/106505252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32串口传输结构体](https://blog.csdn.net/m0_46152793/article/details/126274699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值