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

STM32-USART串口数据包

一:HEX数据包发送

1.为了收发数据包,先定义两个缓存区的数组 ,这4个数据只存储发送或者接收的载荷数据,包头和包尾不存

uint8_t Serial_TxPacket[4];
uint8_t Serial_RxPacket[4];
uint8_t Serial_RxFlag;//接收一个数据包就置Flag

 2.封装一个Serial_SendPacket函数,我想要的效果是,调用一下这个函数,TxPacket数组的4个数据就会自动加上包头包尾发送出去

void Serial_SendPacket(void)
{
	Serial_SendByte(0xFF);//发送包头
	Serial_SendArray(Serial_TxPacket,4);//发4个载荷数据
	Serial_SendByte(0xFE);//发送包尾
}

 3.调用

    Serial_TxPacket[0]=0x02;
	Serial_TxPacket[1]=0x04;
	Serial_TxPacket[2]=0x06;
	Serial_TxPacket[3]=0x08;

4.结果,按复位发送数据

二:HEX数据包接收 

下图是状态机

 1.在接收中断函数里,我们需要用状态机来执行接收逻辑,接收数据包,然后把载荷数据存在RxPacket数组里

/**
  * 函    数:USART1中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void USART1_IRQHandler(void)
{
	static uint8_t RxState = 0;		//定义表示当前状态机状态的静态变量
	static uint8_t pRxPacket = 0;	//定义表示当前接收数据位置的静态变量
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		//判断是否是USART1的接收事件触发的中断
	{
		uint8_t RxData = USART_ReceiveData(USART1);				//读取数据寄存器,存放在接收的数据变量
		
		/*使用状态机的思路,依次处理数据包的不同部分*/
		
		/*当前状态为0,接收数据包包头*/
		if (RxState == 0)
		{
			if (RxData == 0xFF)			//如果数据确实是包头
			{
				RxState = 1;			//置下一个状态
				pRxPacket = 0;			//数据包的位置归零
			}
		}
		/*当前状态为1,接收数据包数据*/
		else if (RxState == 1)
		{
			Serial_RxPacket[pRxPacket] = RxData;	//将数据存入数据包数组的指定位置
			pRxPacket ++;				//数据包的位置自增
			if (pRxPacket >= 4)			//如果收够4个数据
			{
				RxState = 2;			//置下一个状态
			}
		}
		/*当前状态为2,接收数据包包尾*/
		else if (RxState == 2)
		{
			if (RxData == 0xFE)			//如果数据确实是包尾部
			{
				RxState = 0;			//状态归0
				Serial_RxFlag = 1;		//接收数据包标志位置1,成功接收一个数据包
			}
		}
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);		//清除标志位
	}
}

 2.结果

发送“FF 11 22 33 44”

三:静态变量的作用

  1. 生存期延长‌:静态变量的生存期在程序的整个运行期间,而不仅仅是在声明它的函数调用期间。这意味着静态变量会在程序启动时分配内存,并在程序终止时释放内存,这与自动变量(局部变量)不同,后者仅在其所在函数的执行期间存在。
  2. 作用域限制‌:静态全局变量的作用域被限制在声明它的源文件(或编译单元)内部,不能在其他文件中被访问。这有助于确保全局变量的私有性,防止其他文件无意或恶意地修改它。
  3. 默认初始化为0‌:未经初始化的静态全局变量会被程序自动初始化为0。这与全局变量类似,因为全局变量也存储在静态数据区,默认值为0x00。

四:总结

 HEX数据包,主要是状态机逻辑,然后跟着写代码就好


http://www.kler.cn/a/579045.html

相关文章:

  • 大白话JavaScript闭包实现原理与在实际开发中的应用场景
  • 六十天前端强化训练之第八天到第十四天——综合案例:用户管理系统
  • PHP:格式化JSON为PHP语法格式
  • 【贪心算法】将数组和减半的最小操作数
  • Python 数据可视化创意分享:解锁数据之
  • Python性能优化面试题及参考答案
  • 【计算机网络入门】应用层
  • NO.33十六届蓝桥杯备战|函数|返回值|声明|调用|引用|函数重载(C++)
  • 软件工程画图题
  • 前端安全面试题汇总及参考答案
  • 如何创建炫酷的 3D CSS 旋转加载器:为你的网页增添动感
  • Compose笔记(八)--权限
  • 元脑服务器:浪潮信息引领AI基础设施的创新与发展
  • 基于Asp.net的零食购物商城网站
  • Ruoyi+uniapp+websocket点对点和广播通知消息
  • SpringBoot3—场景整合:AOT
  • 【图像处理与OpenCV:技术栈、应用和实现】
  • c#面试题整理6
  • 栈和队列2
  • Linux学习:文件系统