Arduino 连接 NMEA-0183 设备全攻略:从硬件接线到协议解析
项目背景
NMEA-0183 是航海电子设备(GPS、声纳、自动驾驶仪等)的通用通信标准,基于 RS-422 差分信号(早期也有 RS-232 单端)。本项目演示如何利用 Arduino UNO 配合隔离型 RS422/RS485 扩展板,实现与 NMEA-0183 设备的可靠双向通信,并解析标准语句(如 $GPGGA, $GPRMC 等)。
所需硬件
- Arduino UNO R3 × 1
- RS422/RS485 隔离扩展板(含 SN65HVD75 或 MAX485 芯片)× 1
- NMEA-0183 设备(GPS 接收机、风速仪、深度声纳等)
- 双绞屏蔽线、端子排、杜邦线若干
接线指南
差分信号接法(标准 RS-422)
NMEA 设备通常提供 OUT+ / OUT-(发送)与 IN+ / IN-(接收)端子:
- 设备 OUT+ → 扩展板 A (Y/Z)
- 设备 OUT- → 扩展板 B (Y/Z)
- 设备 IN+ ← 扩展板 Y (A)
- 设备 IN- ← 扩展板 Z (B)
- 信号地 (GND) 互联(隔离板可不接地)

单端信号接法(RS-232 兼容)
若设备仅有单根 TX 线(标记为 TX、NMEA OUT),则为 RS-232 电平,需配合 MAX232/SP3232 转换模块降压至 TTL 电平,再接 Arduino 硬件串口(RX/TX)或软串口。
扩展板配置
跳线帽设置
- UART RX → 位置 2(接 Arduino D2,软串口接收)
- UART TX → 位置 3(接 Arduino D3,软串口发送)
- 电压选择 → 5V 位置(匹配 Arduino 逻辑电平)

DIP 开关设置
置于 RS-422 全双工模式:
- SW1: ON(启用驱动器)
- SW2: OFF(禁用终端电阻,由主设备端接)
- SW3: ON(全双工模式)
- SW4: OFF(自动收发控制)

固件开发
推荐库
使用 NMEA0183 by Justin R Cutler:GitHub 仓库
核心要点:
- 软串口引脚必须设为 D2(RX)、D3(TX)
- 波特率固定 4800(NMEA-0183 标准)
- 库自动校验校验和、解析字段、提取经纬度/速度/航向等
示例代码
#include <NMEA0183.h>
#include <SoftwareSerial.h>
SoftwareSerial gps(2, 3); // RX, TX
NMEA0183 nmea;
void setup() {
Serial.begin(115200);
gps.begin(4800);
Serial.println(F("NMEA0183 解析器测试"));
}
void loop() {
if (gps.available()) {
char c = gps.read();
if (nmea.update(c)) {
Serial.print(F("有效语句 ("));
Serial.print(nmea.getFields());
Serial.print(F(" 字段): "));
Serial.write(nmea.getSentence());
Serial.println();
// 示例:提取经纬度
if (nmea.getMsgType() == NMEA0183::GPGGA) {
Serial.print(F("纬度: ")); Serial.println(nmea.getLatitude(), 6);
Serial.print(F("经度: ")); Serial.println(nmea.getLongitude(), 6);
Serial.print(F("高度: ")); Serial.print(nmea.getAltitude()); Serial.println(F(" m"));
}
}
}
}
测试验证
- 上传代码,打开串口监视器(115200 波特率)
- 观察输出:应显示解析后的 NMEA 语句及字段数
- 无实体设备时,可用 PC 端模拟器(如 NMEA Simulator)配合 USB-RS485 适配器发送虚拟数据

常见问题排查
| 现象 | 可能原因 | 对策 |
|---|---|---|
| 无数据输出 | 波特率不匹配、RX/TX 反接、设备未供电 | 核对 4800 波特率,交换 RX/TX,检查设备供电 |
| 乱码/校验和错误 | 差分线反接、共模干扰、缺少终端电阻 | 交换 A/B 线,加 120Ω 终端电阻,使用屏蔽双绞线 |
| 仅收到部分语句 | 软串口缓冲区溢出、中断冲突 | 减少串口打印频率,改用硬件串口(Mega 多串口优势) |
应用拓展
- 数据记录:存储至 SD 卡或通过 WiFi/LoRa 上传云端
- 多设备融合:同时解析 GPS+风速+深度,构建船舶监测系统
- 协议转换:NMEA-0183 ↔ NMEA 2000 (CAN) 网关
- 自动驾驶集成:接入 ArduPilot/PX4 飞控作为外部导航源
制造工艺
- 用 Arduino 制作万能红外遥控器:分步指南
- Arduino + Android 蓝牙控制 Roomba Create 2 扫地机器人完整指南
- Arduino Mega 2560 接 NEO-6M GPS 模块完整教程
- Blynk + Arduino 读取 DHT11 温湿度数据教程
- 热敏电阻测温轻松上手:Arduino 分步实战教程
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- Arduino Modbus 从机开发全攻略:基于 RS485 扩展板的分步实现指南
- 基于 Arduino 的可靠 Power Blough-R 产品测试设备
- Arduino Pro Micro 实现 HID UPS:将"哑"电源升级为 USB 智能后备电源
- Arduino UNO 红外避障/接近传感器入门实战指南
- 刀具磨床实战技法指南:从入门到精通
- 精通 C# Queue:Enqueue、Dequeue 与先进先出操作全解析