如果用hal库一次性接收大量数据,如果通过判断RXNE标志位,每次只接受一个字节会消耗大量mcu资源去频繁处理中断,如果一次性接收多个字节可能会导致数据无法对齐,如果一次接收大量字节,中断回调函数无法执行,
HAL_UART_Receive_IT(&huart1,&ch,1);
像这样一次接收一个字节,如果数据量大,会频繁进入中断
HAL_UART_Receive_IT(&huart1,&ch,10);
这样一次接收多个字节会导致接收数据错误
HAL_UART_Receive_IT(&huart1,&ch,100);
这样接收大量数据会直接进不了中断回调
查找资料后发现IDLE标志位能解决一次性接收大量数据
HAL_UARTEx_ReceiveToIdle_IT(&huart1,serial.Rx_Data_Buf,1024);
使用HAL_UARTEx_ReceiveToIdle_IT使能IDLE
在HAL_StatusTypeDef UART_Receive_IT函数里有一个判断IDLE
回调函数也会返回接收数据的长度
回调函数里要重新开启中断接收
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==USART1)
{
serial.FramLength=Size;
HAL_UART_Transmit(&huart1,serial.Rx_Data_Buf,serial.FramLength,serial.FramLength);
HAL_UARTEx_ReceiveToIdle_IT(&huart1,serial.Rx_Data_Buf,RX_BUF_MAX_LEN);
}
else if(huart->Instance==USART3)
{
esp8266.FramLength=Size;
HAL_UART_Transmit(&huart1,esp8266.Rx_Data_Buf,esp8266.FramLength,|
esp8266.FramLength);
HAL_UARTEx_ReceiveToIdle_IT(&huart1,serial.Rx_Data_Buf,RX_BUF_MAX_LEN);
}
}
版权声明:本文为CSDN博主「看到我叫我去学单片机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40932099/article/details/118423684
暂无评论