目录

STM32-USART串口数据包

STM32-USART串口数据包

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.结果,按复位发送数据

https://i-blog.csdnimg.cn/direct/65a9813c61674e84b8fb949439da0b09.png

下图是状态机

https://i-blog.csdnimg.cn/direct/869d5a76eaf243f9ade273e0e5cceec7.png

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”

https://i-blog.csdnimg.cn/direct/e0d9671bea3140d59dd4dd6b6644623a.jpeg

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

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