首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用HAL_UART_Receive_IT()和HAL_UART_RxCpltCallback()时,字节会丢失吗?

当使用HAL_UART_Receive_IT()和HAL_UART_RxCpltCallback()时,字节会丢失吗?
EN

Stack Overflow用户
提问于 2020-01-13 11:54:09
回答 1查看 6.4K关注 0票数 1

我有一些(大部分是CubeMX生成的)代码:

代码语言:javascript
运行
复制
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()的调用,因此可能会丢失一个或多个字符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-13 12:42:26

快速回答:

HAL_UART_Transmit是一个阻塞函数,因此,在它完成之前,不会调用HAL_UART_Receive_IT,并且uart肯定会溢出。如果您担心任何其他中断可能会预先执行,请在发出命令时使用dma或禁用麻烦的中断。你也可以提高UART中断优先级但是..。

提示:

....you不应该在HAL_UART_RxCpltCallback中调用HAL_UART_Transmit和HAL_UART_Receive_IT,因为这里您处于ISR模式。这会导致HAL框架的某些版本出现一些附带问题。最好设置一个标志并从主代码中检查它。

此外,您还应该真正避免使用易失性,最好使用像gcc __asm volatile("" ::: "memory")这样的编译器屏障。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59716172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档