STM32之串口传输结构体

传输数据还可以,上位机解析数据耽误了一个下午的时间特此来记录一下!这里将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]);
        }

结果:

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

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值