【发布时间】:2020-04-30 03:21:25
【问题描述】:
我有一些(主要是 CubeMX 生成的)代码:
volatile uint8_t buf[4];
int main(void)
{
...
HAL_UART_Receive_IT(&huart3, buf, sizeof(buf));
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART3) {
HAL_UART_Transmit(&huart3, buf, sizeof(buf), 0xFFFF);
HAL_UART_Receive_IT(&huart3, buf, sizeof(buf));
}
}
这成功地回显了 USART3 上接收到的所有内容。 (此代码只是了解串行端口的一次性示例。)
我担心HAL_UART_RxCpltCallback() 被调用和HAL_UART_Receive_IT() 设置下一次接收之间的时间。
STM32F103有什么特性可以保证这个时间间隔内数据不会丢失吗?我没有发现任何证据表明 USART 上有超过两个字节的接收缓冲区。
我特别担心某些更高优先级的 USB 设备活动可能会延迟HAL_UART_RxCpltCallback() 的调用,因此可能会丢失一个或多个字符。
【问题讨论】:
-
如果在读取 UART 寄存器的当前内容之前在 UART 上接收到更多数据,则将设置溢出错误 (ORE) 位。我不熟悉 UART 的 HAL 接口,但是 LL(Low-Level)接口提供了读取该位的方法。
-
一般来说...使用
LL_USART_xxx例程提供了比HAL_UART_xxx对应的更多灵活性。 IIRC 在使用 HAL 例程进行基于中断的 UART 接收时,需要提前知道传入字符的数量(这使得在许多情况下使用 HAL UART 驱动程序是不可行的。) -
谢谢两位,我会看看
LL_USART函数。
标签: serial-port stm32 usart stm32f1