STM32-USART串口数据包

发布于:2025-03-07 ⋅ 阅读:(29) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到