祝小蜜,溫琦霖
(廣州商學(xué)院,廣東廣州,511363)
近年來,我國老齡化越來越嚴(yán)重,高血壓、糖尿病等慢性疾病越來越多,再加上現(xiàn)在不健康的飲食和生活方式使得各種疾病越來越常見。遠(yuǎn)程的家庭醫(yī)生在社會(huì)上需求越來越大。同時(shí),現(xiàn)在市場(chǎng)上出現(xiàn)了一些常見的家庭用的藍(lán)牙醫(yī)療設(shè)備,如血壓計(jì)、血糖儀、電子聽診器等?;谶h(yuǎn)程家庭醫(yī)生的構(gòu)想,可以做一套基于現(xiàn)有設(shè)備的遠(yuǎn)程家庭醫(yī)生系統(tǒng)。常見的藍(lán)牙設(shè)備網(wǎng)關(guān)都采用帶系統(tǒng)的嵌入式,軟件開發(fā)難度相對(duì)較大,本文設(shè)計(jì)并實(shí)現(xiàn)了一種基于單片機(jī)的藍(lán)牙網(wǎng)關(guān)的軟件,設(shè)計(jì)不需要考慮藍(lán)牙協(xié)議、WIFI協(xié)議和4G通信協(xié)議的底層,可以快速的構(gòu)建藍(lán)牙數(shù)據(jù)到云端的通信,將這些常用的藍(lán)牙醫(yī)療設(shè)備的數(shù)據(jù)上傳至云服務(wù)器,為實(shí)現(xiàn)遠(yuǎn)程醫(yī)療打通了設(shè)備到云端的數(shù)據(jù)通信路徑。
藍(lán)牙網(wǎng)關(guān)的作用示意圖如圖1所示。
圖1 藍(lán)牙網(wǎng)關(guān)作用示意圖
本設(shè)計(jì)的網(wǎng)關(guān)功能是實(shí)現(xiàn)與四臺(tái)藍(lán)牙醫(yī)療設(shè)備的藍(lán)牙自動(dòng)連接和數(shù)據(jù)傳輸,實(shí)現(xiàn)網(wǎng)關(guān)通過WIFI模塊或4G模塊與云服務(wù)器雙向通信。另外考慮到可推廣性和可用性,設(shè)計(jì)WIFI賬戶和密碼、服務(wù)器IP和端口號(hào)等信息的修改功能,和設(shè)備連接狀態(tài)的指示等,這部分功能用按鍵和顯示屏實(shí)現(xiàn)。同時(shí)設(shè)計(jì)掉電記憶功能,用于掉電保存每個(gè)用戶修改后的WIFI的名稱、密碼和服務(wù)器的IP地址、端口號(hào),保證本設(shè)計(jì)的網(wǎng)關(guān)修改過上述信息后,掉電再開機(jī)時(shí),網(wǎng)關(guān)能連接上WIFI和服務(wù)器。
本設(shè)計(jì)的硬件框圖如圖2所示。其中主控單片機(jī)型號(hào)是STM32F103RCT6,串口擴(kuò)展電路使用WK2114芯片,藍(lán)牙模塊1、2、3使用低功耗藍(lán)牙模塊HLK-B40,用于連接血糖儀和兩個(gè)血壓儀藍(lán)牙,模塊4使用經(jīng)典藍(lán)牙模塊HC-05,用于連接聽診器,WIFI模塊使用ESP-12E,4G模塊使用銀爾達(dá)公司生產(chǎn)的Core-Air724 AT固件版本,按鍵使用三個(gè)普通的獨(dú)立按鍵,顯示屏使用常見的1.44寸IIC總線的TFT-LCD顯示屏,掉電記憶使用EEPROM,型號(hào)是AT24C02 。
圖2 硬件平臺(tái)系統(tǒng)框圖
整個(gè)軟件功能是首先進(jìn)行初始化,使網(wǎng)關(guān)能夠同時(shí)與4個(gè)藍(lán)牙模塊和WIFI模塊或4G模塊建立通信并使WIFI模塊或4G模塊能連接到服務(wù)器。初始化時(shí)要從AT24C02中讀取待聯(lián)網(wǎng)的WIFI的名稱、密碼和服務(wù)器的IP地址、端口號(hào)。初始化后網(wǎng)關(guān)處于空閑狀態(tài)下,該狀態(tài)網(wǎng)關(guān)服務(wù)器發(fā)送心跳包,服務(wù)器會(huì)回復(fù)心跳。當(dāng)服務(wù)器下發(fā)上傳數(shù)據(jù)的命令時(shí),網(wǎng)關(guān)退出空閑狀態(tài),此時(shí)如果對(duì)應(yīng)的藍(lán)牙設(shè)備有數(shù)據(jù)產(chǎn)生則給服務(wù)器上傳數(shù)據(jù),每0.5秒上傳一次數(shù)據(jù)包,每次上傳后服務(wù)器都會(huì)發(fā)送確認(rèn)數(shù)據(jù)包。當(dāng)服務(wù)器發(fā)送停止上傳命令時(shí),網(wǎng)關(guān)再次進(jìn)入空閑狀態(tài)??臻e狀態(tài)下即使接收到藍(lán)牙設(shè)備發(fā)送的數(shù)據(jù),也不會(huì)將數(shù)據(jù)上傳到服務(wù)器。當(dāng)網(wǎng)關(guān)在3秒內(nèi)收不到服務(wù)器的心跳或確認(rèn)信號(hào),或者初始化階段WIFI模塊不能聯(lián)網(wǎng),則認(rèn)為當(dāng)前WIFI模塊與服務(wù)器之間的連接中斷,此時(shí)啟動(dòng)4G模塊初始化,使4G模塊替代WIFI模塊與服務(wù)器之間建立連接并繼續(xù)實(shí)現(xiàn)數(shù)據(jù)上傳。如果4G模塊斷網(wǎng)了,則提醒用戶聯(lián)網(wǎng)失敗請(qǐng)重啟。另外顯示屏上可實(shí)時(shí)查看與藍(lán)牙設(shè)備以及服務(wù)器的連接狀態(tài),通過按鍵可以進(jìn)入修改界面,并修改WIFI賬戶和密碼以及服務(wù)器的IP地址和端口號(hào),并將修改后的值在AT24C02中保存起來。
軟件整體分為初始化、用戶交互、與服務(wù)器之間的心跳和命令處理、數(shù)據(jù)上傳和利用外部中斷接收藍(lán)牙數(shù)據(jù)等幾個(gè)模塊,其中用戶交互包括按鍵檢測(cè)和處理、連接狀態(tài)檢測(cè)和顯示。
注意,本文對(duì)于STM32單片機(jī)的外設(shè)的使用、按鍵、顯示、IIC時(shí)序、EEPROM使用等常用的設(shè)計(jì)不展開說明,主要說明幾個(gè)模塊的配置過程以及整體代碼的邏輯設(shè)計(jì)。
圖3 整體軟件框架和流程
初始化分為兩個(gè)部分,一部分是單片機(jī)本身的外設(shè)的初始化,包括對(duì)IO口,串口,定時(shí)器,外部中斷的初始化;另一部分是指對(duì)功能模塊的初始化,目的是做好底層調(diào)用函數(shù)和使相應(yīng)的模塊能正常工作,包括顯示屏和EEPROM用的IIC總線,WK2114串口擴(kuò)展芯片的使用,各個(gè)藍(lán)牙模塊、WIFI模塊、4G模塊的AT指令配置等。
2.2.1 單片機(jī)外設(shè)初始化
單片機(jī)本身外設(shè)的初始化具體步驟不展開說明,只說明設(shè)置時(shí)要考慮的參數(shù)。對(duì)于定時(shí)器來說,系統(tǒng)用到了0.5秒計(jì)時(shí)、5秒計(jì)時(shí)等多個(gè)計(jì)時(shí),對(duì)于多個(gè)計(jì)時(shí),并不需要很多個(gè)定時(shí)器,只需要取所有計(jì)時(shí)的最大公約數(shù)的時(shí)間作為定時(shí)器中斷時(shí)間,同時(shí)記錄進(jìn)中斷次數(shù),然后可以用進(jìn)中斷次數(shù)來判斷多個(gè)計(jì)時(shí)時(shí)間是否達(dá)到。所以定時(shí)器中斷周期設(shè)置為0.5秒,中斷次數(shù)10次即為5秒。串口初始化的目的是建立單片機(jī)與各個(gè)模塊之間的串口通信,之后才能設(shè)置模塊的功能并接收數(shù)據(jù)。本系統(tǒng)一共使用了單片機(jī)的三個(gè)串口,分別連接擴(kuò)展芯片的主串口、WIFI模塊和4G模塊的串口??紤]到數(shù)據(jù)傳輸速度至少要滿足電子聽診器12KB/s的傳輸速度,結(jié)合三種串口模塊能達(dá)到的串口最大速度,這三個(gè)串口的速度都設(shè)置為460800,這樣既能滿足設(shè)計(jì)需要,又不至于速度太高引起傳輸出錯(cuò)率增加。外部中斷是為了從WK2114上讀取藍(lán)牙設(shè)備傳來的數(shù)據(jù)。為了不丟失數(shù)據(jù),讀取數(shù)據(jù)需要盡快反應(yīng),所以使用中斷的方式從WK2114的FIFO中讀數(shù)據(jù),并把該中斷優(yōu)先級(jí)設(shè)置為最高。
2.2.2 串口擴(kuò)展芯片初始化
WK2114串口擴(kuò)展芯片初始化時(shí)先拉低RST引腳10ms,實(shí)現(xiàn)對(duì)WK2114串口擴(kuò)展芯片的復(fù)位,然后再拉高進(jìn)入到工作狀態(tài)。然后進(jìn)行主串口波特率的自動(dòng)匹配,方法是給主串口發(fā)送匹配碼0x55,WK2114 可以自動(dòng)測(cè)得此時(shí)MCU的波特率并把主接口UART的波特率鎖定,以后就以此波特率進(jìn)行通信;如果主接口需要再次更換波特率,需要對(duì)芯片硬件復(fù)位,然后再次進(jìn)行波特率測(cè)試和鎖定。匹配成功后,對(duì)每個(gè)子串口進(jìn)行初始化,包括使能子串口的時(shí)鐘、軟件復(fù)位子串口、使能子串口總中斷、使能子串口接收觸點(diǎn)中斷和超時(shí)中斷、初始化FIFO和設(shè)置固定中斷觸點(diǎn)、使能子串口的發(fā)送和接收使能,設(shè)置子串口波特率等。本設(shè)計(jì)使用外部中斷來處理各個(gè)子串口之間的數(shù)據(jù)接收。
使能了WK2112的子串口中斷來讀取FIFO中的數(shù)據(jù),每個(gè)子串口的中斷方式都設(shè)置為64觸點(diǎn)中斷和超時(shí)中斷,即當(dāng)任意一個(gè)子串口的FIFO中有64個(gè)字節(jié)數(shù)據(jù)或者在接收數(shù)據(jù)過程中有連續(xù)4個(gè)字節(jié)的時(shí)間內(nèi)沒有收到數(shù)據(jù),則觸發(fā)中斷。
為了保證子串口同時(shí)收到的數(shù)據(jù)都能被主串口及時(shí)讀出,那么主串口的傳輸速度要大于所有子串口的數(shù)據(jù)接收速度之和。本設(shè)計(jì)只有經(jīng)典藍(lán)牙模塊產(chǎn)生的數(shù)據(jù)速度快,要預(yù)留大于16KB/是的速度,所以對(duì)應(yīng)經(jīng)典藍(lán)牙模塊的子串口波特率設(shè)置為460800,其他三個(gè)藍(lán)牙產(chǎn)生數(shù)據(jù)的速度要小很多,所以另外三個(gè)子串口波特率設(shè)置為115200。
2.2.3 經(jīng)典藍(lán)牙模塊初始化
首先讓模塊的復(fù)位引腳在高電平狀態(tài)下,連續(xù)拉低兩次50ms,讓藍(lán)牙模塊進(jìn)入到AT指令模式。然后通過以下AT指令和步驟進(jìn)行配置:
AT+UART=460800,0,0:修改模塊的串口波特率;
AT+ROLE=1:設(shè)置為主機(jī)模式;
AT+BIND=藍(lán)牙地址:綁定藍(lán)牙地址NAP:UAP:LAP(十六進(jìn)制)綁定指令只有在指定藍(lán)牙地址連接模式時(shí)有效;
AT+LINK =藍(lán)牙地址:連接從機(jī)的配對(duì)地址;
AT+RESET:重啟模塊。
之后將藍(lán)牙RST引腳拉低,將保存這些AT指令配置并將進(jìn)入到運(yùn)行模式。
2.2.4 低功耗藍(lán)牙模塊初始化
當(dāng)MCU每次復(fù)位時(shí),通過對(duì)藍(lán)牙模塊復(fù)位引腳的重新配置,復(fù)位引腳在高電平狀態(tài)下拉低電平一秒鐘,讓藍(lán)牙模塊進(jìn)入到AT指令模式。然后通過以下AT指令和步驟進(jìn)行配置:
AT+BAND=115200:修改模塊的串口波特率;
AT+UUIDS=0000FFF000001000800000805F9B34 FB:藍(lán)牙模塊透?jìng)鞣?wù)默認(rèn)值UUIDS;
AT+UUIDR=0000FFF400001000800000805F9B34 FB:透?jìng)鞣?wù)中的Read特征默認(rèn)值UUIDR;
AT+UUIDW=0000FFF100001000800000805F9B34 FB:透?jìng)鞣?wù)中的Write特征默認(rèn)值UUIDW;
AT+ROLE=2:設(shè)置為主機(jī)模式;
AT+PINCODE=000000:設(shè)置配對(duì)碼;
AT+PEERMAC=藍(lán)牙的MAC地址:連接從機(jī)的配對(duì)地址;
AT+REBOOT=1:重啟模塊。
之后模塊將按照這些AT指令的配置并進(jìn)入到運(yùn)行模式。
2.2.5 WiFi模塊初始化
WiFi模塊的初始化通過對(duì)復(fù)位引腳進(jìn)行拉低250ms后拉高,實(shí)現(xiàn)WiFi模塊的復(fù)位,進(jìn)入到AT指令模式。然后通過以下AT指令和步驟進(jìn)行配置:
AT+CWMODE=3:模塊設(shè)置為softAP + station 模式;
AT+RST:重啟設(shè)備;
AT+UART_DEF=115200,8,1,0,1:設(shè)置串口波特率,并開啟串口流控制;
AT+CWJAP_CUR="WiFi名稱","WiFi密碼":配置模塊連接的WiFi名稱和密碼;
AT+CIFSR:查詢本地的IP地址;
AT+CIPMUX=0:設(shè)置多連接模式;
AT+CIPMODE=1:設(shè)置傳輸模式為透?jìng)髂J?,僅支持TCP單連接情況;
AT+CIPSTART="TCP","IP地址",端口號(hào):建立TCP連接;
AT+CIPSEND:在透?jìng)髂J綍r(shí),開始發(fā)送數(shù)據(jù)。
當(dāng)WiFi連接網(wǎng)絡(luò)失敗時(shí),會(huì)啟動(dòng)4G模塊的初始化,保證設(shè)備的聯(lián)網(wǎng)成功。
2.2.6 4G模塊初始化
復(fù)位引腳在低電平狀態(tài)下進(jìn)行拉高1100ms后再拉低,完成4G模塊的復(fù)位,當(dāng)復(fù)位完成時(shí),會(huì)接收到模塊發(fā)送的“SMS READY”,表示復(fù)位完成。然后通過以下AT指令和步驟進(jìn)行配置:
AT+CPIN?:查詢卡是否插好,直到接收到回應(yīng),否則嘗試重啟模塊;
AT+CSQ:查詢卡的信息質(zhì)量;
AT+CREG?:網(wǎng)絡(luò)注冊(cè)狀態(tài);
AT+CGATT?:附著GPRS網(wǎng)絡(luò);
AT+CIPMODE=1:設(shè)置為透?jìng)髂J剑?/p>
AT+CIPMUX=0:IP設(shè)置為單鏈接模式;
AT+CSTT="CMNET","","":選擇卡的類型APN,這里使用的是中國移動(dòng);
AT+CIICR:激活后獲取IP地址;
AT+CIFSR:查詢IP地址;
AT+CIPSCONT:保存TCP的IP地址參數(shù);
AT+CIPSTART="TCP","IP地址",端口號(hào):創(chuàng)建TCP連接。
以上每個(gè)步驟單片機(jī)都要收到對(duì)應(yīng)的回復(fù)才會(huì)進(jìn)行下一步。當(dāng)接收到服務(wù)器下發(fā)的”CONNECT”,表示連接服務(wù)器完成。當(dāng)4G初始化失敗時(shí),顯示屏上提示連接不成功請(qǐng)重啟。
用戶交互包括顯示屏和按鍵。顯示屏有兩個(gè)顯示界面,一個(gè)界面是顯示網(wǎng)關(guān)與藍(lán)牙以及與服務(wù)器之間的連接狀態(tài),與各藍(lán)牙模塊的連接狀態(tài)由藍(lán)牙模塊的狀態(tài)輸出引腳的狀態(tài)判斷,與服務(wù)器之間的連接狀態(tài)由是否收到服務(wù)器的心跳信號(hào)或數(shù)據(jù)接收信號(hào)判斷;另一個(gè)界面顯示修改WIFI用戶名和密碼以及服務(wù)器IP地址和端口號(hào)的過程。
用戶輸入使用了三個(gè)獨(dú)立按鍵,分別是KEY1、KEY2、KEY3。KEY1用于進(jìn)入修改狀態(tài)和切換修改的位數(shù)。設(shè)定家庭WIFI的用戶名和密碼都是8位的數(shù)字和小寫字母,而服務(wù)器的IP地址最大是255.255.255.255共12位數(shù)字,端口號(hào)最大是65535共5位數(shù)字,則總共需要修改的數(shù)字和字母位數(shù)是33位。系統(tǒng)正常工作時(shí)是顯示網(wǎng)關(guān)連接狀態(tài)的界面,當(dāng)按鍵KEY1第一次按下時(shí)畫面切換到信息修改界面,并處于第一個(gè)字符待修改的狀態(tài),界面上該位顯示為紅色,其他位置顯示為藍(lán)色,之后每次按下KEY1時(shí),待修改位都會(huì)切換到下一個(gè)并顯紅色,一直到第33個(gè)位置之后再按下一次就推出修改界面,回到連接狀態(tài)顯示界面,并且把修改之后的字符存入到EEPROM中。KEY2、KEY3用于待修改位的字符的加減,字符在0-9和a到z之間循環(huán)。
定時(shí)器初始化時(shí)設(shè)置為每0.5秒中斷一次,用于提供0.5秒的時(shí)基和5秒、100秒、200秒的計(jì)時(shí),其中0.5秒用于區(qū)分為階段1和階段2,兩個(gè)階段交替的處理數(shù)據(jù);5秒計(jì)時(shí)用于空閑狀態(tài)時(shí)每個(gè)5秒發(fā)送一次心跳包;100秒用于開始WIFI模塊初始化的計(jì)時(shí),如果WIFI在100秒內(nèi)初始化成功,就不再計(jì)這個(gè)時(shí)間了,如果計(jì)時(shí)超過100秒就認(rèn)為WIFI模塊聯(lián)網(wǎng)初始化不成功,這時(shí)要開啟4G模塊的初始化;200秒用于整個(gè)初始化階段的計(jì)時(shí),如果超過這個(gè)時(shí)間還沒有初始化成功,則認(rèn)為本網(wǎng)關(guān)連接不上網(wǎng)絡(luò),在顯示屏上提醒用戶重啟本網(wǎng)關(guān),如果初始化成功了,就會(huì)退出初始化狀態(tài),也就不再計(jì)時(shí)了。本文的流程圖都比較長(zhǎng),用偽代碼表達(dá)程序邏輯效果更好。定時(shí)器中斷服務(wù)函數(shù)的邏輯設(shè)計(jì)用偽代碼表示如下所示。
本網(wǎng)關(guān)根據(jù)服務(wù)器下發(fā)的命令處于空閑和非空閑兩種狀態(tài),空閑狀態(tài)不會(huì)上傳藍(lán)牙模塊收到的數(shù)據(jù),只上傳心跳包,非空閑狀態(tài)時(shí),如果藍(lán)牙設(shè)備有數(shù)據(jù)發(fā)送過來,就把數(shù)據(jù)上傳給服務(wù)器。系統(tǒng)上電默認(rèn)為空閑狀態(tài),此時(shí)每隔5秒給服務(wù)器發(fā)送心跳包??臻e狀態(tài)下如果收到開始上傳的命令,則系統(tǒng)進(jìn)入非空閑狀態(tài),非空閑狀態(tài)下,如果收到停止上傳的命令,則進(jìn)入空閑狀態(tài)。
不管在任何狀態(tài)下,任何數(shù)據(jù)包在網(wǎng)關(guān)和服務(wù)器的通信都是要回發(fā)確認(rèn)數(shù)據(jù)包的。如果網(wǎng)關(guān)發(fā)出任何數(shù)據(jù)的3秒內(nèi)收不到正確的服務(wù)器回發(fā)數(shù)據(jù),則認(rèn)為網(wǎng)關(guān)和服務(wù)器之間斷開連接了,此時(shí)如果是使用WIFI模塊跟服務(wù)器通信,則需要啟動(dòng)4G模塊的初始化,使4G模塊替代WIFI模塊與服務(wù)器之間建立連接并繼續(xù)實(shí)現(xiàn)數(shù)據(jù)上傳,如果是使用4G模塊在通信,則提示用戶聯(lián)網(wǎng)失敗,請(qǐng)重啟。
單片機(jī)計(jì)時(shí)都是使用的定時(shí)器,關(guān)于計(jì)時(shí)的邏輯是和定時(shí)器中斷函數(shù)一起實(shí)現(xiàn)的。與WIFI或4G模塊之間傳輸數(shù)據(jù)使用各自連接的串口。服務(wù)器下發(fā)的心跳回復(fù)、命令、接收數(shù)據(jù)回復(fù)都是固定長(zhǎng)度為31的數(shù)據(jù)字節(jié),只是其中的有效字節(jié)不同。判斷是否收到正確的回復(fù),通過串口接收中斷是否接收到31個(gè)的字節(jié)的數(shù)據(jù)且有效字節(jié)匹配。程序流程如下所示。
本設(shè)計(jì)采用WK2114串口拓展芯片,實(shí)現(xiàn)將一路異步串口拓展為 4 路 UART,用于連接四個(gè)藍(lán)牙模塊。WK2114是UART接口的4 通道 UART 器件,WK2114將一個(gè)標(biāo)準(zhǔn)異步串口擴(kuò)展成為4個(gè)增強(qiáng)功能串口。
擴(kuò)展的子通道的UART具備如下功能特點(diǎn):每個(gè)子通道UART的波特率、字長(zhǎng)、校驗(yàn)格式可以獨(dú)立設(shè)置,最高可以提供2Mbps 的通信速率,每個(gè)子通道具備收、發(fā)獨(dú)立的256 級(jí)FIFO,F(xiàn)IFO的中斷可按用戶需求進(jìn)行編程觸發(fā)點(diǎn)且具備超時(shí)中斷功能。FIFO功能非常必要。當(dāng)大量數(shù)據(jù)連續(xù)傳輸時(shí),需要單片機(jī)每0.5秒處理數(shù)據(jù)幀格式并配置串口DMA等,這需要一段時(shí)間,這段時(shí)間內(nèi)新的要傳輸?shù)臄?shù)據(jù)就可以暫存在FIFO緩沖區(qū),等待下一個(gè)周期的處理。
藍(lán)牙模塊都連接在串口擴(kuò)展芯片WK2114的四個(gè)子串口通道上,初始化完成后,當(dāng)任一個(gè)藍(lán)牙設(shè)備發(fā)送數(shù)據(jù)都會(huì)存在對(duì)應(yīng)子串口的FIFO中,當(dāng)滿足FIFO的觸點(diǎn)或超時(shí)中斷條件時(shí),都會(huì)觸發(fā)單片機(jī)的外部中斷,進(jìn)入外部中斷服務(wù)函數(shù)??紤]到可能會(huì)有多個(gè)藍(lán)牙設(shè)備同時(shí)發(fā)送,而所有的子串口觸發(fā)中斷的引腳是共用的,所以每次進(jìn)外部中斷,都對(duì)每個(gè)子通道的FIFO進(jìn)行讀取并置位設(shè)備收到過數(shù)據(jù)的標(biāo)記,保證不會(huì)漏掉數(shù)據(jù)。從每個(gè)子通道的FIFO都會(huì)讀取到數(shù)據(jù)長(zhǎng)度和數(shù)據(jù),要將新收到的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)的存儲(chǔ)數(shù)組中,同時(shí)記錄存儲(chǔ)數(shù)組的總長(zhǎng)度。根據(jù)擴(kuò)展芯片的特性,當(dāng)從某通道的FIFO讀出數(shù)據(jù)時(shí),該通道對(duì)應(yīng)的中斷標(biāo)記位就會(huì)清零的,基于此,在中斷服務(wù)函數(shù)中會(huì)循環(huán)檢查FIFO中是否有新的中斷標(biāo)記產(chǎn)生,如果有就繼續(xù)讀出,一直到4個(gè)FIFO中都沒有產(chǎn)生新的中斷標(biāo)記。這樣在中斷服務(wù)過程中,如果已經(jīng)讀過的子串口又收到了數(shù)據(jù),也會(huì)把新收到的讀出來并清掉新產(chǎn)生的標(biāo)記,保證不會(huì)在讀某個(gè)子串口數(shù)據(jù)的時(shí)候,漏掉其他子串口剛好發(fā)過來的數(shù)據(jù)。
數(shù)據(jù)上傳服務(wù)器是0.5秒一次,為了保證上傳過程中還能收到藍(lán)牙發(fā)來的數(shù)據(jù),給每一個(gè)藍(lán)牙設(shè)備的數(shù)據(jù)存儲(chǔ)都分配了兩個(gè)數(shù)組。每0.5秒時(shí)間到了都要切換一次接收藍(lán)牙數(shù)據(jù)的存儲(chǔ)數(shù)組,以便讓下一個(gè)0.5秒接收的數(shù)據(jù)存在另一個(gè)數(shù)組里。這樣每個(gè)0.5秒的周期到來時(shí),程序會(huì)通過串口DMA將上一個(gè)周期內(nèi)收到的數(shù)據(jù)發(fā)送出去,同時(shí)在觸發(fā)新的數(shù)據(jù)接收中斷時(shí),會(huì)將數(shù)據(jù)存儲(chǔ)到另一個(gè)數(shù)據(jù)存儲(chǔ)數(shù)組中,實(shí)現(xiàn)對(duì)數(shù)據(jù)接收和發(fā)送的乒乓操作,避免數(shù)據(jù)丟失。
對(duì)于每個(gè)藍(lán)牙設(shè)備,0.5秒可能收到的最大的數(shù)據(jù)量要了解清楚,以便分配足夠的緩存數(shù)組,本設(shè)計(jì)中,電子聽診器音頻的數(shù)組長(zhǎng)度經(jīng)過理論估算和實(shí)際測(cè)試,數(shù)組長(zhǎng)度設(shè)為8000,其他三個(gè)設(shè)備的數(shù)據(jù)量小,緩存數(shù)組長(zhǎng)度設(shè)置為255。
本段程序流程用如下的偽代碼表示。
當(dāng)網(wǎng)關(guān)處于非空閑狀態(tài)時(shí),每0.5秒判斷一次藍(lán)牙設(shè)備有沒有數(shù)據(jù)發(fā)送過來,如果有,就把0.5秒收到的數(shù)據(jù)上傳給服務(wù)器。連續(xù)的兩個(gè)0.5秒的周期分別稱為階段1和階段2,每次階段變化時(shí),去發(fā)送上一個(gè)階段收到的數(shù)據(jù)。藍(lán)牙有沒有數(shù)據(jù)依據(jù)外部中斷服務(wù)器中產(chǎn)生的標(biāo)記。上傳服務(wù)器的數(shù)據(jù)包包含幀頭、設(shè)備號(hào)、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)代號(hào)、數(shù)據(jù)內(nèi)容、校驗(yàn)碼等,所以在數(shù)據(jù)發(fā)送前要給待發(fā)送的數(shù)據(jù)加上這些幀格式。然后啟動(dòng)WIFI模塊或4G模塊對(duì)應(yīng)的串口DMA發(fā)送功能,把數(shù)據(jù)發(fā)出去,使用WIFI模塊還是4G模塊,去前面描述的邏輯決定。當(dāng)數(shù)據(jù)傳輸完成后,要立刻清掉數(shù)組里面數(shù)據(jù)和數(shù)據(jù)長(zhǎng)度。注意,單片機(jī)串口DMA將數(shù)據(jù)發(fā)送到WIFI模塊的速度比較高,當(dāng)連續(xù)發(fā)送的數(shù)據(jù)量非常大,比如發(fā)送電子聽診器的音頻數(shù)據(jù)時(shí),WIFI模塊可能會(huì)來不及把WIFI模塊從串口收到的數(shù)據(jù)及時(shí)發(fā)送給服務(wù)器,造成數(shù)據(jù)擁堵,從而丟失傳輸數(shù)據(jù),所以該串口必須開啟硬件流控功能,這樣當(dāng)WIFI模塊內(nèi)部緩存的數(shù)據(jù)量比較大時(shí),WIFI模塊會(huì)通過流控讓串口暫停發(fā)送。程序邏輯和流程如下所示。
本設(shè)計(jì)經(jīng)過調(diào)試和驗(yàn)證,能可靠的連接四個(gè)藍(lán)牙醫(yī)療設(shè)備并接收數(shù)據(jù),同時(shí)可以完整的把藍(lán)牙數(shù)據(jù)發(fā)送到云服務(wù)器,可以做為遠(yuǎn)程家庭醫(yī)生系統(tǒng)中的重要組成部分。本設(shè)計(jì)為藍(lán)牙設(shè)備和云服務(wù)器之間的數(shù)據(jù)傳輸提供了一種設(shè)計(jì)思路,設(shè)計(jì)所用的藍(lán)牙醫(yī)療設(shè)備也換成其他的藍(lán)牙設(shè)備,只需要更改藍(lán)牙連接的初始化部分。后期也可以把更換藍(lán)牙設(shè)備連接的過程做到用戶交互功能里面,使本網(wǎng)關(guān)有更大的通用性,便于推廣使用。需要注意的是,網(wǎng)關(guān)的設(shè)計(jì)要考慮數(shù)據(jù)的吞吐量,本設(shè)計(jì)的傳輸速度可以滿足這類物聯(lián)網(wǎng)設(shè)計(jì)的要求,如果數(shù)據(jù)產(chǎn)生的又快又多,比如四個(gè)藍(lán)牙全部是音頻,就要重新考慮各模塊的傳輸速度了。
本文重點(diǎn)是對(duì)設(shè)計(jì)邏輯的說明,常用的基礎(chǔ)的代碼沒有詳細(xì)列出來,比如外設(shè)的初始化,IIC總線的操作、按鍵操作,顯示操作等等,這樣做是想盡可能的說明軟件的邏輯思路和構(gòu)造,希望能為廣大的單片機(jī)開發(fā)者提供一定的參考價(jià)值。