stm32f103c8t6串口2发送AT+LOCATION=1指令给EC01g,并解析GPS,stm32库函数版本的代码
时间: 2023-12-06 22:39:49 浏览: 139
以下是基于STM32库函数的串口2发送AT指令并解析GPS数据的示例代码:
```c
#include "stm32f10x.h"
#include <string.h>
#define GPS_BUFFER_SIZE 256 // GPS数据缓冲区大小
#define GPS_START_CHAR '$' // GPS数据起始字符
#define GPS_END_CHAR '\n' // GPS数据结束字符
uint8_t gpsBuffer[GPS_BUFFER_SIZE]; // GPS数据缓冲区
uint8_t gpsIndex = 0; // GPS数据缓冲区索引
// 发送AT指令
void sendATCommand(char* command)
{
USART_SendString(USART2, command);
USART_SendData(USART2, '\r');
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == 0);
}
// 解析GPS数据
void parseGPSData(uint8_t* data, uint8_t length)
{
char* token = strtok((char*)data, ",");
while(token != NULL)
{
if(strcmp(token, "$GPRMC") == 0) // 如果是GPRMC语句,解析经纬度
{
token = strtok(NULL, ","); // 跳过UTC时间
token = strtok(NULL, ","); // 跳过定位状态
double latitude = atof(token); // 纬度
token = strtok(NULL, ","); // 跳过纬度方向
double longitude = atof(token); // 经度
token = strtok(NULL, ","); // 跳过经度方向
token = strtok(NULL, ","); // 跳过地面速率
token = strtok(NULL, ","); // 跳过地面航向
token = strtok(NULL, ","); // 跳过UTC日期
break;
}
else
{
token = strtok(NULL, ",");
}
}
}
// USART2中断处理函数
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // 接收中断
{
uint8_t data = USART_ReceiveData(USART2);
if(data == GPS_START_CHAR) // 如果是GPS数据起始字符
{
gpsIndex = 0; // 清空GPS数据缓冲区
}
gpsBuffer[gpsIndex++] = data; // 将数据存入GPS数据缓冲区
if(data == GPS_END_CHAR) // 如果是GPS数据结束字符
{
parseGPSData(gpsBuffer, gpsIndex); // 解析GPS数据
}
}
}
int main(void)
{
// 初始化USART2
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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);
USART_Cmd(USART2, ENABLE);
// 发送AT指令并打开GPS
sendATCommand("AT+CGPSPWR=1");
sendATCommand("AT+CGPSOUT=1");
// 启用USART2接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ(USART2_IRQn);
while(1)
{
// 主程序循环
}
}
```
注意:上述代码中的USART_SendString和USART_ReceiveData函数需要自行实现。建议使用官方提供的库函数。
阅读全文