stm32f103c8t6串口2发送AT+LOCATION=1指令给EC01g,并解析GPS数据,stm32库函数版本的代码
时间: 2023-12-06 17:39:46 浏览: 35
下面是基于STM32库函数版本的代码,实现串口2发送AT指令并解析GPS数据:
```c
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#define GPS_BUFFER_SIZE 128
char gps_buffer[GPS_BUFFER_SIZE]; // GPS数据缓存
// USART2初始化函数
void USART2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 使能USART2时钟
// USART2_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART2_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART2配置
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
// 使能USART2接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
// 使能USART2
USART_Cmd(USART2, ENABLE);
}
// 发送AT指令
void GPS_SendAT(char *at_cmd)
{
while (*at_cmd != '\0') {
USART_SendData(USART2, *at_cmd++);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // 等待发送完成
}
}
// 接收GPS数据
void GPS_ReceiveData(void)
{
static uint8_t index = 0;
char ch = USART_ReceiveData(USART2);
if (ch == '$') {
index = 0;
}
if (index < GPS_BUFFER_SIZE) {
gps_buffer[index++] = ch;
}
}
// 解析GPS数据
void GPS_ParseData(void)
{
char *p, *q;
// 搜索$GPRMC
p = strstr(gps_buffer, "$GPRMC");
if (p == NULL) {
return;
}
// 获取经度
p = strchr(p, ',');
if (p == NULL) {
return;
}
p++;
q = strchr(p, ',');
if (q == NULL) {
return;
}
*q = '\0';
printf("Longitude: %s\n", p);
// 获取纬度
p = q + 1;
q = strchr(p, ',');
if (q == NULL) {
return;
}
*q = '\0';
printf("Latitude: %s\n", p);
}
int main(void)
{
USART2_Init();
while (1) {
GPS_SendAT("AT+LOCATION=1\r\n"); // 发送AT指令
memset(gps_buffer, 0, GPS_BUFFER_SIZE); // 清空GPS数据缓存
delay_ms(1000); // 等待数据接收完成
GPS_ParseData(); // 解析GPS数据
}
}
```
需要注意的是,本代码中使用了一个简单的延时函数`delay_ms()`,需要在代码中定义。
另外,需要注意USART2接收中断的处理函数,在实际应用中需要根据具体需求进行编写。