总结zy_不定长数据帧的收发

1、接收部分

身份证模块串口接收解析:
#define CRC_16_CCITT 0x1021
unsigned short CRC16_CCITT(unsigned char* pchMsg, unsigned short wDataLen) // 1. MSB
{
unsigned char i, chChar;
unsigned short wCRC = 0;
while (wDataLen–)
{
chChar = *pchMsg++;
wCRC ^= (((unsigned short)chChar) << 8);
for (i = 0; i < 8; i++)
{
if (wCRC & 0x8000)
wCRC = (wCRC << 1) ^ CRC_16_CCITT;
else
wCRC <<= 1;
}
}
return wCRC;
}

uint32_t Dispose_Uart1RecData(void)
{
#define frame_head 0x7E

volatile static uint8_t rec_number = 0;
volatile static uint8_t state_machine = 0; //这里每接收一个字节,进入一个中断
volatile static uint8_t	rcvcou_temp = 0;
volatile static uint8_t	lencnt = 0;
volatile static uint8_t m_ucData[20] = {0}; 
volatile static uint8_t rec_dat = 0;
volatile static uint8_t rec_temp = 0;
volatile static uint8_t rec_len = 0;
volatile static uint8_t	len2cnt = 0;
volatile static uint8_t	rcv2cou = 0;

volatile static uint16_t rev_crc = 0;
volatile static uint8_t crc_h = 0;
volatile static uint8_t crc_l = 0;

rec_dat = (uint8_t)(huart1.Instance->DR); //中断接收到的单个数据;
if(state_machine == 0)     
{ 
	if(rec_dat == frame_head)      
	{
			lencnt = 0;           
			rcvcou_temp = 3;        // 第一个数据长度
		
		 rec_data[rec_number] = rec_dat; //rec_data保存接收到的数据
		 state_machine = 1; 
		 rec_number++;
	}
	else 
	{
			state_machine = 0;         
			rec_number = 0;					
	}
} 						
else if(1 == state_machine) 
{ 
	m_ucData[lencnt++] = rec_dat;  // m_ucData数据暂时不用,lencnt需要自加
	if(lencnt == rcvcou_temp)      // 已接收了第一个数据长度的数据 
	{
	 state_machine = 2; 				
	 rec_data[rec_number] = rec_dat;
	 rcv2cou = rec_data[3];	
	 len2cnt = 0;		
	 rec_number++;								
	}
	else 
	{
		rec_data[rec_number] = rec_dat; 
		rec_number++;					
	}						
} 
else if(2 == state_machine) 
{ 
	m_ucData[len2cnt++] = rec_dat;     
	if(2 == rcv2cou)
	{
		 state_machine = 4; 				
		 rec_data[rec_number] = rec_dat; 
		 rec_number++;			

		 rev_crc = CRC16_CCITT(rec_data+1,rec_number-2); //计算crc16		
		 crc_h = (uint8_t)(rev_crc & 0xff);
		 crc_l = (uint8_t)((rev_crc >> 8) & 0xff);						
	}
	else
	{
		if(len2cnt == (rcv2cou-2))
		{
		 state_machine = 3; 				
		 rec_data[rec_number] = rec_dat; 
		 rec_number++;			

		 rev_crc = CRC16_CCITT(rec_data+1,rec_number-1); //计算crc16		
		 crc_h = (uint8_t)(rev_crc & 0xff);
		 crc_l = (uint8_t)((rev_crc >> 8) & 0xff);							
		}			
		rec_data[rec_number] = rec_dat; 
		rec_number++;						
	}						
}  
else if(state_machine == 3) 
{ 
	if(crc_h == rec_dat)     
	{
		state_machine = 4; 
		rec_data[rec_number] = rec_dat;
		rec_number++;						
	}
	else 
	{
		state_machine = 0;       
		rec_number = 0;					
	}
} 
else if(state_machine == 4) 
{ 
	if(crc_l == rec_dat)      // 判断异或校验和是否相等 
	{

		rec_data[rec_number] = rec_dat;

		HAL_UART_Transmit(&huart1,rec_data,sizeof(rec_data),1000); //测试用
		//HAL_UART_Transmit(&huart1,&rec_dat,1,1000);	
		Parse_UartsDatas();			
		uart1_rev_finish_flag = 1;	//一帧数据接收完成标志; 		
		len2cnt	= 0;					
		state_machine = 0;      // 状态机复位 
		rec_number = 0;		
	}
	else 
	{
		state_machine = 0;     
		rec_number = 0;					
	}
} 
HAL_UART_Receive_IT(&huart1, (uint8_t *)&rec_temp, 1); //重新使能串口接收中断
return 0;

}

2、发送部分总结:
对于不定长数据帧,结构体中帧尾和校验就不能有,直接是data[]数据,校验后计算给出帧尾和校验
3、通信协议:(见自定义的—身份证模块通讯协议)
1、协议说明
串口设置:115200,8 数据位、1 停止位、无校验
协议构成
帧头 功能码 子功能码 数据长度 命令数据 校验位
1Byte 1Byte 1Byte 1Byte nByte(n>0) 2Byte
帧头:十六进制表示;固定为7E。
数据长度:十六进制表示;功能码、子功能码、命令数据的长度之和。
功能码:功能码用于标识执行不同的功能,长度为1个字节,可以根据需要完成的功能来进行相应的定义。
子功能码:
子功能码是对功能码的细化,长度为1个字节。其中子功能码的最高位0表示发送的请求,最高位1表示返回的响应。
命令数据:多字节时低字节在前,高字节在后。
校验位: 2字节。根据数据包(从“功能码”计算到“命令数据”)生成CRC校验值。校验单元采用CRC校验,生成多项式为CCITT推荐的16位的0x11021。发送方生成2字节的CRC校验(传输时低字节在前,高字节在后);同样,接收方收到完整的数据包后,生成新的CRC校验值。如果所计算出的CRC值和收到的校验值相等则表明该校验值有效,否则认为该包在传输过程中产生了差错。对校验出错的命令,接收方不处理也不返回任何的应答。
注1:命令数据中的数据大于1Byte的数据采用小端模式(低字节在前,高字节在后)。所有均需主机下发指令读取,从机不会主动上报任何数据。
注2:一包发送数据的总长度不得超过 250 Byte。

2、功能码与子功能码
表2-1功能码与子功能码
在这里插入图片描述

3、功能码表
在这里插入图片描述

4、指令详细说明
4.1 查询系统板状态(0x01)
控制板发送命令如下:
7E 01 01 02 43 24 (对系统板1的查询);
系统板返回命令示例如下:
7E 81 01 03 01 CE D9(系统板1在线)
(系统板1不在线,将无响应数据)
控制板发送命令如下:
7E 01 02 02 10 71 (对系统板2的查询,对另3个系统板查询子功能码参考表2-1功能码与子功能码);
系统板返回命令示例如下:
7E 81 02 02 01 AF B3(系统板2在线)
(系统板2不在线,将无响应数据)

4.2 开始系统板测试(0x02)
控制板发送命令如下:
7E 02 01 02 13 7D (对系统板1的开始测试命令,对另4个系统板开始测试子功能码参考表2-1功能码与子功能码);
系统板返回命令示例如下:
7E 82 01 02 49 46(及时响应命令)
7E 82 01 06 01 01 01 01 AB 21(4路身份证模块测试完成后,响应的测试结果命令,测试正常为01,测试失败为00);
4.3 重启系统板(0x03)
控制板发送命令如下:
7E 03 00 02 12 79(无子功能码时候,默认为00)
系统板返回命令示例如下:
7E 83 00 02 48 42
4.4 读取系统板软件版本号(0x04)
控制板发送命令如下:
7E 04 00 02 82 FC(无子功能码时候,默认为00)
系统板返回命令示例如下:(V01.03.01.201230)
7E 84 00 12 56 30 31 2E 30 33 2E 30 31 2E 32 30 31 32 33 30 FC 98
4.5 停止USB测试(0x05)暂时不用
控制板发送命令如下:
7E 05 00 02 B2 CB
系统板返回命令示例如下:
7E 85 00 02 E8 F0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/430455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑安装原版Windows7详细教程

前言 截止2024年3月3日&#xff0c;仍然有不少小伙伴想给电脑安装Windows7。所以今天给小伙伴们出一篇电脑安装原版Windows7的详细教程。 首先要知道部分CPU&#xff08;第六代或以上英特尔、AMD Ryzen系列&#xff09;平台并不支持Windows7&#xff0c;原因是有部分硬件设备…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型&#xff1a;数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据&#xff0c;例如用户设备类型、浏览器版本、页面浏览量&#xff08;…

【MGR】MySQL Group Replication 背景

目录 17.1 Group Replication Background 17.1.1 Replication Technologies 17.1.1.1 Primary-Secondary Replication 17.1.1.2 Group Replication 17.1.2 Group Replication Use Cases 17.1.2.1 Examples of Use Case Scenarios 17.1.3 Group Replication Details 17.1…

每日一题——LeetCode1582.二进制矩阵中的特殊位置

方法一 模拟 先把矩阵每一行和每一列中1的数量统计出来&#xff0c;然后遍历矩阵&#xff0c;元素为1的位置看他所在的行和列的1的数量是否都为1即为满足题意的点 var numSpecial function(mat) {let m mat.length, n mat[0].lengthlet rows new Array(m).fill(0)let col…

SOAPHound:一款功能强大的基于ADWS协议的活动目录环境枚举工具

关于SOAPHound SOAPHound是一款功能强大的基于ADWS协议的活动目录环境枚举工具&#xff0c;该工具本质上是一个.NET数据收集工具&#xff0c;可以帮助广大研究人员通过活动目录Web服务&#xff08;ADWS&#xff09;协议来收集目标活动目录的相关数据&#xff0c;从而实现活动目…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件内容模糊)

为当前组件添加内容模糊效果。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 foregroundBlurStyle foregroundBlurStyle(value: BlurStyle, options?: ForegroundBlurStyleOptions) 为当前组件提供…

【前端】i18n Ally插件使用

效果展示&#xff1a; 当鼠标放上去 vscode扩展搜i18n Ally 由于每个项目的语言可能做的都不一样&#xff0c;会导致无法找到真正的路径位置&#xff0c;所以我推荐 在项目的根目录找到.vscode再找到settings.json编辑它 比如我的翻译文件en.ts和zh-CN.ts&#xff0c;都在s…

Android使用陀螺仪

Android使用陀螺仪 陀螺仪基础运用与理解 在Android应用中使用陀螺仪可以帮助实现各种功能&#xff0c;比如游戏控制、虚拟现实体验、运动追踪等。以下是使用Android陀螺仪的基本步骤&#xff1a; 获取传感器服务&#xff1a; 首先&#xff0c;需要获取设备上的陀螺仪传感器服…

Java8 使用 stream().sorted()对List集合进行排序

集合对像定义 集合对象以学生类&#xff08;StudentInfo&#xff09;为例&#xff0c;有学生的基本信息&#xff0c;包括&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;身高&#xff0c;生日几项。 使用stream().sorted()进行排序&#xff0c;需要该类实现 C…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

Python开发工具:pycharm使用注意事项以及设置

上一篇文章写了pycharm的安装以及运行&#xff0c;但是在安装过程中遇到了一些问题&#xff0c;接下来详细解析安装过程中遇到的问题&#xff0c;注意事项以及设置配置依赖等信息 安装遇到的问题&#xff1a; 协议许可证关闭不了&#xff1a;PyCharm安装完成后&#xff0c;打…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开&#xff0c;为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…

文件上传之图片马

图片马介绍 图片马&#xff1a;就是在正常图片中插入木马。 图片马的制作 1.我们先创建php木马文件1.php&#xff0c;内容有以下两种方式&#xff1a; <?php eval($_POST[a]); ?> /* 常规一句话木马 */ <?php $aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8; $myfile…

Python图像处理【21】基于卷积神经网络增强微光图像

基于卷积神经网络增强微光图像 0. 前言1. MBLLEN 网络架构2. 增强微光图像小结系列链接 0. 前言 在本节中&#xff0c;我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素&#xff0c;因此微光图像增…

Qt::TabWidget

在Tab的右上角添加控件 QPushButton *add new QPushButton; add->setText(""); add->resize(30,30); ui->tabWidget->setCornerWidget(add,Qt::TopRightCorner); 结果&#xff1a; Tab添加子页 QWidget*newp new QWidget; ui->tabWidget->add…

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员&#xff0c;都在琢磨&#xff0c;怎么让大模型“涌现”。 所谓“涌现”&#xff0c;在大模型领域指的是当模型突破某个规模时&#xff0c;性能显著提升&#xff0c;表现出让人惊艳、意想不到的能力。比如…

【进击的算法】动态规划——01背包

&#x1f37f;本文主题&#xff1a;动态规划 01背包 背包问题 C/C 算法 &#x1f388;更多算法&#xff1a;基础回溯算法 基础动态规划 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录 一、前言二、概念✔️动态规划概念✔️01背包的概念 三、问题描述与讲解&#…

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…