首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32:通过USART接收数据

STM32:通过USART接收数据
EN

Stack Overflow用户
提问于 2014-06-24 23:26:07
回答 2查看 13.6K关注 0票数 1

我正在从事STM32发现(F10x系列)的工作,并且正在尝试通过USART1发送和接收数据。

代码语言:javascript
复制
int uart_putc(int c, USART_TypeDef* USARTx)
{
    assert_param(IS_USART_123_PERIPH(USARTx));

    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
    USARTx->DR =  (c & 0xff);
    return 0;
}

int uart_getc (USART_TypeDef* USARTx)
{
    assert_param(IS_USART_123_PERIPH(USARTx));

    while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
    return  USARTx->DR & 0xff;
}

有人知道这段代码出了什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2014-06-24 23:44:02

USART_FLAG_RXNE标志代表RX buffer Not Empty。如果RX缓冲区中有数据,则设置该标志,而不重置。

这就是为什么您的代码被塞在while循环中的原因。

票数 3
EN

Stack Overflow用户

发布于 2019-11-28 04:47:47

我认为您的while循环没有问题。顺便说一句,在设置RXNE标志之前,它将一直执行,对吧?这(RXNE == 1)意味着,在你的RX缓冲区中有一些东西。因此,当发生这种情况时,while循环将不再执行。

在我看来,问题可能是溢出错误标志,我的意思是,当您在接收到新数据之前没有读取RX缓冲区和擦除RXNE标志时,溢出错误标志将被设置,而不是RXNE标志。在这种情况下,您需要清除ORE标志以便返回到正常接收模式,如果您使用的是HAL库,则可以通过LL_USART_ClearFlag_ORE(USARTx)完成此操作。但为了确保这是无限while循环的原因,您可以将此条件添加到while:LL_USART_IsActiveFlag_ORE(USARTx)中,它将如下所示:

代码语言:javascript
复制
while (!LL_USART_IsActiveFlag_RXNE(USART1) && !LL_USART_IsActiveFlag_ORE(USART1))

注意,这个while等同于

代码语言:javascript
复制
while (LL_USART_IsActiveFlag_RXNE(USART1) == 0 && LL_USART_IsActiveFlag_ORE(USART1) == 0)

你已经在用过了。

如果这是您的问题,那么有一些方法可以改进您的数据接收算法:第一个方法是使用中断来接收数据。

第二种方法是强制编译器将变量保存在寄存器中,通过在函数中的参数和变量之前使用volatile关键字来加快执行速度。

最后,我认为通过设置你的核心时钟频率足够快,你的UART工作频率和波特率可以帮助你减少覆盖错误。

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

https://stackoverflow.com/questions/24390564

复制
相关文章

相似问题

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