STM32:通过 USART 接收数据

Posted

技术标签:

【中文标题】STM32:通过 USART 接收数据【英文标题】:STM32: Receiving data via USART 【发布时间】:2014-08-14 22:44:44 【问题描述】:

我正在研究 STM32 Discovery(F10x 系列),我正在尝试通过 USART1 发送和接收数据。

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;

uart_putc 工作正常,但 uart_getc 卡在 while 循环中,似乎 while 条件永远不会为真。 有人知道这段代码有什么问题吗?

【问题讨论】:

为什么不直接使用STM32标准外设库? 【参考方案1】:

USART_FLAG_RXNE 标志代表 RX 缓冲区非空。如果 RX 缓冲区中有数据,则标志为 SET 而不是 RESET。

这就是你的代码卡在 while 循环中的原因。

【讨论】:

感谢您的回答, while(a==FALSE) 的唯一原因是无限循环……因为 a=FALSE。你说的不就是这些吗?【参考方案2】:

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

在我的想法中,问题可能是溢出错误标志,我的意思是当您不读取 RX 缓冲区并擦除 RXNE 标志直到要接收新数据时,然后设置溢出错误标志而不是 RXNE 标志。在这种情况下,您需要清除 ORE 标志才能恢复正常接收模式,如果您使用的是 HAL 库,您可以通过 LL_USART_ClearFlag_ORE(USARTx) 执行此操作。 但要确保这是无限循环的原因,您可以将此条件添加到 while :LL_USART_IsActiveFlag_ORE(USARTx),它会是这样的:

while (!LL_USART_IsActiveFlag_RXNE(USART1) && !LL_USART_IsActiveFlag_ORE(USART1))

注意这个while和

while (LL_USART_IsActiveFlag_RXNE(USART1) == 0 && LL_USART_IsActiveFlag_ORE(USART1) == 0)

你已经在使用了。

如果这是您的问题,那么有一些方法可以改进您接收数据的算法: 第一个是使用中断来接收数据。 第二个是通过在函数中的参数和变量之前使用 volatile 关键字来强制编译器将变量保存在寄存器中以便更快地执行。 最后,我认为通过将您的核心时钟频率设置得足够快,以使您的 UART 工作频率和波特率可以帮助您减少覆盖错误。

【讨论】:

请使用代码标签和正确的拼写来格式化您的答案。现在很难读 我最近编辑了我的帖子,我认为我已经提出了一些基于我的经验来找出问题的方法,我认为它们是正确的,如果有人反对这个帖子,认为这是错误的,请在此处分享,因为在不说明原因的情况下投票可能会误导寻找问题解决方案和正确答案的人。

以上是关于STM32:通过 USART 接收数据的主要内容,如果未能解决你的问题,请参考以下文章

STM32单片机通过USART1接收到数据后,怎么把接收到的数据通过单片机的CAN口发送出去啊?

USART接收中断stm32

STM32 上的 USART 接收器

STM32cubeMX+DMA+USART 接收任意长度的数据

STM32cubeMX+DMA+USART 接收任意长度的数据

关于STM32串口接收中断,网上有如下中断方式接收数据的程序: