GPS UART数据多次写入Buffer

GPS UART data written multiple times to Buffer

我是receiving/reading来自GPS模块的数据,通过USART3发送到STM32F091。 数据到达那里很好,我通过将其发送到我的 PC COM3 端口并将其馈送到 'u-center'(GPS 评估软件)来确认这一点。

我的问题是我想在我的 C 程序中自己评估数据,为此我将其输入环形缓冲区,但是,GPS 信号的每个字符都被多次写入缓冲区,而不是一个接一个。

例如

GGGGGGGPPPPPPPPSSSSSSSS instead of GPS

我不确定我做错了什么,也许这是我在盯着这段代码看了这么久之后忽略的非常明显的事情。

这是相关代码。

stm32f0xx_it.c

#include <main.h>

void USART3_8_IRQHandler(void)
{
    if (USART_FLAG_RXNE != RESET)
    {
        uint16_t byte = 0;
        /* Data reception */

        /* Clear Overrun Error Flag, necessary when RXNE is used */
        USART_GetITStatus(USART3, USART_IT_ORE);

        /* Read from Receive Data Register and put into byte */
        byte = USART_ReceiveData(USART3);

        (*pRXD3).wr = ((*pRXD3).wr + 1) % (*pRXD3).max;
        (*pRXD3).Buffer[(*pRXD3).wr] = byte;

        /* Send Data to PC, and reset Transmission Complete Flag  */
        USART_GetITStatus(USART1, USART_IT_TC);
        USART_SendData(USART1, byte);

        return;
    }
    return;
}

uartGPS.h

....
    struct GPSuart
    {
        BYTE Buffer[255];
        WORD max;
        WORD re;
        WORD wr;
    };
....

main.h

....
extern volatile BYTE B_ser_txd_3[255];
extern volatile BYTE B_ser_rxd_3[255];
extern volatile struct GPSuart TXD_uart_3;
extern volatile struct GPSuart RXD_uart_3;
extern volatile struct GPSuart *pRXD3;
extern volatile struct GPSuart *pTXD3;
....

让我知道是否需要提供更多信息。

这个:

if (USART_FLAG_RXNE != RESET)

不测试标志,该代码正在检查标志常量本身,这不是您的意思。

您需要更多代码来访问 UART 的状态寄存器并检查标志:

if (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) != RESET)