STM32标准库如何把接收到的GPS定位数据实时存入 gnrmc_str[]里面的代码
时间: 2024-03-02 15:50:49 浏览: 82
以下是使用STM32标准库将接收到的GPS定位数据实时存入gnrmc_str[]的示例代码:
```
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 256
// 定义变量
char buffer[BUFFER_SIZE];
int buffer_counter = 0;
char gnrmc_str[BUFFER_SIZE];
// 串口接收中断处理函数
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { // 接收到数据
char data = USART_ReceiveData(USART1);
if (data == '$') { // 开始接收数据帧
buffer_counter = 0;
buffer[buffer_counter++] = data;
} else if (buffer_counter > 0 && data == '\n') { // 接收到一帧数据
buffer[buffer_counter++] = data;
buffer[buffer_counter] = '\0';
if (strncmp(buffer, "$GNRMC,", 7) == 0) { // 是GNRMC数据
strcpy(gnrmc_str, buffer);
}
buffer_counter = 0;
} else if (buffer_counter < BUFFER_SIZE - 1) { // 继续接收数据
buffer[buffer_counter++] = data;
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
int main(void) {
// 配置USART1
USART_InitTypeDef usart_init_struct;
GPIO_InitTypeDef gpio_init_struct;
NVIC_InitTypeDef nvic_init_struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
// 配置USART1的TX引脚为复用推挽输出
gpio_init_struct.GPIO_Pin = GPIO_Pin_9;
gpio_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init_struct);
// 配置USART1的RX引脚为浮空输入
gpio_init_struct.GPIO_Pin = GPIO_Pin_10;
gpio_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio_init_struct);
// 配置USART1的参数
usart_init_struct.USART_BaudRate = 9600;
usart_init_struct.USART_WordLength = USART_WordLength_8b;
usart_init_struct.USART_StopBits = USART_StopBits_1;
usart_init_struct.USART_Parity = USART_Parity_No;
usart_init_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart_init_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &usart_init_struct);
// 使能USART1的接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
// 配置USART1的中断优先级
nvic_init_struct.NVIC_IRQChannel = USART1_IRQn;
nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 1;
nvic_init_struct.NVIC_IRQChannelSubPriority = 1;
nvic_init_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init_struct);
// 启动USART1
USART_Cmd(USART1, ENABLE);
while (1) {
// 处理接收到的GNRMC数据
if (strlen(gnrmc_str) > 0) {
// 处理gnrmc_str
// ...
// 清空gnrmc_str
gnrmc_str[0] = '\0';
}
}
}
```
上述代码实现了串口接收中断处理函数USART1_IRQHandler(),在该函数中将接收到的数据存入buffer[]中,并判断是否接收到完整的一帧数据。如果接收到的是GNRMC数据,则将其存入gnrmc_str[]中。在主函数中,可以处理接收到的GNRMC数据,如将其解析为经纬度。实际应用中,需要根据实际情况修改代码。
阅读全文