【发布时间】:2016-09-14 19:18:50
【问题描述】:
我正在使用 stm32f0 MCU。
我想将从 uart 接收到的每一个字节传输到 uart 之外。我正在对从 uart 接收到的每个字节启用中断。
我的代码很简单。
uint8_t Rx_data[5];
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit(&huart1, &Rx_data[0], 1, 100);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
我的电脑将 ASCII 12345678 传输到 stm32。如果一切正常,PC 应该会收到 12345678 回复。但是,PC 会收到 1357。代码有什么问题?
【问题讨论】:
-
我认为您在 HAL 重新初始化 USART IRQ 时错过了 char。尝试将 USART 波特率显着降低 2 次方。如果问题会消失,请不要将 HAL 用于所需的 MCU 时钟频率和 USART 波特率或更改其中一些时钟。
-
即使使用非常高效的代码,也可能无法回显接收到的每个字符。波特率来自发送器的时钟,它可能有误差,而且分频也可能不精确。接收器通常会过采样,因此可以容忍到达有点快或慢的数据。但是,快速到达的数据会以比 UART 的发送一半重复的速度更快的速度生成字。在这种情况下,迟早,如果流入没有停顿,您将丢弃单词 - 或者如果您有一个多单词缓冲区,您将开始将其填满并溢出。
标签: interrupt stm32 uart stm32f0 stm32-hal