4、通信接口与协议:UART串口通信详解、I2C与SPI接口应用、NMEA-0183协议解析、RTCM差分数据格式

做车载定位这些年,我最大的感触就是:定位芯片再牛,通信接口搞不定,一切都是白搭。你想想看,GPS和北斗模块输出的数据,总得有个通道传到MCU里吧?这个通道怎么搭、数据怎么解析,就是我们今天要聊的核心。

4.1 UART串口通信详解

UART,说白了就是串口。这是定位模块最常用的接口,没有之一。我见过的定位模块,十有八九都是通过串口输出数据的。

为什么是UART? 因为它简单、可靠、抗干扰能力强。在车载这种电磁环境复杂的场景下,UART比I2C和SPI都更皮实。

关键参数配置:

  • 波特率:9600、115200 最常见。我个人习惯用115200,速度快,丢包率也低
  • 数据位:8位,固定不变
  • 停止位:1位
  • 校验位:无。定位数据本身有校验,串口层面再加校验反而容易出问题

我在项目中遇到过一个问题:某款北斗模块默认波特率是9600,但客户要求115200。结果改了波特率后,数据全是乱码。查了半天,原来是模块内部的晶振精度不够,高速率下时钟漂移导致采样错位。嗯,这里要注意:换波特率之前,先确认模块的晶振精度是否达标

4.2 I2C与SPI接口应用

UART虽然好用,但有个硬伤:只能点对点通信。如果你要接多个传感器,比如IMU、磁力计、气压计,那I2C或SPI就派上用场了。

I2C的特点:

  • 两根线:SDA(数据线)、SCL(时钟线)
  • 多从机模式,每个设备有唯一地址
  • 速度一般:标准模式100kHz,快速模式400kHz
  • 适合短距离、低速率的传感器数据读取

SPI的特点:

  • 四根线:MOSI、MISO、SCLK、CS
  • 全双工,速度可以跑到几十MHz
  • 没有地址概念,靠片选信号选通设备
  • 适合高速率、大数据量的传输

我的选择建议:

如果只是读个温度、气压这种低频数据,用I2C就够了。但如果你要读IMU的原始加速度和角速度,而且更新率要1000Hz以上,那必须上SPI。我曾经在I2C上硬扛IMU数据,结果CPU被I2C中断占满了,主循环都跑不动——血的教训。

4.3 NMEA-0183协议解析

这是GPS/北斗模块最常用的输出协议。说白了,就是一堆以美元符号开头的文本字符串。你打开串口助手,看到的就是这玩意儿。

常见的NMEA语句:

语句类型 含义 关键数据
$GPGGA 全球定位系统固定数据 时间、纬度、经度、海拔、卫星数
$GPRMC 推荐最小定位信息 时间、日期、速度、航向
$GPGSV 可见卫星信息 卫星编号、仰角、方位角、信噪比
$BDGGA 北斗定位数据 与GPGGA类似,但来自北斗卫星

解析NMEA其实不复杂,就是字符串分割。但有个坑:数据更新频率很高,一般1Hz到10Hz。如果你用单片机,千万别在中断里做字符串解析,否则CPU直接卡死。

避坑指南:

我曾经在STM32上直接在主循环里用sscanf解析NMEA,结果发现CPU占用率高达80%。后来改成DMA接收+环形缓冲区+状态机解析,CPU占用率直接降到5%以下。记住:定位数据解析,一定要用状态机,别用sscanf

4.4 RTCM差分数据格式

RTCM,全称是Radio Technical Commission for Maritime Services。听着挺唬人,其实就是差分定位用的数据格式。你想想看,普通GPS精度也就3-5米,但用了RTCM差分数据,精度可以干到厘米级。

RTCM的核心思想: 基准站把自己测到的误差广播出去,流动站收到后修正自己的定位结果。说白了就是「我告诉你我算错了多少,你照着改就行」。

常见的RTCM消息类型:

  • 类型1001-1004:GPS观测数据,包含伪距、载波相位
  • 类型1019-1020:GPS和GLONASS星历数据
  • 类型1071-1077:MSM格式,这是新一代的RTCM标准,更高效
  • 类型1230:GLONASS码相位偏差

RTCM解析要点:

  • RTCM是二进制格式,不是文本。别用字符串函数去处理
  • 每条消息都有CRC校验,必须验证,否则数据污染了都不知道
  • 消息长度不固定,需要根据消息类型和内容动态计算
  • 差分数据有有效期,超过30秒的差分数据就别用了

我记得有一次做车载高精度定位项目,RTCM数据通过4G网络从基准站传到车上。结果发现定位精度时好时坏。排查了半天,原来是网络延迟导致差分数据到达时已经过期了。后来加了时间戳校验和延迟补偿,问题才解决。所以啊,差分定位不只是协议解析的问题,还有时间同步的问题

小结

通信接口和协议这块,说白了就是「怎么把数据从模块里拿出来,再变成能用的信息」。UART是基础,I2C/SPI是扩展,NMEA是入门,RTCM是进阶。我个人建议:先吃透UART和NMEA,把基础打牢了,再去碰RTCM和差分定位。一口吃不成胖子,做嵌入式更是如此。

实战建议:

刚开始做定位项目时,别急着上差分。先用普通GPS/北斗模块,把UART通信、NMEA解析、数据滤波这些基本功练扎实了。等你能在示波器上看到UART波形、能用手写状态机解析NMEA、能画出定位轨迹图了,再考虑RTCM和厘米级定位。一步一个脚印,比什么都强。