1.解决接受不完整问题
假如没接受完成,执行函数,就可能会把count直接清零,就会重新接受\
while (1)
{
if(rx_count!=0)
{
uint8_t temp=rx_count;
HAL_Delay(1);
if(temp==rx_count)
uart_proc();
}
key_proc();
rxclear_proc();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
2.解决接受错误下一次不能执行的问题
滴答时钟
extern uint32_t usrxclear;
void SysTick_Handler(void)
{
HAL_IncTick();
key_time++;
usrxclear++;
}
主函数
定义
uint32_t usrxclear;
void rxclear_proc(void);
串口执行函数
void uart_proc(void)
{
if(rx_count==4)
{
if(strcmp(rx_buf,"LEDO")==0)
{
led_show(0x08);
}
if(strcmp(rx_buf,"LEDC")==0)
{
led_show(0x08^0x08);
}
rx_count=0;
memset(rx_buf,0,30);
}
}
超时清零函数
void rxclear_proc(void)
{
// 检查全局变量 usrxclear 的值是否小于 50
if(usrxclear < 50)
// 如果小于 50,函数直接返回,不执行后续的重置操作
return;
else
// 当 usrxclear 大于等于 50 时,将 usrxclear 重置为 0
usrxclear = 0;
// 将另一个全局变量 rx_count 重置为 0,这个变量可能用于记录接收数据的数量
rx_count = 0;
// 使用 memset 函数将 rx_buf 数组的前 30 个字节设置为 0
// rx_buf 通常是用于存储接收到的数据的缓冲区
memset(rx_buf, 0, 30);
}
中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
usrxclear=0;
rx_buf[rx_count++]=rx_data;
HAL_UART_Receive_IT(&huart1,&rx_data,1);
}