STM32在轮询模式下接收奇怪的字符作为输入

Posted

技术标签:

【中文标题】STM32在轮询模式下接收奇怪的字符作为输入【英文标题】:STM32 receives weird characters as input in polling mode 【发布时间】:2021-12-30 06:48:47 【问题描述】:

我正在尝试在轮询模式下使用 stm32 uart。传输部分工作正常,我读取了从 MCU 发送的正确字符,但接收部分工作不正常。

This is a welcome message
ÿÿÿÿ

第一行是从 MCU 发送到 PC,然后 MCU 等待接收。据我了解,HAL_USART_Receive 是一个阻塞调用,因此它应该等待用户从终端输入字符,但是在我可以编写任何字符并将它们发送到 MCU 之前,它会移动到下一行,这是一个无限的时间环形。我不明白为什么它不在接收方法处暂停。我调试并检查了实时表达式窗口,在初始化期间,我将接收缓冲区设置为“\0”,但是在通过 HAL_Receive 方法后,缓冲区的值变为 127。有关存储在缓冲区中的值,请参见附件图像。 output

你能帮我理解我做错了什么吗?我的代码如下所示

    HAL_Init(); // Initializing HAL.

SystemClockConfig();

USART3_Init();


uint8_t tx_data[] = "This is a welcome message\r\n";
uint16_t tx_len = sizeof(tx_data);

HAL_USART_Transmit(&husart3, tx_data, tx_len, HAL_MAX_DELAY);

uint8_t rx_data[5]=0;
uint16_t rx_len = sizeof(rx_data);
HAL_USART_Receive(&husart3, rx_data, rx_len, HAL_MAX_DELAY);


while(1)



【问题讨论】:

错误的速度、错误或字长设置。 速度和字数设置是正确的,否则我什至不会收到第一行是正确的。 您是否检查了从 HAL_USART_Receive 方法返回的内容?如果设备/方法成功执行,它应该收到 HAL_OK。检查并发表评论。 是的,返回状态是HAL_OK。我想我弄清楚了这个问题。我在 UART 模式下使用 USART。我有 USART 而不是 UART 的句柄。但是,当我使用 UART 句柄时,它开始正常工作。我不完全理解这个问题,因为 USART 在 UART 模式下也应该可以正常工作。 【参考方案1】:

你说你在UART模式下使用USART(我假设你的意思是异步模式)但是你的Handle(husart)是同步的,你使用的HAL方法也是同步的?

您的 STM32 上的 RX 引脚保持高电平,这就是为什么您在调用接收函数时会在缓冲区中得到 0xFF (127)。

我认为您在代码生成器中选择了错误的设置,您使用的是 CubeIDE 吗?如果是这样,请转到 USART 并从选项中选择“异步”并重新生成。您会注意到您的手柄从 husart 变为 huart。用于发送和发送的 HAL 函数是 HAL_UART_Transmit() 和 HAL_UART_Receive()。在您当前的代码中以相同的方式使用这些将给出您正在寻找的结果。

【讨论】:

在我看来,您好像混淆了两件事:同步/异步函数调用和同步/异步 USART 模式。对于函数调用,区别在于阻塞与非阻塞调用,后者使用中断和 DMA。对于 USART 模式,区别在于除了 RX 和 TX 之外,是否使用了时钟信号。 变量名没有区别。它甚至可以称为spi。要激活额外的时钟信号,您只需将其添加到配置结构中 如果我在UART模式下使用USART,那么理论上UART模块和USART模块应该没有区别。两者都应该类似地工作。 另外,我没有使用自动代码生成,我正在手动编写代码 抱歉,由于 HAL 功能,我假设您使用的是代码生成器。我可以看看你的 USART_Init() 函数吗?

以上是关于STM32在轮询模式下接收奇怪的字符作为输入的主要内容,如果未能解决你的问题,请参考以下文章

STM32 HAL I2C 轮询模式

STM32F0 DMA“输入溢出”

STM32HAL轮询模式串口接收函数超时等待问题?

STM32单片机SPI问题

串口通讯(DMA模式)

我在运行时遇到了一种奇怪的错误