ATGM336H-5N31读取定位信息的代码基于keil
时间: 2024-01-12 16:05:19 浏览: 66
以下是基于Keil开发环境使用ATGM336H-5N31模块读取定位信息的示例代码:
```C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#define GPS_RX_BUFFER_SIZE 128
char gpsRxBuffer[GPS_RX_BUFFER_SIZE] = {0};
int gpsRxBufferIndex = 0;
int isGPGGAReceived = 0;
void USART2_IRQHandler(void)
{
char receivedChar = USART2->DR & 0xFF;
gpsRxBuffer[gpsRxBufferIndex] = receivedChar;
gpsRxBufferIndex++;
if (receivedChar == '\n')
{
if (strstr(gpsRxBuffer, "$GPGGA") != NULL)
{
isGPGGAReceived = 1;
}
gpsRxBuffer[0] = '\0';
gpsRxBufferIndex = 0;
}
}
void configureUSART()
{
// Enable GPIOA and USART2 clocks
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
// Configure PA2 (USART2 TX) as alternate function push-pull
GPIOA->MODER |= GPIO_MODER_MODER2_1;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_2;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR2;
GPIOA->AFR[0] |= 0x00000100;
// Configure PA3 (USART2 RX) as input floating
GPIOA->MODER &= ~GPIO_MODER_MODER3;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_3;
GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR3;
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR3;
// Configure USART2 with 9600 baud rate, 8 data bits, no parity, 1 stop bit
USART2->BRR = 480000 / 96; // assuming PCLK = 48 MHz
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE;
NVIC_EnableIRQ(USART2_IRQn);
}
void parseGPGGA(char* gpggaString, int* numSatellites, double* latitude, double* longitude)
{
char* token = strtok(gpggaString, ",");
int tokenIndex = 0;
while (token != NULL)
{
if (tokenIndex == 6)
{
*numSatellites = atoi(token);
}
else if (tokenIndex == 2 || tokenIndex == 4)
{
int degrees = atoi(strtok(token, "."));
double minutes = atof(token + 2) / 60.0;
double decimalDegrees = degrees + minutes;
if (tokenIndex == 2)
{
*latitude = decimalDegrees;
}
else
{
*longitude = decimalDegrees;
}
}
token = strtok(NULL, ",");
tokenIndex++;
}
}
int main()
{
double latitude = 0.0;
double longitude = 0.0;
int numSatellites = 0;
configureUSART();
while (1)
{
if (isGPGGAReceived)
{
parseGPGGA(gpsRxBuffer, &numSatellites, &latitude, &longitude);
printf("Latitude: %f, Longitude: %f, Number of Satellites: %d\n", latitude, longitude, numSatellites);
isGPGGAReceived = 0;
}
}
}
```
这个代码使用了Keil提供的CMSIS库来配置USART2串口,以读取从GPS模块发送的串口数据。当接收到GPS数据时,它会检查数据是否是GPGGA语句,然后解析数据以提取纬度和经度信息,并将其打印到终端上。请注意,您需要将代码中的波特率和串口引脚号更改为您的实际连接。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)