STM32 HAL库 串口接收不定长数据(帧头)

写的比较垃圾,将就着用。欢迎各位大佬指导,

        我这里要用串口中断接收两种帧头的数据,1.  以0x0D 0x0A为帧头的数据。2,以0x55 0xA5为帧头的数据。两数据包帧头不同,大小不同。

其中定义的变量

uint8_t aRxBuff;        //用于存放串口接收到的单字节
uint8_t rxNum = 0;      //用于计数
uint8_t rxFlag = 0;     //接收标志,用于判断串口是否正在接收一帧数据

uint8_t headBuff[5];    //临时存放帧头
uint8_t rxBuff[20];     //用于存放接收到的帧

uint8_t dataBuff1[20];  //数据包1
uint8_t dataBuff2[20];  //数据包2

首先串口接收中断是以一个字节为单位接收数据,

HAL_UART_Receive_IT(&huart2,&aRxBuff,1); //打开串口接收中断

然后串口接收处理部分全都写在的回调函数中。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
	
	if(rxFlag == 0)    //帧头监测
	{
		headBuff[rxNum++] = aRxBuff;
		if(headBuff[rxNum - 1] == 0xA5 && headBuff[rxNum - 2] == 0x55)
		{
			rxFlag = 1;
			rxNum = 1;
			memset(headBuff,0,sizeof(headBuff));	
		}
		if(headBuff[rxNum - 1] == 0xA && headBuff[rxNum - 2] == 0x0D)
		{
			rxFlag = 2;
			rxNum = 2;
		}
		if(rxNum > 5) rxNum = 0;
	}
	
	if(rxFlag == 1)    //接收帧头为55 A5 的数据包
	{
		rxBuff[rxNum++] = aRxBuff;
		if(rxNum == 13)
		{
			rxFlag = 0;
			rxNum = 0;
			
			rxBuff[0] = 0x55;    //补充帧头到数据包
			
			memcpy(dataBuff1,rxBuff,13);
			memset(rxBuff,0,sizeof(rxBuff));
			
			HAL_UART_Transmit_IT(&huart1,dataRxBuff,13);
		}
	}
	
	if(rxFlag == 2)    //接收帧头为 0D 0A 的数据包
	{
		rxBuff[rxNum++] = aRxBuff;
		if(rxNum == 12)
		{
			rxFlag = 0;
			rxNum = 0;
			
			rxBuff[0] = 0x0D;
			
			memcpy(dataBuff2,rxBuff,12);
			memset(rxBuff,0,sizeof(rxBuff));
			
			HAL_UART_Transmit_IT(&huart1,cmdRxBuff,12);
		}
	}
	HAL_UART_Receive_IT(&huart2,&aRxBuff,1);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值