GNSS模块教程:大夏龙雀 DX-GP21,从硬件接线到 NMEA 数据解析
本文详细介绍了大夏龙雀科技DX-GP21多模多频GNSS模块的应用开发全流程。该模块支持北斗、GPS等多系统联合定位,精度1m,具有低功耗、小尺寸特点。文章从硬件接线、AT指令配置、NMEA协议解析到Arduino实战代码实现,系统讲解了模块使用要点,包括:核心参数说明、典型应用场景、引脚定义、关键配置指令、NMEA数据解析方法,并提供了完整的Arduino示例代码。同时总结了开发中常见问题。
在物联网、无人机、精准农业等场景中,高精度定位是核心需求。深圳大夏龙雀科技的 DX-GP21 作为一款多模多频 GNSS 模块,支持北斗、GPS、Galileo 等多系统联合定位,定位精度<1.0m,兼具低功耗、小尺寸特性,性价比极高。

DX-GP21-A
我将基于模块技术手册和串口应用指导,从硬件接线、参数配置、NMEA 协议解析到实战代码实现,全方位拆解 DX-GP21 的使用流程,帮助开发者快速上手,避开常见问题。(本文硬件设计和AT指令参考自大夏龙雀官方技术手册,感谢官方提供的详尽资料。本文重点分享个人实战经验与解决方案。)。
一、模块核心特性与应用场景
在动手前,先明确 DX-GP21 的核心优势,判断是否适配你的项目:
1. 核心参数(来自官方技术手册)
- 定位性能:支持北斗二号 / 三号、GPS、QZSS多模,L1/L2/L5 多频点,水平定位精度<1.0m,测速精度<0.1m/s;
- 启动速度:热启动≤1s,冷启动≤30s,重捕获≤1s,搭配 VBAT 备用电源可实现快速热启动;
- 接口与功耗:UART 串口通信,持续追踪功耗 41.77mA@3.3V,电池备份模式仅 15μA;
- 工作环境:温度范围 - 40℃~+85℃,静电防护 ±5kV,适应户外、工业等复杂场景;
- 特殊功能:集成抗干扰硬件电路,支持 1PPS 高精度授时,内置天线短路 / 开路检测。
DX-GP21-A
2. 典型应用场景
- 无人机、机器人导航定位;
- 精准农业、土壤监测设备;
- 车载定位终端、追踪器;
- 电力 / 5G 通信授时设备;
- 可穿戴设备、防丢器。
二、硬件准备与接线指南
1. 物料清单
| 物料名称 | 规格要求 | 作用 |
|---|---|---|
| DX-GP21 模块 | 标准版 | 核心定位模块 |
| 主控板 | Arduino Nano/STM32F103 | 数据解析与控制 |
| 天线 | 有源陶瓷天线(推荐)/ 无源天线 | 卫星信号接收 |
| 电源 | 3.3V 稳压电源(纹波≤66mV) | 模块供电 |
| USB-TTL 转换器 | 支持 3.3V 电平 | 串口调试 |
| 杜邦线 | 公对母 / 公对公 | 接线 |
| 面包板 | 通用款 | 临时测试 |
| 备用电池 | 3.3V 纽扣电池 | 电池备份模式供电 |
2. 引脚定义与接线
DX-GP21 采用 18-pin LCC 封装,核心引脚功能如下:
| 引脚编号 | 引脚名称 | I/O 类型 | 功能描述 | 接线说明 |
|---|---|---|---|---|
| 2 | TXD0 | DO | 串口数据输出(NMEA 数据) | 接主控板 RX(需电平匹配,3.3V 直接接,5V 需串 1kΩ 电阻) |
| 3 | RXD0 | DI | 串口数据输入(AT 指令) | 接主控板 TX |
| 8 | VCC | PI | 主电源输入(2.7~3.6V,推荐 3.3V) | 接 3.3V 稳压电源,靠近引脚并联 10uF+100nF 滤波电容 |
| 6 | VBAT | PI | 备用电源(1.5~3.6V) | 可选接纽扣电池,用于保存星历数据 |
| 4 | 1PPS | DO | 秒脉冲输出(定位成功后 1Hz 脉冲) | 接 LED 指示灯(串 220Ω 电阻),可视化定位状态 |
| 11 | RF_IN | ANT | 天线信号输入 | 接 GNSS 天线,射频走线阻抗 50Ω,远离金属遮挡 |
| 14 | VCC_RF | PO | 有源天线供电(3.3V,限流 50mA) | 接有源天线电源引脚 |
| 1,10,12 | GND | G | 地 | 与主控板、电源共地 |

使用CH340与DX-GP21通信(开发者套件)
3. 接线示意图,以 Arduino Nano 为例
DX-GP21 Arduino Nano 其他外设
VCC ---------- 3.3V 3.3V稳压电源
GND ---------- GND 共地
TXD0 --------- RX(D0) 串1kΩ电阻
RXD0 --------- TX(D1)
1PPS --------- D2 串220Ω电阻接LED
RF_IN -------- 有源天线 天线净空
VBAT --------- 3.3V纽扣电池
⚠️ 关键注意事项:
- 电源纹波需控制在 66mV以内,否则会影响定位稳定性;
- 天线需远离金属物体和射频干扰源,有源天线供电必须通过 VCC_RF 引脚;
- 5V 主控板(如 Arduino Uno)需做电平转换,避免 TX/RX 引脚因电压过高烧毁模块。
三、模块参数配置
DX-GP21 通过 UART 串口接收 AT 指令配置,指令格式为$PCA<param1>,<param2>*CS<CR><LF>,默认波特率 115200bps。
推荐使用 SSCOM5.13.1 串口工具配置,步骤如下:
1. 串口工具配置
- 波特率:115200bps,数据位 8,停止位 1,无校验,无流控;
- 勾选 “加回车换行”,发送指令后等待模块响应(成功返回 OK,失败返回 ERROR)。
2. 常用 AT 指令实战(必学)
(1)波特率设置,默认 115200bps
// 设置波特率为9600bps(指令带校验和,不可修改)
发送:$PCAS01,1*1D
响应:OK → 需重启模块生效,重启后串口工具波特率需同步修改
| 波特率 | 指令 | 校验和 |
|---|---|---|
| 4800 | $PCAS01,0*1C | 1C |
| 9600 | $PCAS01,1*1D | 1D |
| 115200 | $PCAS01,5*19 | 19 |
(2)定位更新率配置
// 设置更新率为1Hz(每秒输出1次定位数据)
发送:$PCAS02,1000*2E
响应:OK
// 设置更新率为2Hz(每秒2次,最大支持10Hz)
发送:$PCAS02,500*1A
(3)卫星系统选择
// 仅启用GPS+BDS双系统
发送:$PCAS04,3*1A
响应:OK
// 启用全部系统(GPS+BDS+GLONASS+QZSS+Galileo)
发送:$PCAS04,7F*58
(4)NMEA 语句输出控制
// 仅开启GGA(定位信息)和RMC(最小定位信息)语句
发送:$PCAS03,1,0,0,0,1,0,0,0,0,,,0,0*02
响应:OK
// 开启所有NMEA语句
发送:$PCAS03,1,1,1,1,1,1,1,1,1,1,,,1,1*02
(5)配置保存与重启
// 保存当前配置(波特率、更新率等)到FLASH,断电不丢失
发送:$PCAS00*01
响应:OK
// 冷启动(清除星历数据,重新搜星)
发送:$PCAS10,2*1E
响应:OK + RDY
(6)查询产品信息
// 查询固件版本号
发送:$PCAS06,0*1B
响应:+VERSION=CT11_V1.0.1 → 不同版本返回不同
// 查询硬件型号及序列号
发送:$PCAS06,1*1A
3. 配置验证
配置完成后,发送$PCAS06,2*19查询工作模式,若返回多模系统标识,说明配置生效。

模块返回定位信息
四、NMEA 协议解析
DX-GP21 定位成功后,会通过 TXD0 引脚输出 NMEA 0183 协议数据,核心语句包括 GGA:定位详细信息、RMC:最小定位信息、GSV:卫星状态,我们只需解析前两类即可获取经纬度、海拔、时间等关键数据。
1. 核心 NMEA 语句格式说明
(1)GGA 语句
示例:$GNGGA,073028.600,2236.40101,N,11349.73472,E,1,19,0.8,14.2,M,-4.0,M,,*6E
| 字段序号 | 字段含义 | 示例值 | 说明 |
|---|---|---|---|
| 1 | UTC 时间 | 073028.600 | 格式:hhmmss.sss |
| 2 | 纬度 | 2236.40101 | 格式:ddmm.mmmm(度分制) |
| 3 | 纬度方向 | N | N = 北半球,S = 南半球 |
| 4 | 经度 | 11349.73472 | 格式:dddmm.mmmm(度分制) |
| 5 | 经度方向 | E | E = 东半球,W = 西半球 |
| 6 | 定位质量 | 1 | 0 = 无效,1 = 有效(SPS 模式) |
| 7 | 卫星数量 | 19 | 参与定位的卫星数(0~24) |
| 8 | 水平精度因子 | 0.8 | 越小精度越高(0.5~99.9) |
| 9 | 海拔高度 | 14.2 | 单位:米 |
(2)RMC 语句
示例:$GNRMC,073028.600,A,2236.40101,N,11349.73472,E,0.00,0.00,090724,,,A,V*00
| 字段序号 | 字段含义 | 示例值 | 说明 |
|---|---|---|---|
| 1 | UTC 时间 | 073028.600 | 格式:hhmmss.sss |
| 2 | 定位状态 | A | A = 有效,V = 无效 |
| 3-6 | 经纬度及方向 | 同 GGA 语句 | 度分制格式 |
| 7 | 对地速度 | 0.00 | 单位:节(1 节≈1.852km/h) |
| 8 | 对地航向 | 0.00 | 单位:度(0~359) |
| 9 | 日期 | 090724 | 格式:ddmmyy |
2. 度分制转十进制
NMEA 语句中的经纬度为度分制,需转换为十进制才能用于地图定位:
- 纬度转换:
十进制纬度 = 度 + 分/60(示例:2236.40101 → 22 + 36.40101/60 ≈22.6067°) - 经度转换:
十进制经度 = 度 + 分/60(示例:11349.73472 → 113 + 49.73472/60 ≈113.8289°)
五、使用MCU应用模块信息:Arduino 解析 NMEA 数据
以下代码基于 Arduino Nano,实现 NMEA 数据读取、GGA/RMC 语句解析、经纬度转换,直接复制可用:
#include <SoftwareSerial.h>
// 串口:RX=D0(接模块TXD0),TX=D1(接模块RXD0)
SoftwareSerial gp21Serial(0, 1);
// 存储解析后的数据
struct GNSSData {
float lat; // 十进制纬度(°)
float lon; // 十进制经度(°)
float altitude; // 海拔(m)
int satNum; // 卫星数量
bool isValid; // 定位是否有效
String utcTime; // UTC时间
} gnssData;
void setup() {
Serial.begin(115200); // 串口监视器输出
gp21Serial.begin(115200); // 模块串口波特率
gnssData.isValid = false;
Serial.println("DX-GP21 GNSS模块初始化完成,等待定位...");
}
void loop() {
// 读取模块输出的NMEA数据
while (gp21Serial.available() > 0) {
String nmea = gp21Serial.readStringUntil('\n');
Serial.println(nmea); // 打印原始数据(调试)
// 解析GGA语句
if (nmea.startsWith("$GNGGA")) {
parseGGA(nmea);
}
// 解析RMC语句(验证定位状态)
else if (nmea.startsWith("$GNRMC")) {
parseRMC(nmea);
}
}
// 每隔2秒打印解析结果
static unsigned long lastPrintTime = 0;
if (millis() - lastPrintTime > 2000) {
printGNSSData();
lastPrintTime = millis();
}
}
// 解析GGA语句
void parseGGA(String nmea) {
int commaCount = 0;
String fields[15] = {""}; // 存储GGA语句字段
// 分割逗号分隔的字段
for (int i = 0; i < nmea.length(); i++) {
if (nmea[i] == ',') {
commaCount++;
continue;
}
if (commaCount < 15) {
fields[commaCount] += nmea[i];
}
}
// 提取关键字段(字段2=纬度,3=纬度方向,4=经度,5=经度方向,7=卫星数,9=海拔)
if (fields[6] == "1" || fields[6] == "6") { // 定位有效(1=SPS,6=估算模式)
// 纬度转换:ddmm.mmmm → 十进制
float latDeg = fields[2].substring(0, 2).toFloat();
float latMin = fields[2].substring(2).toFloat();
gnssData.lat = latDeg + latMin / 60.0;
if (fields[3] == "S") gnssData.lat = -gnssData.lat;
// 经度转换:dddmm.mmmm → 十进制
float lonDeg = fields[4].substring(0, 3).toFloat();
float lonMin = fields[4].substring(3).toFloat();
gnssData.lon = lonDeg + lonMin / 60.0;
if (fields[5] == "W") gnssData.lon = -gnssData.lon;
// 其他数据
gnssData.satNum = fields[7].toInt();
gnssData.altitude = fields[9].toFloat();
gnssData.utcTime = fields[1];
}
}
// 解析RMC语句
void parseRMC(String nmea) {
int commaCount = 0;
String fields[13] = {""};
for (int i = 0; i < nmea.length(); i++) {
if (nmea[i] == ',') {
commaCount++;
continue;
}
if (commaCount < 13) {
fields[commaCount] += nmea[i];
}
}
// 定位状态:A=有效,V=无效
gnssData.isValid = (fields[2] == "A");
}
// 打印解析结果
void printGNSSData() {
Serial.println("GNSS定位结果:"/r/n);
if (gnssData.isValid) {
Serial.print("UTC时间:"); Serial.println(gnssData.utcTime);
Serial.print("纬度:"); Serial.print(gnssData.lat, 6); Serial.println(" °");
Serial.print("经度:"); Serial.print(gnssData.lon, 6); Serial.println(" °");
Serial.print("海拔:"); Serial.print(gnssData.altitude); Serial.println(" m");
Serial.print("卫星数量:"); Serial.println(gnssData.satNum);
} else {
Serial.println("定位无效,请检查天线或所处环境!");
}
Serial.println("--------------------------------------------------\n");
}
代码说明
- 采用软件串口与模块通信,避免占用硬件串口;
- 同时解析 GGA 和 RMC 语句,GGA 获取详细数据,RMC 验证定位有效性;
- 包含度分制转十进制逻辑,直接输出可用于地图的经纬度;
- 串口监视器同时打印原始 NMEA 数据和解析结果,方便调试。
接线示意

UART接口参考设计
六、开发过程常见问题总结
1. 串口乱码
- 波特率不匹配:确认模块波特率(115200),修改后需重启模块并同步串口工具设置;
- 电平不匹配:5V 主控板未串电阻,导致模块 TX 引脚烧毁,需更换模块并加 1kΩ 电阻;
- 电源纹波过大:模块 VCC 引脚未并联滤波电容,需添加 10uF 电解电容 + 100nF 陶瓷电容。
DX-GP21模块典型供电电路
2. 定位无效
- 天线问题:处于室内环境天线遮挡、有源天线未接 VCC_RF;
有源天线参考设计
无源天线参考设计
- 冷启动未完成:首次使用需在户外开阔处等待 30 秒,模块完成搜星;
- 卫星系统未启用:通过
$PCAS04,7F*58指令开启全部卫星系统。
3. 定位精度差(误差>5m)
- 水平精度因子过大:卫星数量不足(<4 颗)或信号干扰,移动到开阔环境;
- 天线安装不当:射频走线未做 50Ω 阻抗控制,或天线朝向错误(要朝上);
- 未启用多模多频:确保开启北斗 + GPS 联合定位,提升抗干扰能力。
4. 模块功耗过高
- 未启用电池备份模式:VBAT 引脚接纽扣电池,模块休眠时仅 15μA 功耗;
- 更新率过高:非必要场景下,将更新率从 10Hz 降至 1Hz,功耗可降低 50%。
七、低功耗优化与多模块联动思路
1. 低功耗配置(电池供电场景)
// 配置更新率为5秒1次(降低功耗)
void setLowPower() {
gp21Serial.println("$PCAS02,5000*2A"); 5000ms=0.2Hz
delay(500);
gp21Serial.println("$PCAS00*01"); // 保存配置
}
2. 与 4G 模块联动(如大夏龙雀科技公司 DX-CT11)
将解析后的经纬度通过 4G 模块上传到云平台,实现远程定位监控,核心代码片段:
// ct11Serial为4G模块串口
void sendToCloud() {
if (gnssData.isValid) {
String data = "lat:" + String(gnssData.lat, 6) + ",lon:" + String(gnssData.lon, 6);
ct11Serial.println("AT+QMTPUB=\"gps/location\",0,0," + data); // MQTT上传
}
}
八、总结
DX-GP21 作为一款高性价比 GNSS 模块,通过多模多频设计实现了 1 米级定位,操作流程清晰:硬件接线 → AT 指令配置 → NMEA 数据解析 → 实际应用。
本文示例的代码可用于 Arduino 平台,STM32 等其他平台可参考逻辑修改串口初始化部分。如果需要进一步优化低功耗、提升定位精度,可深入研究模块的抗干扰配置和天线选型(推荐有源陶瓷天线)或咨询深圳大夏龙雀科技有限公司相关技术人员。
本文基于作者真实开发过程编写,相关有效经验均已记录,具体技术细节严格参考DX-GP21技术手册(可访问深圳大夏龙雀科技官方网站获取资料),建议开发时随时查阅。
更多推荐



所有评论(0)