写的比较垃圾,将就着用。欢迎各位大佬指导,
我这里要用串口中断接收两种帧头的数据,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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)