【实验室乱记】从 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
拿到模塊的第一時間肯定是確定模塊是否正常工作(怪硬件!怪元器件!)
首先拿 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 數據數組提取出逗號之間的數據依次放入結構,即可得到自己想要的信息。
WiFi 模塊
WiFi 模塊部分選擇的是比較常見的ESP8266系列
這部分原理也是比較簡單的,拿到模塊的第一時間先外接串口,拿電腦端的串口軟件測試模塊功能(我使用的是億百特自己編寫的上位機,只是把相關指令都集成在按鈕中了,XCOM+AT 指令集也可達到同樣效果)。模塊調通后,對于模塊使用者來說只需要初始化好對應引腳與串口,并正確發送指令。
TCP連接大致流程為
這里推薦一個 在線 TCP/IP 調試工具 ,提供IP與端口方便大家調試。
藍牙模塊
藍牙模塊選擇的是 E104-BT40。
藍牙在這三個通信模塊中比較好配置,上電自動進入 SPP 模式,拿藍牙調試軟件可直接連接通信。
發送數據只需要通過串口 Transmit 即可。
而接收數據則又是一個痛點,在這里藍牙模塊用來接收 WiFi 的賬號密碼,我為其設置了 3 個標志。
藍牙狀態轉移相對于Gps接收就簡單了很多(畢竟是自己設計狀態),而狀態之間利用不常用的ASCII碼字符,例如 0x7B-“{” 0x7C-"|" 0x7D-"}"來作為狀態轉移的標志。
默認處于等待狀態,接收到 7B 進入賬號狀態,收到的字符都存于賬號數組中。
在賬號狀態中,接收到 7C 進入密碼狀態,接收到的字符都存于密碼數組。
在密碼狀態時,接收 7D ,表明一次接收過程完畢,發送 WiFi 連接指令,然后回到等待狀態。
(不要在中斷中連接 WiFi 不要在中斷中連接 WiFi!在中斷函數中貌似不允許 delay 過久。不知原因,有沒有大佬在評論解釋下)
低功耗
關于低功耗的資料還是比較少的,參考了某火代碼進入低功耗的方式。
總結
以上是生活随笔為你收集整理的【实验室乱记】从 0 开始的 STM32L0 的 Gps WiFi 蓝牙模块物联网开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018程序员必读书单
- 下一篇: 基于51单片机的电子秤设计