在使用新方法做串口通信之前,我们先回顾一下我们的老方法:串口重定向加超时解析。重定向是指用户自己重写C语言的库函数,当连接器检查到用户编写了与C语言库函数相同名字的函数时,优先采用用户编写的函数,而printf函数在C语言中我们知道是个格式化输出函数,但是在单片机中我们的输出设备是不确定的,所以我们需要重定向printf函数,因为printf在C语言标准库中实质是个宏,最终调用的其实是fputc函数,所以我们需要重写fputc函数
int fputc(int ch, FILE * str)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);
return ch;
}
然后是超时解析,超时解析其实是我们比较最后一次接受数据的时间和现在的时间,如果超过某个特定的值,我们就可以认为数据已经接受完毕了,那么我们就可以对接受到的信息进行处理
void uart_proc(void)
{
//如果接收索引为0,说明没有数据需要处理,直接返回
if(uart_rx_index 0) return;
//如果从最后一次接收到数据到现在已经超过100ms
if(uwTick - uart_rx_ticks > 100) 100ms内没有收到新的数据
{
//清空接收缓冲区,将接收索引置零
memset(uart_rx_buffer, 0, uart_rx_index);
uart_rx_index = 0;
//将UART接收缓冲区指针重置为接收缓冲区的起始位置
huart1.pRxBuffPtr = uart_rx_buffer;
}
}
但是这样处理就会产生一个问题,就是我如果发送或者接受的数据十分快,我们的串口中