关于入手的模块
看着店家介绍感觉店家十分凶猛:
不过没关系,给的资料还是很全的,谢谢店家不杀之恩!
关于模块的详细信息:
模块尺寸:28mm×28mm×8mm
接口定义:G-电源地,R-RX数据接收,T-TX数据发送,V-电源正,E-电源使能,S-PPS
指示灯定义:
长亮--启动正常,还没有定位。秒闪--已经定位。熄灭--模块异常。
定位精度:
1.5到2.5米@CEP,冷启动定位40秒左右,热启动定位秒定。(定位受周围环境影响)
工作条件:
电压 | 电流 |
---|---|
3.3V~5V | 25~35mA |
通讯接口:
UART串口,TTL,3.3V电平
数据协议:
使用协议为NMEA协议
默认输出国产北斗双模4.1版本数据
关于NMEA协议
协议简介
NMEA是National Marine Electronics Association 的缩写,是美国国家海洋电子协会的简称,现在是GPS导航设备统一的RTCM标准协议。(摘自百度百科)
NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。(摘自知乎专栏)
协议内容
首先数据协议的通讯接口使用的是UART串口,使用的参数如下:
名称 | 参数 |
---|---|
波特率 | 4800,9600,19200,38400,57600,115200 |
数据位 | 8位 |
停止位 | 1位 |
校验位 | 无 |
协议框架:
发送器标识符:
发送器 | 标识符 |
---|---|
北斗导航系统(BDS) | BD |
全球定位系统(GPS、SBAS、QZSS) | GP |
全球导航卫星系统(GLONASS) | GL |
全球导航卫星系统(GNSS) | GN |
自定义信息 | P |
系统标识符:
NMEA标准消息
GGA
GLL
GSA
GSV
RMC
VTG
ZDA
附一段从数据流中解析出各项信息的测试代码
#include "stdio.h"
#include "Debug.h"
void DataStream_Input(char *data);
double DataStream_GetNum(char *data, int thread);
//主函数模拟数据流
int main(void) {
char cmd[] = "$GPRMC,235316.000,A,2959.9925,S,12000.0090,E,0.009,75.020,020711,,,A*45\r\n";
for (int i = 0; cmd[i] != '\n'; ++i) {
DataStream_Input(cmd + i);
}
}
double DataStream_GetNum(char *data, int thread) {
//0:小数部分
//1:正整数模式
//-1:负整数模式
static char state[20] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
static int integer[20] = {0}, bitNum[20] = {0};
static double decimal[20] = {0};
switch (*data) {
case '-':
state[thread] = -1;
*data = '0';
break;
case '.':
state[thread] = 0;
*data = '0';
break;
default:;
}
switch (state[thread]) {
case 1:
case -1:
if (*data <= '9' && *data >= '0') {
integer[thread] = integer[thread] * 10 + state[thread] * ((int) *data - '0');
}
break;
case 0:
if (*data <= '9' && *data >= '0') {
decimal[thread] = decimal[thread] * 10 + ((int) *data - '0');
bitNum[thread]++;
}
break;
default:;
}
if (*data == ','
|| *data == '\r'
|| *data == '\n') {
for (int i = 1; i < bitNum[thread]; i++) {
decimal[thread] /= 10;
}
return integer[thread] + (integer[thread] >= 0 ? 1 : -1) * decimal[thread];
}
return 0;
}
void DataStream_Input(char *data) {
static int section = -2, i = 0;
static char str[6], statusFlag, uLat, uLon;
double utc, lat, lon, spd, cog, date;
if (*data == '$') {
section = 1;
i = 0;
} else if (*data == ',') {
switch (section) {
case 2:
utc = DataStream_GetNum(data, section);
break;
case 4:
lat = DataStream_GetNum(data, section);
break;
case 6:
lon = DataStream_GetNum(data, section);
break;
case 8:
spd = DataStream_GetNum(data, section);
break;
case 9:
cog = DataStream_GetNum(data, section);
break;
case 10:
date = DataStream_GetNum(data, section);
break;
default:;
}
section++;
} else {
switch (section) {
case 1:
str[i] = *data;
i++;
break;
case 2:
case 4:
case 6:
case 8:
case 9:
case 10:
DataStream_GetNum(data, section);
break;
case 3:
statusFlag = *data;
break;
case 5:
uLat = *data;
break;
case 7:
uLon = *data;
break;
}
}
if (*data == '\r') {
//信息处理
DebugLog("系统定位信息:%s\n", str);
//UTC解码
float a, b, c;
a = (int) utc / 10000;
b = (int) ((int) utc - 10000 * a) / 100;
c = utc - b * 100 - a * 10000;
printf("定位时间:%.0f:%.0f:%.0f\n", a, b, c);
if (statusFlag == 'V') {
DebugLog("数据无效,停止解析\n");
} else {
//数据有效性
DebugLog("数据有效\n");
//经纬度解析
a = (int) lat / 100;
b = lat - 100 * a;
DebugLog("当前纬度:%.0f°%.4f`%c\n", a, b, uLat);
a = (int) lon / 100;
b = lon - 100 * a;
DebugLog("当前经度:%.0f°%.4f`%c\n", a, b, uLon);
}
}
}
模块控制命令
使用方法:上电0.5s后从串口使用Hex方式将字符串命令发送到GPS模块。
系统控制
保存配置
24 50 43 41 53 30 30 2A 30 31 0D 0A
冷启动
24 50 43 41 53 31 30 2C 32 2A 31 45 0D 0A
热启动
24 50 43 41 53 31 30 2C 30 2A 31 43 0D 0A
恢复出厂设置
24 50 43 41 53 31 30 2C 33 2A 31 46 0D 0A
波特率控制
4800
24 50 43 41 53 30 31 2C 30 2A 31 43 0D 0A
9600(默认)
24 50 43 41 53 30 31 2C 31 2A 31 44 0D 0A
38400
24 50 43 41 53 30 31 2C 33 2A 31 46 0D 0A
57600
24 50 43 41 53 30 31 2C 34 2A 31 38 0D 0A
115200
24 50 43 41 53 30 31 2C 35 2A 31 39 0D 0A
刷新率控制
1Hz
24 50 43 41 53 30 32 2C 31 30 30 30 2A 32 45 0D 0A
2Hz
24 50 43 41 53 30 32 2C 35 30 30 2A 31 41 0D 0A
5Hz(115200bps)
24 50 43 41 53 30 32 2C 32 30 30 2A 31 44 0D 0A
10Hz(115200bps)
24 50 43 41 53 30 32 2C 31 30 30 2A 31 45 0D 0A
卫星系统
GPS单模
24 50 43 41 53 30 34 2C 31 2A 31 38 0D 0A
北斗单模
24 50 43 41 53 30 34 2C 32 2A 31 42 0D 0A
GPS+北斗(默认)
24 50 43 41 53 30 34 2C 33 2A 31 41 0D 0A
NMEA协议版本控制
4.1
24 50 43 41 53 30 35 2C 32 2A 31 41 0D 0A
4.0
24 50 43 41 53 30 35 2C 35 2A 31 44 0D 0A
2.2
24 50 43 41 53 30 35 2C 39 2A 31 31 0D 0A
动态模式控制
便携模式(默认)
24 50 43 41 53 31 31 2C 30 2A 31 44 0D 0A
静止模式
24 50 43 41 53 31 31 2C 31 2A 31 43 0D 0A
步行模式
24 50 43 41 53 31 31 2C 32 2A 31 46 0D 0A
车载模式
24 50 43 41 53 31 31 2C 33 2A 31 45 0D 0A
航海模式
24 50 43 41 53 31 31 2C 34 2A 31 39 0D 0A
航空模式(a<1G
24 50 43 41 53 31 31 2C 35 2A 31 38 0D 0A
航空模式(a<2G
24 50 43 41 53 31 31 2C 36 2A 31 42 0D 0A
航空模式(a<4G
24 50 43 41 53 31 31 2C 37 2A 31 41 0D 0A
静止漂移抑制速度
0.5m/s
BA CE 2C 00 06 07 00 20 00 00 00 00 00 00 08 00 01 00 00 03 B2 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F 34 23 B9 4D
1m/s
BA CE 2C 00 06 07 00 20 00 00 00 00 00 00 08 00 01 00 00 03 B2 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3F 34 23 39 4E
1.5m/s
BA CE 2C 00 06 07 00 20 00 00 00 00 00 00 08 00 01 00 00 03 B2 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 3F 34 23 79 4E
2.5m/s
BA CE 2C 00 06 07 00 20 00 00 00 00 00 00 08 00 01 00 00 03 B2 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 40 34 23 D9 4E
输出语句控制
关闭GGA
24 50 43 41 53 30 33 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭GLL
24 50 43 41 53 30 33 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭GSA
24 50 43 41 53 30 33 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭GSV
24 50 43 41 53 30 33 2C 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭RMC
24 50 43 41 53 30 33 2C 2C 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭VGT
24 50 43 41 53 30 33 2C 2C 2C 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭ZDA
24 50 43 41 53 30 33 2C 2C 2C 2C 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
关闭TXT
24 50 43 41 53 30 33 2C 2C 2C 2C 2C 2C 2C 2C 30 2C 2C 2C 2C 2C 2C 2A 33 32 0D 0A
附UTC时间转北京时间方法:
由于北京位于东八区,故时间领先于UTC时间+0800(即8小时),故时间计算方式如下:
-
UTC = 北京时间 - 8小时
-
北京时间 = UTC + 8小时