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

news2024/9/24 13:19:39

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

符号函数Sign(博途PLC SCL代码)

符号函数在ADRC自抗扰算法里会有涉及,同时在滑膜控制里也会用到,这篇博客我们介绍符号函数在博途PLC里的实现。 1、ADRC自抗扰算法: https://rxxw-control.blog.csdn.net/article/details/126547180https://rxxw-control.blog.csdn.net/article/details/1265471802、模拟量…

虚拟机内存不够用了?全流程操作Look一下?

虚拟机信息&#xff1a;操作系统&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主机 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虚拟机用久了就会出现内存不足…

Java知识点总结(二)

ID生成策略 主键自增id 主键自动增长&#xff0c;不用手工设值、数字型&#xff0c;占用空间小、检索非常有利、有顺序&#xff0c;不会重复&#xff0c;但在迁移旧数据是会出现id冲突 UUID 基于时间&#xff0c;计数器和地址生成32位的id redis生成id 原子性自增&#xff0c;并…

Python 关于函数的使用

一、学习目标 1&#xff0e;掌握函数定义和调用。 2&#xff0e;掌握函数形参与实参的使用。 3&#xff0e;熟练掌握lambda表达式使用。 二、相关练习 1.建立自定义函数实现计算圆的面积和球的体积。 def Count(radius):area 3.14*radius**2volume (4/3)*3.14*radius*…

C 判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

C语言快速入门之指针详解

一.指针基础 1.指针定义的理解 就像我们住房子划分房间一样&#xff0c;在系统中&#xff0c;内存会被划分为多个内存单元&#xff0c;一个内存单元大小是一个字节&#xff0c;我们在搜索房间时有门牌号&#xff0c;与之类似&#xff0c;每个内存单元都会有一个编号 地址 指…

UCSF DOCK 分子对接详细案例(05)- 遗传算法用于分子生成 DOCK_GA

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、软件及操作环境二、遗传算法三、结构文件准备四、 DOCK_GA4.1 Fragment Library Generation4.2 运行 GA没有RDKit编译的情况RDKit编译的情况在服务器上运行 总结参考资料 前言 本文是UCSF DOC…

能源大数据采集,为您提供专业数据采集服务

随着经济的不断发展&#xff0c;能源产业也逐渐成为国民经济的支柱产业之一。而对于能源行业来说&#xff0c;数据采集是一项至关重要的工作。以往&#xff0c;能源企业采集数据主要依靠人工收集、整理&#xff0c;但是这种方式不仅效率低下&#xff0c;而且容易出现数据不准确…

Spring——Bean的作用域

bean的作用域 Bean Scope Scope说明singleton&#xff08;默认情况下&#xff09;为每个Spring IoC容器将单个Bean定义的Scope扩大到单个对象实例。prototype将单个Bean定义的Scope扩大到任何数量的对象实例。session将单个Bean定义的Scope扩大到一个HTTP Session 的生命周期…

Python 面向对象编程——类的使用

一、学习目标 1&#xff0e;掌握类的定义和实例化对象。 2&#xff0e;熟练掌握类的构造函数__init__使用。 3&#xff0e;掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy()&#xff0c;创建名字为“小汽车”、“手枪”和“积木”的玩具实例&#xff0c;计…

qt cmake添加resource文件

文章目录 方式一:方式二:qrc的使用 两种方式 方式一: 创建一个qrc文件&#xff0c;在qt_add_executable 中直接添加 qt_add_executable(helloworldmain.cppimageresources.qrc )方式二: 使用 qt_add_resources qt_add_resources(helloworld "app_images"PREFIX &…

tomcat nginx 动静分离

实验目的:当访问静态资源的时候&#xff0c;nginx自己处理 当访问动态资源的时候&#xff0c;转给tomcat处理 第一步 关闭防火墙 关闭防护 代理服务器操作&#xff1a; 用yum安装nginx tomcat &#xff08;centos 3&#xff09;下载 跟tomcat&#xff08;centos 4&#xff0…

循环队列:一道使数据结构萌新知道什么是“愁滋味“的题目

这破题目肝了我一天半才搞明白,也正是因为这道题目,我才豁然明白了李煜所说的"剪不断,理还乱...别是一般滋味在心头"到底是什么"滋味".在完全搞明白之前,真的是放有放不下,理也理不清... 但是理解之后你会发现,嘛い---,也就那么个回事嘛O(∩_∩)O 目录 1…

瑞_Redis_短信登录(一)

文章目录 项目介绍1 项目准备1.1 导入SQL1.2 导入后端项目1.2 导入前端项目 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识&#xff0c;所以本系列专栏主要是针对该…

Tonka Finance,BTCFi 浪潮的发动机

在 2023 年年初&#xff0c;Ordinals 技术方案为比特币 Layer1 带来了一种全新的资产发行方式&#xff0c;此后一场以比特币生态为主战场的新一轮资金、注意力价值争夺战打响&#xff0c;并且越来越多的加密原教旨主义者、密码极客们加入这场战争中。我们看到&#xff0c;铭文市…

【操作系统概念】 第1章:导论

文章目录 关于本书内容0.前言1.1操作系统的功能1.1.1 用户视角1.1.2 系统视角1.1.3 操作系统的定义 1.2 计算机系统的组成1.2.1 计算机系统的运行1.2.2 存储结构1.2.3 I/O结构 1.3 计算机系统体系结构1.4 操作系统的结构1.5 操作系统的执行1.5.1 双重模式与多重模式的执行1.5.2…

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…

【AI视野·今日Sound 声学论文速览 第五十一期】Mon, 4 Mar 2024

AI视野今日CS.Sound 声学论文速览 Mon, 4 Mar 2024 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers VoxGenesis: Unsupervised Discovery of Latent Speaker Manifold for Speech Synthesis Authors Weiwei Lin, Chenhang He, Man Wai Mak, …

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段&#xff1a;构建执行函数&#xff1b;执行阶段&#xff1a;代码依次执行 2.代码块&#xff1a;{ } 3.变量声明方式var 有声明提升&#xff0c;允许重复声明&#xff0c;声明函数级作用域 访问&#xff1a;声明后访问都是正常的&…

最新LangChain+GLM4开发AI应用程序系列(三):RAG检索增强生成篇

最新LangChainGLM4开发AI应用程序系列&#xff08;三&#xff09;&#xff1a;RAG检索增强生成篇 一、前言二、RAG介绍1、文档加载器2、文本分割器3、嵌入模型4、向量数据库 三、RAG开发案例1、创建智谱GLM4大模型对象2、加载文档3、文本分割4、向量化存储5、向量库检索6、生成…