关于STM32自定义数据帧连续发送错误命令后不能再接受指令
今天嵌入式课程学习,老师发布的小课题,通过串口和定时器做一个小项目,项目如下:
上位机通过一个由4个字节组成的数据帧控制指示灯LED的亮灭,该通信协议的数据帧格式如图所示:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c6652e251ce3199d54b0994e8832dec.png)
AA 01 01 55----指示灯LED灯亮
AA 01 02 55 ----LED灭
定义了一个数据缓冲区uint8_t Rx_Buff[4];//4个字节的
在使用接收中断函数:
HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_Buff,4);
在实际调试中出现了连续发送错误指令后,再发送正确指令,单片机接收不到的情况。解决办法如下:
定义了数据缓冲区uint8_t Rx_Buff[16];
HAL_UART_Receive_IT(&huart1, Rx_Buff,4);
上边标黑地方是修改的,但是具体的为啥我不清楚,希望有大牛来解释下!附上接收回调函数源码`
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口回调
{
if(huart->Instance == USART1)
{
if(recive_dat[0] == 0xaa && recive_dat[3] == 0xbb)//判断起始帧和结束帧
{
switch(recive_dat[1])
{
case 0x01:
switch(recive_dat[2])
{
case 0xa1:
led2_on;
sprintf((char *)send_buff,"%d:%d:%d led2打开!\r\n",hh,mm,ss);
break;
case 0xa2:
led2_off;
sprintf((char *)send_buff,"%d:%d:%d led2关闭!\r\n",hh,mm,ss);
break;
case 0xa3:
led3_on;
sprintf((char *)send_buff,"%d:%d:%d led3打开!\r\n",hh,mm,ss);
break;
case 0xa4:
led3_off;
sprintf((char *)send_buff,"%d:%d:%d led3关闭!\r\n",hh,mm,ss);
break;
default:
sprintf((char *)send_buff,"%d:%d:%d 这是一个错误的命令!\r\n",hh,mm,ss);
break;
}
break;
default:
printf("这是一个错误的命令!\r\n");
break;
}
HAL_UART_Transmit(&huart1,send_buff,sizeof(send_buff),1);
HAL_UART_Receive_IT(&huart1,recive_dat,4);
}
else
{
printf("这是一个错误的命令!\r\n");
}
HAL_UART_Receive_IT(&huart1,recive_dat,4);
}
}