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)
我是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)