stm32自定义数据帧连续发送错误命令后无法接收正确指令问题


关于STM32自定义数据帧连续发送错误命令后不能再接受指令

今天嵌入式课程学习,老师发布的小课题,通过串口和定时器做一个小项目,项目如下:
上位机通过一个由4个字节组成的数据帧控制指示灯LED的亮灭,该通信协议的数据帧格式如图所示:
stm32自定义数据帧连续发送错误命令后无法接收正确指令问题
文章图片

AA 01 01 55----指示灯LED灯亮
AA 01 02 55 ----LED灭 【stm32自定义数据帧连续发送错误命令后无法接收正确指令问题】
定义了一个数据缓冲区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:%dled2打开!\r\n",hh,mm,ss); break; case 0xa2: led2_off; sprintf((char *)send_buff,"%d:%d:%dled2关闭!\r\n",hh,mm,ss); break; case 0xa3: led3_on; sprintf((char *)send_buff,"%d:%d:%dled3打开!\r\n",hh,mm,ss); break; case 0xa4: led3_off; sprintf((char *)send_buff,"%d:%d:%dled3关闭!\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); } }

    推荐阅读