【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发

记录

  • 应用外设
    • 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
拿到模块的第一时间肯定是确定模块是否正常工作(怪硬件!怪元器件!)
【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发_第1张图片
首先拿 naviTrack 上位机连接 Gps 模块的外置串口,收到的数据如图所示。在 Gps NMEA 数据介绍 这篇博客中可以得知相关数据的含义。

找到自己“心仪”的数据后,接下来就是接受她并展示出来辣。
开始我苦于没有思绪,跟着 某火 某点 的思路,一次接收上百上千条字符串逐条按数据头用strstr()与查找逗号解析,后在测试接收 Gps 数据并通过串口打印时发现芯片在工作一段时间后会跑飞(至今未破案,但我认为是在 Gps 串口接收 Usb 串口转发时不同步与中断过程中处理数据时间过久导致的),后在老大指点下想出新的解析思路。
【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发_第2张图片
状态图
【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发_第3张图片
校验 $ 状态开始,若接收到 $ 代表接下来的数据是一帧完整数据,进入校验数据头状态
若接收到的数据头 为 目标数据头,那么就进入接收状态,反之退回到校验 $ 状态
若在接收状态得到了 $ 则说明这一数据帧已结束,则回到校验数据头状态,继续校验数据头。
而数据处理的过程应该接收完完整一帧数据后,也就是接收状态转移到校验数据头状态之中。
(在此先上流程图与状态转移图,相关代码考完试补全)
单帧解析思路按逗号开始与结束
例如:我的需求是得到经纬度与日期时间,所以我选择了 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 数据数组提取出逗号之间的数据依次放入结构,即可得到自己想要的信息。

  1. UTC时间需要通过小时位 +8 得到北京时间
  2. 经纬度数据需要转换成dd.mmmmmm才可正常使用(亲测不转换相差几公里)

WiFi 模块

WiFi 模块部分选择的是比较常见的ESP8266系列
这部分原理也是比较简单的,拿到模块的第一时间先外接串口,拿电脑端的串口软件测试模块功能(我使用的是亿百特自己编写的上位机,只是把相关指令都集成在按钮中了,XCOM+AT 指令集也可达到同样效果)。模块调通后,对于模块使用者来说只需要初始化好对应引脚与串口,并正确发送指令。
TCP连接大致流程为

  1. AT+RST //上电重启模块,确保处于初始状态
  2. AT+CWMODE=1 //进入station模式
  3. AT+CWJAP_DEF=“Account”,“Password” //输入账号密码
  4. AT+CIPSTART=“TCP”,“IP 地址”,端口号 //建立连接
  5. AT+CIPMODE=1 //进入透传模式
  6. AT+CIPSEND //透传开始
  7. AT+CIPMODE=0 //退出透传模式
    这里推荐一个 在线 TCP/IP 调试工具 ,提供IP与端口方便大家调试。

蓝牙模块

蓝牙模块选择的是 E104-BT40。
蓝牙在这三个通信模块中比较好配置,上电自动进入 SPP 模式,拿蓝牙调试软件可直接连接通信。
发送数据只需要通过串口 Transmit 即可。
而接收数据则又是一个痛点,在这里蓝牙模块用来接收 WiFi 的账号密码,我为其设置了 3 个标志。
【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发_第4张图片
蓝牙状态转移相对于Gps接收就简单了很多(毕竟是自己设计状态),而状态之间利用不常用的ASCII码字符,例如 0x7B-“{” 0x7C-"|" 0x7D-"}"来作为状态转移的标志。
默认处于等待状态,接收到 7B 进入账号状态,收到的字符都存于账号数组中。
在账号状态中,接收到 7C 进入密码状态,接收到的字符都存于密码数组。
在密码状态时,接收 7D ,表明一次接收过程完毕,发送 WiFi 连接指令,然后回到等待状态。
不要在中断中连接 WiFi 不要在中断中连接 WiFi!在中断函数中貌似不允许 delay 过久。不知原因,有没有大佬在评论解释下)

低功耗

关于低功耗的资料还是比较少的,参考了某火代码进入低功耗的方式。

你可能感兴趣的:(实验室乱记)