当前位置: 首页 > news >正文

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

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]为0x5ablue_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],判断是否为0x01blue_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);}}	

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python爬虫技术 第08节 Cookies和Session
  • Linux用户和权限
  • 《Techporters架构搭建》-Day03 功能权限设计
  • 【Ubuntu】Ubuntu 配置镜像源(ARM)
  • Mojo编程语言
  • DATEDIFF()- Date Functions-SQL函数
  • Spring Boot 注解 @PostConstruct 介绍
  • 二百四十五、海豚调度器——用DolphinScheduler调度执行复杂的HiveSQL(HQL包含多种海豚无法正确识别的符号)
  • Python药物副作用生物图分析算法和矩阵降维算法
  • 2022.11.17 阿里钉钉数据开发岗位一面
  • PyEcharts知识点详解(每张图都有!)(巨详细!!)
  • BGP路由反射器
  • Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)
  • mysql字符类型字段设置默认值为当前时间
  • react配置代理的3中方法
  • ES6指北【2】—— 箭头函数
  • Android优雅地处理按钮重复点击
  • Apache Pulsar 2.1 重磅发布
  • Java-详解HashMap
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MySQL-事务管理(基础)
  • redis学习笔记(三):列表、集合、有序集合
  • RxJS: 简单入门
  • SpingCloudBus整合RabbitMQ
  • yii2权限控制rbac之rule详细讲解
  • 笨办法学C 练习34:动态数组
  • 前端攻城师
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 推荐一个React的管理后台框架
  • 线性表及其算法(java实现)
  • 栈实现走出迷宫(C++)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​2020 年大前端技术趋势解读
  • ​ArcGIS Pro 如何批量删除字段
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!Dom4j 学习笔记
  • # dbt source dbt source freshness命令详解
  • #### go map 底层结构 ####
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (007)XHTML文档之标题——h1~h6
  • (k8s)Kubernetes本地存储接入
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)SpringBoot3---尚硅谷总结
  • .net core 的缓存方案
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 按比例显示图片的缩略图
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET简谈设计模式之(单件模式)
  • ??eclipse的安装配置问题!??
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce