2. NMEA 0183物理层与电气接口

很多初学者读NMEA 0183时,注意力都放在语句格式上,比如$GPGGA里各字段是什么意思。但真正在船上把设备接起来,最先出问题的往往不是“报文看不懂”,而是“根本收不到”。NMEA 0183的物理层是一套以RS-422差分信号为基础的串行接口规范,理解它的电气特性、参数配置和接线规则,是报文识读能够落地的前提。

一、差分信号:为什么不是简单的“TX接RX”

NMEA 0183规定发送端采用差分驱动,一对信号线分别标记为A(部分设备标为TX+、D+)和B(TX−、D−),接收端对应A/B输入。所谓差分,是指接收器判断的是两根线之间的电压差,而不是某根线对地的绝对电压。规范中,A相对B的电压差在某一方向大于约+2V时判为逻辑“1”(mark,空闲态),反向小于约−2V时判为逻辑“0”(space,起始位与数据位)。这种设计的意义在于:船上环境里电机、雷达、逆变器带来的共模干扰会同时叠加到两根线上,差分接收器把两线相减,共模部分被抵消,只留下有用的差值信号。

RS-422是单向发送、可多点接收的结构,一个发送器可驱动多个接收器,这正是NMEA 0183“一个Talker对多个Listener”的典型形态;RS-485则是双向、多点的总线结构,NMEA 0183中较少直接使用,但在部分多路复用器、网关设备上会以RS-485方式实现双向通信。识读时要注意:设备手册写“RS-422兼容”通常指差分电气层兼容,并不代表报文层一定符合NMEA 0183的语句集和波特率。

NMEA 0183 差分信号与共模干扰抑制示意 发送设备 Talker 如 GPS 接收机 差分驱动器 TX-A / TX-B A 线(TX+ / D+) B 线(TX− / D−) 共模干扰同时叠加到 A、B 两线 两线相减后干扰被抵消 接收设备 Listener 如 海图机 / 显示器 差分接收器 RX-A / RX-B 接收端判据(示例阈值) V(A) − V(B) > +2 V → 逻辑 1(空闲 / mark) V(A) − V(B) < −2 V → 逻辑 0(起始位 / space) 两线悬空或反接时差值不确定,接收端无法正确判决

二、波特率与数据位:必须两端一致

NMEA 0183最常见的配置是4800 bit/s、8数据位、无校验、1停止位(常写作4800-8-N-1),这也是多数老式GPS、测深仪、风速仪的默认值。较新的设备(如AIS、部分罗经、雷达)会使用38400 bit/s,同样8-N-1。识读报文前,先确认两端波特率一致,否则接收端会收到大量乱码或帧错误,表现为“有数据但全是怪字符”。

数据位固定为8位,因为NMEA语句是ASCII文本,每个字符正好一个字节。校验位通常为无校验(None),因为NMEA 0183在语句层用*hh校验和做完整性检查,物理层不再重复。停止位为1位。若设备手册标注“8-N-1”,就按此配置;若某设备只支持7位数据位,则无法正确承载NMEA语句中的大写字母和符号,应视为不兼容。

一个实用的估算:4800 bit/s下,每字符10位(1起始+8数据+1停止),每秒约480字符。一条GGA语句约70~80字符,因此每秒最多约6条语句。若同时接入GGA、RMC、VTG、GSA、GSV等多条语句,4800的带宽会很快吃紧,这也是为什么多语句输出设备常改用38400。识读时若发现语句更新率明显低于设备标称值,应检查波特率是否被设低。

三、常见接线与隔离要求

接线时最容易犯的错误是把A/B当成TX/RX随意交叉。正确做法是:发送端A接接收端A,发送端B接接收端B,即“同名相接”。若设备标注为TX+/TX−与RX+/RX−,则TX+接RX+、TX−接RX−。若接反,差分极性颠倒,接收端会把所有位取反,表现为持续帧错误或乱码。部分设备内部已做极性自适应,但不应依赖这一点。

关于地线:差分信号理论上不依赖地,但实际系统中两端若地电位差过大,会超出接收器共模范围(常见为−7V~+12V),导致误码甚至损坏接口。规范建议将两端信号地(GND)连接,但要注意船上不同设备可能取自不同配电回路,直接连地可能引入地环流。工程上更稳妥的做法是使用光电隔离的NMEA分配器或隔离模块,把Talker与Listener在电气上隔开,既传递信号又切断地环流路径。对于长距离、跨舱室、靠近大功率设备的线路,隔离几乎是必需的。

线材方面,应使用双绞屏蔽线,A/B两线绞在一起以提高共模抑制能力,屏蔽层单端接地(通常在接收端或分配器侧),避免两端接地形成屏蔽环流。线径和长度按设备手册,一般几十米内问题不大,但长线应降低波特率或加隔离中继。

四、典型故障排查

现场排查建议按“先电气、后参数、再报文”的顺序。先用万用表直流档测A、B对地电压:空闲时A约比B高2V以上(具体值随设备而异,常见A约3~5V、B约1~2V,仅供参考),若两线电压几乎相同或都为0,说明发送端未工作或线断。再用示波器看差分波形,正常应能看到清晰的方波跳变;若波形幅度很小或严重畸变,检查终端电阻、线长和干扰源。

参数层面,确认两端波特率、数据位、停止位、校验位完全一致;确认没有把RS-232设备直接接到差分口上(RS-232是单端、±12V电平,与差分不兼容,需转换器)。报文层面,若收到可读字符但校验和错误,检查是否线路干扰导致位翻转,或发送端语句本身校验和计算有误。若收到的是“半个语句”或频繁丢字符,优先怀疑波特率偏高、线太长或未加隔离。

排查小技巧:把疑似故障的Talker单独接到一台已知正常的接收设备(如带NMEA输入的测试仪或电脑串口加转换器),用串口助手以对应波特率观察原始字节。若原始字节可读且校验和正确,问题在接收端或线路;若原始字节就是乱码,问题在发送端配置或电气层。

最后提醒一点:NMEA 0183的“兼容”只在电气层和语句层同时满足时才有意义。识读报文之前,先把物理层这四件事——差分极性、波特率与帧格式、接线与地、隔离——确认清楚,后面的字段解析才有稳定的数据来源。