stm32f103c8t6串口2发送AT+LOCATION=1指令给EC0g,得到GPS,解析GPS数据,stm32库函数版本的代码
时间: 2023-12-03 07:47:39 浏览: 76
以下是使用STM32库函数版本的代码,可以发送AT指令并解析GPS数据:
```c
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#define GPS_BUF_SIZE 256
// GPS数据缓存
char gpsBuffer[GPS_BUF_SIZE];
uint16_t gpsBufferIndex = 0;
uint8_t gpsReady = 0;
// USART2初始化函数
void USART2_Init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 打开USART2和GPIOA的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// USART2_TX GPIO 配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART2_RX GPIO 配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
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_Cmd(USART2, ENABLE);
}
// 发送AT指令
void sendATCommand(char *cmd)
{
while (*cmd)
{
// 发送数据
USART_SendData(USART2, (uint16_t) *cmd++);
// 等待发送完成
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
// 发送结束符
USART_SendData(USART2, (uint16_t) '\r');
// 等待发送完成
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, (uint16_t) '\n');
// 等待发送完成
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
// 解析GPS数据
void parseGPS(char *data)
{
char *token = strtok(data, ",");
while (token != NULL)
{
// 判断是否是经度
if (strstr(token, "E") || strstr(token, "W"))
{
printf("Longitude: %s\n", token);
}
// 判断是否是纬度
else if (strstr(token, "N") || strstr(token, "S"))
{
printf("Latitude: %s\n", token);
}
token = strtok(NULL, ",");
}
}
int main(void)
{
// 初始化USART2
USART2_Init();
while (1)
{
// 发送AT指令
sendATCommand("AT+LOCATION=1");
// 等待GPS数据就绪
while (!gpsReady);
// 解析GPS数据
parseGPS(gpsBuffer);
// 清空GPS缓存
memset(gpsBuffer, 0, GPS_BUF_SIZE);
gpsBufferIndex = 0;
gpsReady = 0;
// 延时
for (int i = 0; i < 1000000; i++);
}
}
```
在上面的代码中,我们首先使用 `USART2_Init()` 函数初始化了USART2串口,并定义了一个 `gpsBuffer` 数组作为GPS数据缓存。然后,我们使用 `sendATCommand()` 函数发送了AT指令。在发送完指令后,我们通过 `while (!gpsReady)` 循环等待GPS数据就绪。当GPS数据就绪后,我们使用 `parseGPS()` 函数解析GPS数据。最后,我们清空GPS缓存,并进行延时,等待下一次GPS数据的到来。
阅读全文