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

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


今天嵌入式课程学习,老师发布的小课题,通过串口和定时器做一个小项目,项目如下:
上位机通过一个由4个字节组成的数据帧控制指示灯LED的亮灭,该通信协议的数据帧格式如图所示:
在这里插入图片描述
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);
    }
}

你可能感兴趣的:(STM32)