在物联网、无人机、精准农业等场景中,高精度定位是核心需求。深圳大夏龙雀科技的 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技术手册(可访问深圳大夏龙雀科技官方网站获取资料),建议开发时随时查阅。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐