一、模塊介紹
ATGM336H是一種高性能的GPS模塊,可以在較低功耗下提供高精度、高可靠性的位置信息服務(wù)。它采用了SiRFstarIII技術(shù),并支持多種導(dǎo)航衛(wèi)星系統(tǒng),包括GPS、GLONASS、Galileo、QZSS和SBAS。ATGM336H可以快速獲取衛(wèi)星信號(hào),提供高達(dá)10Hz的位置刷新速率,并能在較弱的GPS信號(hào)環(huán)境下保持高精度。 ATGM336H小巧輕便,易于安裝和集成,適用于各種應(yīng)用場(chǎng)景,包括車輛定位、智能導(dǎo)航、無(wú)人機(jī)導(dǎo)航等。它還具有設(shè)備保護(hù)功能,如過載保護(hù)、ESD保護(hù)等,能夠保護(hù)設(shè)備免受電氣壓力和電磁干擾的影響。此外,ATGM336H還配備了一個(gè)非易失性存儲(chǔ)器,可記錄設(shè)備的操作歷史記錄和配置信息,方便用戶對(duì)設(shè)備進(jìn)行管理和維護(hù)。 總之,ATGM336H是一款高性能、高精度的GPS模塊,具有卓越的性能和可靠性,并適用于各種導(dǎo)航應(yīng)用場(chǎng)景。
歡迎關(guān)注微信公眾號(hào)星之援工作室,公眾號(hào)不定時(shí)開源設(shè)計(jì)項(xiàng)目
支持單片機(jī),Android系統(tǒng)設(shè)計(jì)成品定制,項(xiàng)目代做
請(qǐng)聯(lián)系微信:13648103287
關(guān)注微信公眾號(hào)--星之援工作室 發(fā)送關(guān)鍵字(ATGM336H)
????
?使用的注意事項(xiàng)
1.GPS模塊首次上電的時(shí)候需要獲取衛(wèi)星的定位信息,需要在開闊地帶進(jìn)行程中不難斷電,獲取成功后我們的GPS模塊上的LED會(huì)處于閃爍的狀態(tài)獲取,這個(gè)獲取定位信息的過程大概在1-2分鐘
2.GPS模塊的串口波特率為9600
3.GPS模塊需要穩(wěn)定的的5V電源,需要注意我們的供電部分是否達(dá)到要求。
?二、如何移植
1.首先GSP是使用的串口通信,我們第一步需要先配置我們單片機(jī)的串口,并將我們的串口波特率配置為9600,這里我自己使用的是串口2進(jìn)行獲取的,代碼如下
usart2.c
#include "delay.h"
#include "usart2.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
char rxdatabufer;
u16 point1 = 0;
_SaveData Save_Data;
#if EN_USART2_RX //如果使能了接收
//串口1中斷服務(wù)程序
//注意,讀取USARTx->SR能避免莫名其妙的錯(cuò)誤
char USART_RX2_BUF[USART2_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
//接收狀態(tài)
//bit15, 接收完成標(biāo)志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART2_RX_STA=0; //接收狀態(tài)標(biāo)記
void Usart2_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOB時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口3時(shí)鐘使能
USART_DeInit(USART2); //復(fù)位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound;//波特率一般設(shè)置為9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART2, &USART_InitStructure); //初始化串口 3
USART_Cmd(USART2, ENABLE); //使能串口
//使能接收中斷
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟中斷
//設(shè)置中斷優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
CLR_Buf();//清空緩存
}
void USART2_IRQHandler(void) //串口1中斷服務(wù)程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果時(shí)鐘節(jié)拍數(shù)定義了,說(shuō)明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART2);//(USART1->DR); //讀取接收到的數(shù)據(jù)
if(Res == '$')
{
point1 = 0;
}
USART_RX2_BUF[point1++] = Res;
if(USART_RX2_BUF[0] == '$' && USART_RX2_BUF[4] == 'M' && USART_RX2_BUF[5] == 'C') //確定是否收到"GPRMC/GNRMC"這一幀數(shù)據(jù)
{
if(Res == 'n')
{
memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空
memcpy(Save_Data.GPS_Buffer, USART_RX2_BUF, point1); //保存數(shù)據(jù)
Save_Data.isGetData = true;
point1 = 0;
memset(USART_RX2_BUF, 0, USART2_REC_LEN); //清空
}
}
if(point1 >= USART2_REC_LEN)
{
point1 = USART2_REC_LEN;
}
}
#ifdef OS_TICKS_PER_SEC //如果時(shí)鐘節(jié)拍數(shù)定義了,說(shuō)明要使用ucosII了.
OSIntExit();
#endif
}
u8 Hand(char *a) // 串口命令識(shí)別函數(shù)
{
if(strstr(USART_RX2_BUF,a)!=NULL)
return 1;
else
return 0;
}
void CLR_Buf(void) // 串口緩存清理
{
memset(USART_RX2_BUF, 0, USART2_REC_LEN); //清空
point1 = 0;
}
void clrStruct()
{
Save_Data.isGetData = false;
Save_Data.isParseData = false;
Save_Data.isUsefull = false;
memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空
memset(Save_Data.UTCTime, 0, UTCTime_Length);
memset(Save_Data.latitude, 0, latitude_Length);
memset(Save_Data.N_S, 0, N_S_Length);
memset(Save_Data.longitude, 0, longitude_Length);
memset(Save_Data.E_W, 0, E_W_Length);
}
#endif
usart2.h
#ifndef __USART2_H
#define __USART2_H
#include "stdio.h"
#include "sys.h"
#include "string.h"
//V1.5修改說(shuō)明
//1,增加了對(duì)UCOSII的支持
#define USART2_REC_LEN 200 //定義最大接收字節(jié)數(shù) 200
#define EN_USART2_RX 1 //使能(1)/禁止(0)串口1接收
extern char USART_RX2_BUF[USART2_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符
extern u16 USART2_RX_STA; //接收狀態(tài)標(biāo)記
#define false 0
#define true 1
//定義數(shù)組長(zhǎng)度
#define GPS_Buffer_Length 80
#define UTCTime_Length 11
#define latitude_Length 11
#define N_S_Length 2
#define longitude_Length 12
#define E_W_Length 2
typedef struct SaveData
{
char GPS_Buffer[GPS_Buffer_Length];
char isGetData; //是否獲取到GPS數(shù)據(jù)
char isParseData; //是否解析完成
char UTCTime[UTCTime_Length]; //UTC時(shí)間
char latitude[latitude_Length]; //緯度
char N_S[N_S_Length]; //N/S
char longitude[longitude_Length]; //經(jīng)度
char E_W[E_W_Length]; //E/W
char isUsefull; //定位信息是否有效
} _SaveData;
void Usart2_Init(u32 bound);
extern char rxdatabufer;
extern u16 point1;
extern _SaveData Save_Data;
void CLR_Buf(void);
u8 Hand(char *a);
void clrStruct(void);
#endif
2.移植程序中的主要代碼,我直接將我移植好的代碼展示在這里,可以直接放到我們的點(diǎn)c文件里面進(jìn)行獲取顯示即可
獲取以及解析經(jīng)緯度
void errorLog(U8 num)
{
while (1)
{
printf("ERROR%drn", num);
}
}
// 獲取GPS定位信息
void parseGpsBuffer()
{
char *subString;
char *subStringNext;
char i = 0;
char usefullBuffer[2];
if (Save_Data.isGetData)
{
Save_Data.isGetData = false;
for (i = 0; i <= 6; i++)
{
if (i == 0)
{
if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
errorLog(1); // 解析錯(cuò)誤
}
else
{
subString++;
if ((subStringNext = strstr(subString, ",")) != NULL)
{
switch (i)
{
case 1:
memcpy(Save_Data.UTCTime, subString, subStringNext - subString);
break; // 獲取UTC時(shí)間
case 2:
memcpy(usefullBuffer, subString, subStringNext - subString);
break; // 獲取UTC時(shí)間
case 3:
memcpy(Save_Data.latitude, subString, subStringNext - subString);
break; // 獲取緯度信息
case 4:
memcpy(Save_Data.N_S, subString, subStringNext - subString);
break; // 獲取N/S
case 5:
memcpy(Save_Data.longitude, subString, subStringNext - subString);
break; // 獲取經(jīng)度信息
case 6:
memcpy(Save_Data.E_W, subString, subStringNext - subString);
break; // 獲取E/W
default:
break;
}
subString = subStringNext;
Save_Data.isParseData = true;
if (usefullBuffer[0] == 'A')
Save_Data.isUsefull = true;
else if (usefullBuffer[0] == 'V')
Save_Data.isUsefull = false;
}
else
{
errorLog(2); // 解析錯(cuò)誤
}
}
}
}
}
F32 longitude_sum, latitude_sum;
U8 longitude_int, latitude_int;
void printGpsBuffer()
{
// 轉(zhuǎn)化為數(shù)字
longitude_sum = atof(Save_Data.longitude);
latitude_sum = atof(Save_Data.latitude);
// printf("維度 = %.5f %.5frn",longitude_sum,latitude_sum);
// 整數(shù)
longitude_int = longitude_sum / 100;
latitude_int = latitude_sum / 100;
// 轉(zhuǎn)化為經(jīng)緯度
longitude_sum = longitude_int + ((longitude_sum / 100 - longitude_int) * 100) / 60;
latitude_sum = latitude_int + ((latitude_sum / 100 - latitude_int) * 100) / 60;
if (Save_Data.isParseData)
{
Save_Data.isParseData = false;
// printf("Save_Data.UTCTime = %srn", Save_Data.UTCTime);
if (Save_Data.isUsefull)
{
Save_Data.isUsefull = false;
// printf("經(jīng)度 = %srn",Save_Data.longitude);
// printf("經(jīng)度 = %.5frn", longitude_sum);
// printf("維度 = %srn",Save_Data.latitude);
// printf("緯度 = %.5frn", latitude_sum);
}
else
{
// printf("GPS DATA is not usefull!rn");
}
}
}
// 獲取數(shù)據(jù)參數(shù)
void Read_Data()
{
// 經(jīng)緯度獲取
parseGpsBuffer();
// 解析經(jīng)緯度
printGpsBuffer();
}
3.前兩步做完之后就可以使用我們的顯示屏或者使用串口進(jìn)行打印出來(lái)了,這樣就可以獲取我們所在區(qū)域的大概經(jīng)緯度,最后可以再通過平臺(tái)進(jìn)行經(jīng)緯度定位就行啦
顯示經(jīng)緯度
三、參考
STM32——定位模塊ATGM336H,數(shù)據(jù)解析,提取經(jīng)緯度https://blog.csdn.net/qq_51963665/article/details/125892763?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170202503816800186588658%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170202503816800186588658&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-125892763-null-null.nonecase&utm_term=ATGM336H&spm=1018.2226.3001.4450
????END????
聯(lián)系方式 微信號(hào):13648103287