关于STM32自定义数据帧连续发送错误命令后不能再接受指令
今天嵌入式课程学习,老师发布的小课题,通过串口和定时器做一个小项目,项目如下:
上位机通过一个由4个字节组成的数据帧控制指示灯LED的亮灭,该通信协议的数据帧格式如图所示:
文章图片
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);
}
}
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h
- STM32 NVIC