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

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数据包,主要是状态机逻辑,然后跟着写代码就好

相关文章:

  • 策略模式
  • OpenBMC:BmcWeb构造connect对象
  • 亚信安全发布2024威胁年报和2025威胁预测
  • PostgreSQL常用系统表
  • Linux : 进程地址空间
  • RBAC 权限系统管理模型 学习笔记
  • 笔记四:C语言中的文件和文件操作
  • 168. Excel 表列名称
  • vue左侧边框点击后让字体高亮
  • QTS单元测试框架
  • 多线程-CompletableFuture
  • 深度解析:视频软编码与硬编码的优劣对比
  • 【TCP/IP协议栈】【网络层】子网划分、子网掩码
  • 《从信息论视角:DataWorks平台下人工智能探寻最优数据编码的深度剖析》
  • 常见限流算法
  • Shell编程概述与Shell变量
  • 建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)
  • 【Flink银行反欺诈系统设计方案】4.Flink CEP 规则表刷新方式
  • Redis相关面试题
  • Mybatis集合嵌套查询,三级嵌套
  • 茅台总经理到访五粮液:面对白酒行业周期性调整,需要团结一心的合力
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 上海率先推进生物制品分段生产试点,这款国产1类创新药获批上市
  • 商务部回应美方加严限制中国芯片:敦促美方立即纠正错误做法
  • 国防部:赖清德歪曲二战历史,背叛民族令人不齿
  • 人民网三评“网络烂梗”:莫让低级趣味围猎青少年