【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块开发
序
在无比漫长寒假中接取的 STM32L0 任务使我对 STM32 开发流程有了大致认识。
(重点吐槽下亿百特家的模块手册中居然一点例程代码都不给!)
应用外设
Gps 模块、WiFi 模块、蓝牙模块都是通过串口与 MCU 相连接,对于串口收发数据与分析思路显得尤为重要。
(苦恼了 3 天的 Gps 数据分析被实验室老大一语道破,两小时就完成了 QAQ)
Gps 模块
GPS 模块是集成了 RF 射频芯片、基带芯片和核心 CPU,并加上相关外围电路而组成的一个集成电路。
目前GPS模块的GPS芯片大部分采用全球市占率第一的SiRFIII系列为主。由于GPS模块采用的芯片组不一样,性能和价格也有区别,采用SIRF三代芯片组的GPS模块性能最优,价格也要比采用MTK或者MSTAR等GPS芯片组的贵很多。现阶段也持续在芯片升级,比方sirf4,然后又是sirf5,总体灵敏度提高了不少,缩短了定位时间,同时也帮助了客户快速的进入了定位应用状态。
学长帮我购买的是 E108-GN01-TB
拿到模块的第一时间肯定是确定模块是否正常工作(怪硬件!怪元器件!)
首先拿 naviTrack 上位机连接 Gps 模块的外置串口,收到的数据如图所示。在 Gps NMEA 数据介绍 这篇博客中可以得知相关数据的含义。
找到自己“心仪”的数据后,接下来就是接受她并展示出来辣。
开始我苦于没有思绪,跟着 某火 某点 的思路,一次接收上百上千条字符串逐条按数据头用strstr()
与查找逗号解析,后在测试接收 Gps 数据并通过串口打印时发现芯片在工作一段时间后会跑飞(至今未破案,但我认为是在 Gps 串口接收 Usb 串口转发时不同步与中断过程中处理数据时间过久导致的),后在老大指点下想出新的解析思路。
状态图
从校验 $ 状态开始,若接收到 $ 代表接下来的数据是一帧完整数据,进入校验数据头状态。
若接收到的数据头 为 目标数据头,那么就进入接收状态,反之退回到校验 $ 状态。
若在接收状态得到了 $ 则说明这一数据帧已结束,则回到校验数据头状态,继续校验数据头。
而数据处理的过程应该接收完完整一帧数据后,也就是接收状态转移到校验数据头状态之中。
(在此先上流程图与状态转移图,相关代码考完试补全)
单帧解析思路按逗号开始与结束
例如:我的需求是得到经纬度与日期时间,所以我选择了 GPRMC这帧数据
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
在去掉 $ 与 GPRMC 后遍历 Gps 数据数组提取出逗号之间的数据依次放入结构,即可得到自己想要的信息。
- UTC时间需要通过小时位 +8 得到北京时间
- 经纬度数据需要转换成dd.mmmmmm才可正常使用(亲测不转换相差几公里)