摘 要: 設(shè)計(jì)了一種基于FreeRTOS嵌入式操作系統(tǒng)的二維條碼無(wú)線傳輸系統(tǒng),描述了系統(tǒng)的軟硬件實(shí)現(xiàn)方法和多點(diǎn)數(shù)據(jù)傳輸?shù)逆溌房刂茩C(jī)制。系統(tǒng)主控芯片采用通用的MCU芯片STM32,結(jié)合二維碼掃描引擎和藍(lán)牙傳輸模組實(shí)現(xiàn)多個(gè)掃描終端與基座間的數(shù)據(jù)傳輸。
關(guān)鍵詞: 嵌入式;二維碼;點(diǎn)對(duì)多點(diǎn)
0 引言
二維條碼具有快速、準(zhǔn)確、成本低、信息容量大、保密防偽性強(qiáng)等優(yōu)點(diǎn)。隨著物聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,在票務(wù)、零售、倉(cāng)儲(chǔ)、物流等應(yīng)用領(lǐng)域,支持多個(gè)二維碼掃描終端的多點(diǎn)無(wú)線傳輸系統(tǒng)具有非常廣闊的應(yīng)用前景。本文所設(shè)計(jì)的系統(tǒng),能快速識(shí)別二維條碼,并支持多個(gè)手持掃描終端(多點(diǎn))實(shí)時(shí)傳輸高密度二維條碼數(shù)據(jù),在有限的工作空間內(nèi),避免了配置多套掃描設(shè)備的重復(fù)投入,降低了管理復(fù)雜度,節(jié)約了PC端的接口資源。
1 系統(tǒng)總體方案設(shè)計(jì)
以本文設(shè)計(jì)的系統(tǒng)在倉(cāng)儲(chǔ)管理中的應(yīng)用為例。在物流倉(cāng)儲(chǔ)現(xiàn)場(chǎng)進(jìn)行進(jìn)出庫(kù)登記、貨物清點(diǎn)時(shí),往往需要多名人員同時(shí)作業(yè)。其中某一位人員用手持掃描設(shè)備掃描貨物上的二維條碼,系統(tǒng)提示掃描解碼完成并成功發(fā)送到PC端后再進(jìn)行下一個(gè)條碼的掃描。若解碼失敗,提示重新掃描;若無(wú)線傳輸失敗,則暫存掃描數(shù)據(jù),等待無(wú)線鏈路正常后重發(fā)。系統(tǒng)正常工作時(shí),條碼數(shù)據(jù)具有突發(fā)傳輸?shù)奶匦浴?/p>
除掃描貨物條碼外,系統(tǒng)還能識(shí)別特定的二維設(shè)置條碼,方便人員對(duì)功能進(jìn)行實(shí)時(shí)配置。系統(tǒng)可配置記憶功能,當(dāng)暫時(shí)超出無(wú)線信號(hào)覆蓋范圍時(shí)能保證存儲(chǔ)容量范圍內(nèi)的用戶數(shù)據(jù)不丟失。安全認(rèn)證功能能對(duì)接入系統(tǒng)的掃描終端進(jìn)行鑒權(quán),以保證無(wú)線鏈路的數(shù)據(jù)安全。系統(tǒng)可自動(dòng)適配PC端口,包括標(biāo)準(zhǔn)串口、鍵盤和USB接口,同時(shí)接收來(lái)自PC端的參數(shù)配置指令。
2 系統(tǒng)硬件設(shè)計(jì)
系統(tǒng)由無(wú)線手持掃描終端(Scanner)和基座(Cradle)兩部分子設(shè)備組成,采用模塊化思想劃分硬件功能模塊。其中掃描終端包括二維碼數(shù)據(jù)采集模塊(2D模塊)、MCU核心處理模塊(MCU模塊)和藍(lán)牙無(wú)線傳輸模塊(BT模塊)?;鶆t包括BT模塊、MCU模塊和PC端口適配模塊。系統(tǒng)整體結(jié)構(gòu)如圖1所示。
2.1 MCU核心處理模塊
本系統(tǒng)的MCU模塊采用意法半導(dǎo)體公司(ST)生產(chǎn)的基于ARM Contex_M3內(nèi)核的STM32F103微控制器。其工作頻率可達(dá)72 MHz,具有3個(gè)UART、2個(gè)SPI通信接口,以及7通道DMA控制器。掃描終端內(nèi)MCU的串口1連接2D模塊PL3307,使用內(nèi)置DMA控制器提高數(shù)據(jù)接收能力;串口2與BT模塊相連?;鶅?nèi)MCU的串口1與BT模塊相連;通過(guò)串口2與PC端口適配模塊相連,若為標(biāo)準(zhǔn)串口,其通信速率可配置,但一般不超過(guò)57 600 b/s,以匹配各類上位機(jī)通信接口的傳輸能力。掃描終端和基座均配置了SPI接口的16 Mbit Flash存儲(chǔ)器,以支持大數(shù)據(jù)量存儲(chǔ)。在掃描終端設(shè)計(jì)休眠喚醒電路,結(jié)合MCU的睡眠和待機(jī)模式減少設(shè)備電耗,提高待機(jī)時(shí)間。掃描終端設(shè)計(jì)電壓檢測(cè)電路,基座設(shè)置充電電路和充電卡槽,方便對(duì)掃描終端進(jìn)行電源管理和電池充電。
2.2 2D模塊SE3307成像引擎
2D模塊是掃描設(shè)備的重要組成部分,是傳輸系統(tǒng)的數(shù)據(jù)入口,采用摩托羅拉集成PL3307硬件解碼芯片的SE3300成像引擎,可以識(shí)別目前幾乎所有的一維和二維條碼。其支持兩種方式修改引擎的工作參數(shù):配置條碼掃描設(shè)置和通信接口(如RS-232)設(shè)置。通信速率默認(rèn)為9 600 b/s,系統(tǒng)正常工作時(shí)需設(shè)置成115 200 b/s以滿足大數(shù)據(jù)量傳輸。引擎支持用戶交互模式,即解碼數(shù)據(jù)以引擎自有數(shù)據(jù)幀格式發(fā)送,在接收到反饋幀時(shí)確認(rèn)數(shù)據(jù)發(fā)送成功[1]。本系統(tǒng)即采用了這種傳輸模式。
2.3 藍(lán)牙通信模塊[2]
藍(lán)牙通信模塊選用基于CSR芯片組的藍(lán)牙模組,內(nèi)置完整的藍(lán)牙協(xié)議棧,支持工作模式(主模式或從模式)動(dòng)態(tài)配置,當(dāng)多個(gè)模組配置成一主多從的組合時(shí),支持多通道藍(lán)牙通信。模組支持?jǐn)?shù)據(jù)的協(xié)議傳輸,便于多點(diǎn)通信系統(tǒng)中對(duì)多路數(shù)據(jù)的識(shí)別,但藍(lán)牙模組會(huì)對(duì)用戶數(shù)據(jù)進(jìn)行分包發(fā)送,需在軟件設(shè)計(jì)時(shí)解決組包問(wèn)題。模組可配置是否自動(dòng)連接。自動(dòng)連接時(shí),加電啟動(dòng)后主從設(shè)備會(huì)自動(dòng)建立連接,并且識(shí)別與記憶對(duì)方設(shè)備;人工連接時(shí),可通過(guò)特定指令控制模組的連接過(guò)程。模組提供安全認(rèn)證功能對(duì)接入的設(shè)備進(jìn)行鑒權(quán)。系統(tǒng)運(yùn)行時(shí)設(shè)置模組通信速率為115 200 b/s。
3 軟件系統(tǒng)設(shè)計(jì)
本文采用的FreeRTOS是一個(gè)輕量級(jí)的嵌入式操作系統(tǒng),可基本滿足傳輸系統(tǒng)的多任務(wù)操作要求,并且其支持STM32系列芯片。根據(jù)系統(tǒng)的具體功能特點(diǎn)分析,對(duì)掃描終端系統(tǒng)設(shè)計(jì)了2個(gè)任務(wù)和1個(gè)中斷子程序,分別為2D接收任務(wù)(S_2DTask)和主任務(wù)(S_MainTask),以及“BT串口中斷子程序”;對(duì)基座端設(shè)計(jì)了3個(gè)任務(wù),分別為BT接收任務(wù)(C_BTTask)、PC端發(fā)送任務(wù)(C_PCTask)和主任務(wù)(C_MainTask)。其中S_2DTask和C_BTTask是用戶數(shù)據(jù)的接收任務(wù),所以具有最高優(yōu)先級(jí),其余任務(wù)具有次高優(yōu)先級(jí)。FreeRTOS內(nèi)核支持輪換調(diào)度算法,在沒(méi)有更高優(yōu)先級(jí)任務(wù)就緒的情況下,同一優(yōu)先級(jí)的任務(wù)共享CPU的使用時(shí)間,同時(shí)任務(wù)間通過(guò)消息隊(duì)列傳遞數(shù)據(jù)[3]。掃描終端和基座端的軟件系統(tǒng)總架構(gòu)如圖2所示。
3.1 掃描終端
S_2DTask接收2D模塊數(shù)據(jù)流,解封裝后通過(guò)“2D接收消息隊(duì)列”發(fā)送消息。S_MainTask接收到消息后,通過(guò)DMA通道將數(shù)據(jù)發(fā)送到BT模塊。為了在記憶功能打開(kāi)時(shí)對(duì)用戶數(shù)據(jù)進(jìn)行長(zhǎng)期存儲(chǔ),或在無(wú)線鏈路不穩(wěn)定、系統(tǒng)掉電等情況下對(duì)用戶數(shù)據(jù)或指令數(shù)據(jù)暫時(shí)存儲(chǔ),S_MainTask利用Flash對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)保護(hù)。因?yàn)锽T模塊接收的無(wú)線數(shù)據(jù)(如鏈路狀態(tài)信息、藍(lán)牙反饋信息等)結(jié)構(gòu)簡(jiǎn)單,處理時(shí)間短,所以由“BT串口中斷子程序”在每10 ms一次的定時(shí)中斷中接收并處理;需要轉(zhuǎn)發(fā)的指令通過(guò)“BT發(fā)送消息隊(duì)列”通知S_MainTask執(zhí)行。當(dāng)S_2DTask和S_MainTask同時(shí)向2D模組發(fā)送數(shù)據(jù)時(shí),使用FreeRTOS的互斥量對(duì)接口資源進(jìn)行保護(hù),即只有當(dāng)互斥量解鎖時(shí)連接2D模塊的接口資源才可用。
3.2 基座端
數(shù)據(jù)經(jīng)過(guò)藍(lán)牙無(wú)線鏈路傳輸后,C_BTTask任務(wù)解析藍(lán)牙模組協(xié)議幀獲得有效用戶數(shù)據(jù),然后經(jīng)過(guò)“數(shù)據(jù)接收消息隊(duì)列”發(fā)送消息。C_MainTask任務(wù)接收消息后依據(jù)多點(diǎn)無(wú)線鏈路管理機(jī)制對(duì)接入的各掃描終端進(jìn)行傳輸控制。當(dāng)接收到一筆完整的二維碼數(shù)據(jù)后,通過(guò)“PC發(fā)送消息隊(duì)列”發(fā)送消息,C_PCTask將數(shù)據(jù)按照PC端口標(biāo)準(zhǔn)發(fā)送到PC。同樣采用互斥量對(duì)連接BT模塊的接口進(jìn)行資源保護(hù)。
4 點(diǎn)對(duì)多點(diǎn)無(wú)線鏈路傳輸控制的實(shí)現(xiàn)[4-5]
本文采用基于確認(rèn)機(jī)制的可靠連接傳輸模式,其傳輸控制分為順序控制、可靠性控制和流量控制3部分,主要通過(guò)統(tǒng)一的多點(diǎn)通信數(shù)據(jù)封裝協(xié)議與應(yīng)答機(jī)制來(lái)實(shí)現(xiàn)。相應(yīng)協(xié)議幀結(jié)構(gòu)如圖3所示。
類型(TYPE)字段指明數(shù)據(jù)幀是用戶數(shù)據(jù)還是某種指令數(shù)據(jù),若為應(yīng)答幀則用ACK和NAK代表應(yīng)答成功和失??;長(zhǎng)度(LEN)字段表示當(dāng)前數(shù)據(jù)幀長(zhǎng)度,最大值為“數(shù)據(jù)幀最大分段長(zhǎng)度”;狀態(tài)(STAT)字段以比特為單位指示數(shù)據(jù)包的狀態(tài)信息,包括當(dāng)前數(shù)據(jù)包是否拆包傳輸、指令數(shù)據(jù)的來(lái)源設(shè)備和目的設(shè)備等;序號(hào)(NO)字段是掃描終端為每一個(gè)發(fā)送的數(shù)據(jù)幀所作的順序編號(hào),以長(zhǎng)度字段的有效取值范圍循環(huán)編號(hào),基座接收到數(shù)據(jù)幀后根據(jù)序號(hào)字段識(shí)別各數(shù)據(jù)段的順序;有效數(shù)據(jù)(DATA)字段攜帶二維碼數(shù)據(jù)、指令參數(shù)或應(yīng)答參數(shù);校驗(yàn)(CHECKSUM)字段為數(shù)據(jù)幀的CRC校驗(yàn)碼。
4.1 順序控制
本系統(tǒng)數(shù)據(jù)涉及高密度二維碼,在無(wú)線通信環(huán)境中適合拆分成多個(gè)較小的數(shù)據(jù)幀傳輸,即數(shù)據(jù)分段,拆分標(biāo)準(zhǔn)稱為“數(shù)據(jù)幀最大分段長(zhǎng)度”,每個(gè)數(shù)據(jù)段獲得相應(yīng)的序號(hào)字段。在無(wú)線鏈路不穩(wěn)定時(shí),確認(rèn)機(jī)制下的數(shù)據(jù)重傳或幀丟失會(huì)導(dǎo)致接收到順序錯(cuò)亂的數(shù)據(jù)幀。
解決數(shù)據(jù)亂序問(wèn)題有兩種方法。一是通過(guò)使用等待指令,在同一時(shí)刻僅允許一個(gè)掃描終端發(fā)送數(shù)據(jù),其余掃描終端則等待發(fā)送時(shí)隙。但通過(guò)藍(lán)牙協(xié)議管理無(wú)線鏈路會(huì)引起應(yīng)答延時(shí)(如本系統(tǒng)中,單個(gè)藍(lán)牙數(shù)據(jù)幀的應(yīng)答延時(shí)大約60 ms~80 ms),而且多個(gè)掃描終端并發(fā)傳輸時(shí)會(huì)導(dǎo)致最后輪到發(fā)送數(shù)據(jù)的終端等待時(shí)間過(guò)長(zhǎng)。另一種方式是不干預(yù)發(fā)送流程,通過(guò)開(kāi)辟數(shù)據(jù)緩存區(qū),由C_MainTask按照藍(lán)牙模組提供的通道號(hào)和數(shù)據(jù)幀的序號(hào)字段將多個(gè)掃描終端發(fā)送的分散數(shù)據(jù)包進(jìn)行按序暫存,等接收完整后進(jìn)行轉(zhuǎn)發(fā)。限于MCU片內(nèi)存儲(chǔ)的容量,需結(jié)合片外Flash輔助存儲(chǔ)。將數(shù)據(jù)優(yōu)先存入片內(nèi)區(qū)域,當(dāng)片內(nèi)容量不夠時(shí)再存入片外區(qū)域,從而避免大量小數(shù)據(jù)包的讀寫操作消耗Flash的刷寫壽命。為便于排序操作,將有效數(shù)據(jù)的系統(tǒng)格式設(shè)置為“完整條碼數(shù)據(jù)長(zhǎng)度+有效數(shù)據(jù)”的結(jié)構(gòu),同時(shí)維護(hù)兩塊存儲(chǔ)區(qū)域完整的索引表,在發(fā)送時(shí)仍能按照正確順序讀取數(shù)據(jù)。
4.2 可靠性控制
本文采用確認(rèn)的可靠性控制機(jī)制,即數(shù)據(jù)發(fā)送端僅當(dāng)收到數(shù)據(jù)幀相應(yīng)的ACK應(yīng)答幀(攜帶對(duì)應(yīng)幀序號(hào))時(shí)才確認(rèn)數(shù)據(jù)發(fā)送成功,否則啟用超時(shí)(3 s)重傳(3次)。達(dá)到重傳次數(shù)后停止重發(fā)直至鏈路恢復(fù)正常。基座端對(duì)條碼數(shù)據(jù)的完整性和正確性進(jìn)行檢測(cè),拋棄超過(guò)存儲(chǔ)時(shí)限的不完整數(shù)據(jù)。
4.3 流量控制
本系統(tǒng)在兩種情況下會(huì)發(fā)生系統(tǒng)存儲(chǔ)溢出。一是當(dāng)PC端采用鍵盤口或低速標(biāo)準(zhǔn)串口接收數(shù)據(jù),以每個(gè)終端發(fā)送一個(gè)256 B的數(shù)據(jù)包為例,7個(gè)終端并發(fā)傳輸時(shí)有1 792 B數(shù)據(jù)需要接收,若PC端串口速率為57 600 b/s,則基座需要248 ms才能將這批數(shù)據(jù)發(fā)送完畢。另一種情況是掃描終端記憶功能打開(kāi)時(shí)進(jìn)行掃描,而無(wú)線鏈路在中斷一段時(shí)間后又恢復(fù)正常,此時(shí)掃描終端存儲(chǔ)的大量數(shù)據(jù)將一次性發(fā)送給基座,容易導(dǎo)致其存儲(chǔ)溢出。
本文采用源抑制技術(shù)進(jìn)行流量控制。當(dāng)基座端剩余存儲(chǔ)空間少于門限值時(shí),根據(jù)BT模組提供的通道號(hào)確定發(fā)送數(shù)據(jù)幀的掃描終端,向其發(fā)送攜帶“等待時(shí)間”字段的WAIT應(yīng)答幀,使對(duì)方在“等待時(shí)間”后再進(jìn)行下一個(gè)數(shù)據(jù)幀的發(fā)送?!暗却龝r(shí)間”是綜合考慮基座端剩余存儲(chǔ)空間、接入掃描終端數(shù)量和PC端接口速率確定的。
5 結(jié)論
本文詳細(xì)闡述了基于ARM和藍(lán)牙無(wú)線鏈路構(gòu)建的二維碼點(diǎn)對(duì)多點(diǎn)傳輸系統(tǒng),給出了系統(tǒng)軟硬件的實(shí)現(xiàn)方法,并詳細(xì)表述了點(diǎn)對(duì)多點(diǎn)無(wú)線鏈路的傳輸控制機(jī)制。依據(jù)本文設(shè)計(jì)的二維碼無(wú)線掃描設(shè)備能較快地將條碼信息發(fā)送到PC端,支持最多7部手持終端同時(shí)連接,且各項(xiàng)用戶功能均能正常實(shí)現(xiàn)。由于采用了高性能微處理器,基于實(shí)時(shí)性較好的操作系統(tǒng)及成熟的藍(lán)牙通信網(wǎng)絡(luò),本系統(tǒng)具有較高的適用性、可靠性和性價(jià)比,而且本系統(tǒng)成本低廉,使用體驗(yàn)良好。
參考文獻(xiàn)
[1] 摩托羅拉解決方案公司. PL3307 Decoder Integration Guide[EB/OL]. (2012-03)[2014-04-10].http://www.motorolasolutions.com/.
[2] 金宏健,王小寧,胡玉鑫,等. 藍(lán)牙技術(shù)在小型嵌入式系統(tǒng)中的應(yīng)用[J]. 蘇州大學(xué)學(xué)報(bào)(工科版), 2012, 32(6):4-7.
?。ㄉ辖拥?0頁(yè))
[3] 李志明,擅永,徐石明,等. STM32嵌入式系統(tǒng)開(kāi)發(fā)實(shí)戰(zhàn)指南:FreeRTOS與LwIP聯(lián)合移植[M]. 北京: 機(jī)械工業(yè)出版社, 2013.
[4] 郝妍娜,洪志良. 基于MCU和nRF905的低功耗遠(yuǎn)距離無(wú)線傳輸系統(tǒng)[J].電子技術(shù)應(yīng)用, 2007, 33(8):44-47.
[5] 史志才. 計(jì)算機(jī)網(wǎng)絡(luò)[M]. 北京:清華大學(xué)出版社,2012.