首页 > 编程语言 >STM32自定义协议串口接收解析指令程序

STM32自定义协议串口接收解析指令程序

时间:2024-07-27 16:54:19浏览次数:10  
标签:blue break 自定义 receive usart3 STM32 串口 buf 1Byte

1、在使用串口接收自定义协议指令时,需要串口解析收到的是什么指令,举例通信报文为

上位机->单片机

名称

长度

备注

帧头

1Byte

0x5A 0x5A

帧长度

1Byte

数据包的长度0x00-0xFF

数据包

命令字

1Byte

功能标识

数据

可以为空

校验

1Byte

数据包所有字节按位异或

单片机->上位机

名称

长度

备注

帧头

1Byte

0xA5 0xA5

帧长度

2Byte

数据包的长度0x0000-0xFFFF

数据包

命令字

1Byte

功能标识

数据

可以为空

校验

1Byte

数据包所有字节按位异或

那么,在单片机机收到上位机的指令后需要解析命令字是什么,然后做相应的功能处理。

2、此时的串口接收解析处理函数可以采用状态机的方法来处理:

首先,在main函数中的while循环之前第一次接收数据

 HAL_UART_Receive_IT(&huart3,&ble_rec_buf,1);//接收数据

然后中断回调函数如下编写

//接收回调函数---接收数据解析
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	 

	if(huart==&huart3)
		{
												
      switch(usart3_state)
			{
				case 0:  //如果收不到0x5a,则跳出switch,如果收到则进入case1,blue_receive_buf[0]为0x5a
					    blue_receive_buf[0]=ble_rec_buf;
				      if(blue_receive_buf[0]==0x5a)
							{
								usart3_state=1;
								usart3_cnt=1;
							}
							else 
							{
								usart3_state=0;
							}
							break;		
				case 1:   //在case1中接着接收数据0x5a  0x01(长度) 0x01(命令),分别存放在blue_receive_buf[1]、blue_receive_buf[2]、blue_receive_buf[3]
					    blue_receive_buf[usart3_cnt]=ble_rec_buf;
				      usart3_cnt++;
				     if(usart3_cnt>3)
						 {
							 usart3_state=2;
						 }
						 else
						 {
							 usart3_state=1;
						 }
             break;					
				case 2://最后接收校验码blue_receive_buf[4],判断是否为0x01
					  blue_receive_buf[usart3_cnt]=ble_rec_buf;
				    if(blue_receive_buf[usart3_cnt]==0x01)//如果收到的校验码正确
						{
									switch(blue_receive_buf[2])
									{
										case 1://如果命令为0x01,则为查询历史数据
													blue_transmite_flag=1;
													break;
										case 2:
													break;
										case 3:
													break;
										default:
												 break;
									} 
						}
						break;
						
					default:
                  break;
					
			}


								 
						 
					HAL_UART_Receive_IT(&huart3, &ble_rec_buf, 1);
	  }

	}	

这种方法可以解析不同的通信指令,而不存在串口收到的数据是不定长的而无法处理的问题。

标签:blue,break,自定义,receive,usart3,STM32,串口,buf,1Byte
From: https://blog.csdn.net/jacklood/article/details/140693807

相关文章

  • STM32 串行FLASH W25Q64 移植文件系统FatFs ——(2)
    引言简述本篇文章目标:介绍如何将FatFs文件系统移植到STM32平台上的W25Q64串行FLASH。回顾上篇内容:软件模拟SPI驱动的实现。一、FatFs文件系统简介文件系统相对庞大且复杂,需要根据具体应用的文件系统格式进行编写。通常,文件系统与底层驱动分离,便于移植。因此,在实际工程应......
  • YOLOv8-seg——基于自定义数据集训练图像分割模型
    目录一、制作分割数据集1标注2json文件转txt文件3数据集划分二、训练图像分割模型1环境搭建2训练网络3预测三、训练结果解读一.制作分割数据集1标注运用labelme软件进行手动标注,得到数据的json格式标注文件。*注意区别于labelimg软件,labelimg软件对每个......
  • 渲染三角形(自定义数据)并平移的关键代码/(OpenGL)
    废话不多说,先上结果:图1 渲染一个三角形并移动 图2打印坐标关键代码:(1)glBegin、glEnd这两个函数之间的代码用于定义要绘制的图形;glColor3f:设置顶点颜色;glVertex3f:设置顶点位置因为涉及需要打印移动前后的三角形顶点的坐标矩阵,所以在绘制三角形的时候,三角形顶点可以......
  • 训练的韧性:Mojo模型中自定义训练中断与恢复机制的实现
    训练的韧性:Mojo模型中自定义训练中断与恢复机制的实现在机器学习模型的开发过程中,训练过程可能会因为多种原因(如硬件故障、电源中断等)被迫中断。Mojo模型,作为一个泛指,可以代表任何机器学习或深度学习模型。支持模型的自定义训练中断和恢复机制,可以显著提高模型训练的稳定性......
  • 【微信小程序开发】API使用、自定义组件、页面实现图解超详细
    文章目录常用API消息交互消息加载转发给朋友模态对话框获取用户信息调起客户端扫码界面发起支付获取位置自定义组件创建自定义组件使用自定义组件组件生命周期组件所在页面的生命周期页面实现淘宝订单简化页面饮品订单简化页面本篇总结更多相关内容可查看常用......
  • 2024年最新STM32单片机简介
    一、STM32简介    STM32是ST公司基于ARMCortex-M内核开发的32位微控制器。    STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等。    STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的......
  • STM32+ESP8266-连接阿里云-创建云产品流转实现STM32与Android app通讯(1)
    前言本文章的内容为STM32通过ESP8266利用AT指令连接阿里云平台,并创建设备和创建云产品流转主题,来为实现Androidapp与STM32的发送接收数据做准备。Androidapp的实现由于篇幅不宜过长,将放到下一篇文章中。演示视频实现一个简单的app来控制stm32开关灯、蜂鸣器、门(舵机),显示温......
  • STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置
    前言​ 为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在不敢恭维,经常出现Makefile未同步导致符号定义冲突,......
  • Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应
    什么是授权(Authorization)?在ASP.NETCore中,授权(Authorization)是控制对应用资源的访问的过程。它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作。授权通常与身份验证(Authentication)一起使用,身份验证是验证用户身份的过程,授权与身份验证相互独立,但是,授权需要一种身......
  • 解密黑盒:Mojo模型中自定义模型解释性报告的动态生成
    解密黑盒:Mojo模型中自定义模型解释性报告的动态生成在机器学习领域,模型的可解释性是一个至关重要的议题。Mojo模型,作为一个通用术语,可以指代任何机器学习或深度学习模型。随着模型被集成到生产环境中,提供模型决策的透明度和可解释性变得尤为关键。本文将探讨如何在Mojo模型......