基于嵌入式Linux的便攜式RFID信息采集與處理系統(tǒng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
TagMaster AB公司是世界知名的RFID讀卡器制造商。它提供性能優(yōu)良的固定式閱讀器,也提供一種手持式閱讀器。手持式讀卡器由Caiso公司的工業(yè)級(jí)PDA(Personal Digital Assistants)和TagMaster AB公司的S1510組成。PDA雖然功能強(qiáng)大,但有如下缺點(diǎn):(1)提供的觸摸屏輸入方式過(guò)于精細(xì),不適合工作人員現(xiàn)場(chǎng)操作;(2)TFT液晶顯示屏在強(qiáng)光下顯示效果差,耗電量大,并且在低溫下(0℃以下)無(wú)法工作,因此不適合室外工作;(3)采用Microsoft公司的商用系統(tǒng)WinCE,成本高。
本文介紹一種基于嵌入式Linux的便攜式RFID信息采集與處理系統(tǒng)。它采用高性能的32位ARM920T系列微處理器、8鍵的鍵盤(pán)及OLED顯示屏,結(jié)合S1510實(shí)現(xiàn)了對(duì)電子標(biāo)簽卡信息的采集、處理及實(shí)時(shí)顯示,很好地解決了上述問(wèn)題。
1 系統(tǒng)組成
系統(tǒng)采用Atmel公司的AT91RM9200 32位高性能處理器、TagMaster公司的S1510及OLED顯示模塊等實(shí)現(xiàn)電子標(biāo)簽卡信息的采集、處理、實(shí)時(shí)顯示及與上位機(jī)通信等功能。系統(tǒng)組成如圖1。
1.1 微處理器
系統(tǒng)采用Atmel公司以ARM920T為核心的AT91系列微處理器AT91RM9200。它最高主頻可達(dá)180MHz,具有先進(jìn)的節(jié)電技術(shù),集成了SDRAM、Flash、紅外、USB等接口。系統(tǒng)采用USB(Universal Serial Bus)及紅外方式與上位機(jī)通信。紅外方式采用Agilent公司的HSDL-3602紅外收發(fā)器實(shí)現(xiàn)。
1.2 射頻識(shí)別模塊
射頻識(shí)別模塊采用瑞典TagMaster AB公司的2.4GHz產(chǎn)品S1510。該模塊體積小,專為手持設(shè)備設(shè)計(jì),可以采集1米內(nèi)各種電子標(biāo)簽上的數(shù)據(jù)。它通過(guò)USART串口與處理器通信,接口簡(jiǎn)單,易于硬件實(shí)現(xiàn)。為了保證數(shù)據(jù)的可靠傳輸,模塊與微處理器通信采用TagMaster AB公司開(kāi)發(fā)的應(yīng)答式串口通信協(xié)議ConfiTalk。
ConfiTalk協(xié)議是一種面向字符的應(yīng)答式串行通信協(xié)議。它每次傳輸一定長(zhǎng)度的數(shù)據(jù)塊(幀),每個(gè)幀包含幀頭(STX)和幀尾(ETX)。為了提高數(shù)據(jù)傳輸?shù)目煽啃?,每幀又加入?位的校驗(yàn)位(CS)及地址位(ADR)。幀的結(jié)構(gòu)如圖2。
MESSAGE代表任意長(zhǎng)度的信息。協(xié)議規(guī)定微處理器發(fā)送給S1510的幀為命令幀,返回的幀為應(yīng)答幀。本系統(tǒng)使用的S1510是TagMaster AB公司的最新產(chǎn)品,它支持基于ConfiTalk協(xié)議的MAIL命令方式的數(shù)據(jù)傳輸。MAIL命令方式通信也就是把幀中的MESSAGE域統(tǒng)一成四種格式,其中命令幀有MAIL_SEND和MAIL_RECEIVE兩種,分別表示S1510接收用戶信息和返回卡信息(包括卡號(hào)、卡狀態(tài)和卡存儲(chǔ)的數(shù)據(jù)),如圖3。
應(yīng)答幀有兩種:MAIL_SEND的應(yīng)答幀和MAIL_RECEIVE的應(yīng)答幀,如圖4。
圖4中,36表示S1510使用MAIL方式處理命令幀和應(yīng)答幀,而4、5表示S1510命令幀的類(lèi)型(MAIL_SEND或MAIL_RECEIVE);Status表示該命令的執(zhí)行狀態(tài)(成功或失?。?;MAIL_SEND命令幀中的Data域表示用戶要進(jìn)行的操作及參數(shù),如使Data=WRITE:參數(shù):數(shù)據(jù),即表示用戶要將數(shù)據(jù)寫(xiě)入電子標(biāo)簽卡;MAIL_RECEIVE的應(yīng)答幀中的Data域?yàn)橛脩羲蟮玫降臄?shù)據(jù)。
當(dāng)使用MAIL命令方式讀寫(xiě)標(biāo)簽卡時(shí),用戶只需要按幀的格式填充各域,然后利用ConfiTalk協(xié)議提供的API函數(shù)發(fā)送到S1510即可。命令清晰明了,大大方便了用戶的開(kāi)發(fā)。
1.3 OLED顯示模塊
系統(tǒng)采用萊寶科技有限公司的OLED顯示模塊RGS24128064YW001。有機(jī)發(fā)光顯示器OLED(Organic Light Emitting Display)被譽(yù)為“夢(mèng)幻顯示器”。與液晶屏相比,OLED顯示屏更輕更薄、可視角度更大,能夠顯著節(jié)省電能,并且在-40℃的低溫下仍可以正常工作。RGS24128064YW001具有串行和8位并行數(shù)據(jù)接口。系統(tǒng)采用8位并行接口與微處理器通信。
1.4 SDRAM和Flash及自定義鍵盤(pán)
系統(tǒng)采用32位的同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(SDRAM)作為系統(tǒng)內(nèi)存,16位的Flash作為不可丟失數(shù)據(jù)存儲(chǔ)器。用戶可以通過(guò)8鍵的鍵盤(pán)進(jìn)行各種操作,如讀卡、寫(xiě)卡等。
2 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)軟件是整個(gè)系統(tǒng)的靈魂,其設(shè)計(jì)的好壞直接影響系統(tǒng)的穩(wěn)定性和可擴(kuò)展性等性能。系統(tǒng)設(shè)計(jì)將軟件分為兩層結(jié)構(gòu),如圖5所示。最下面一層為操作系統(tǒng)層,主要實(shí)現(xiàn)對(duì)Linux操作系統(tǒng)的移植和各種設(shè)備驅(qū)動(dòng)程序的編寫(xiě),包括OLED模塊、USB Device、紅外、鍵盤(pán)等設(shè)備驅(qū)動(dòng)程序。上一層為應(yīng)用程序?qū)?,主要?shí)現(xiàn)卡信息顯示、鍵盤(pán)掃描、電子標(biāo)簽卡讀寫(xiě)、文件傳輸、時(shí)鐘以及電池電量檢測(cè)等功能。
2.1 嵌入式Linux
Linux是一種公開(kāi)源碼的多任務(wù)操作系統(tǒng),具有開(kāi)放度高、安全性好、穩(wěn)定性強(qiáng)、可移植性好等特點(diǎn),在嵌入式操作系統(tǒng)中被大量采用。
本設(shè)計(jì)采用的Linux內(nèi)核是在ARM-Linux的基礎(chǔ)上,編寫(xiě)了OLED顯示模塊、USB 設(shè)備、紅外收發(fā)器及鍵盤(pán)的設(shè)備驅(qū)動(dòng)程序。在Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序占有很重要的位置,它提供了在用戶空間操作硬件設(shè)備的接口。Linux系統(tǒng)將設(shè)備分為字符設(shè)備、塊設(shè)備及網(wǎng)絡(luò)設(shè)備三種,并給出針對(duì)不同設(shè)備的數(shù)據(jù)結(jié)構(gòu)及注冊(cè)函數(shù)。當(dāng)用戶開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序時(shí),只需按硬件操作的方法填充設(shè)備數(shù)據(jù)結(jié)構(gòu),并將它注冊(cè)到內(nèi)核中即可。
為了方便用戶應(yīng)用程序的編寫(xiě),把USB設(shè)備實(shí)現(xiàn)為CDC(Communication Device Class)類(lèi)設(shè)備,其驅(qū)動(dòng)程序分為兩層,最底層操作AT91RM9200上的USB設(shè)備控制器,如處理硬件中斷、讀寫(xiě)寄存器及操作I/O口來(lái)檢測(cè)設(shè)備的插拔;上層實(shí)現(xiàn)了底層與TCP/IP協(xié)議層的連接,主要是模擬物理網(wǎng)卡,并注冊(cè)到內(nèi)核。這樣,在應(yīng)用程序的USB設(shè)備就是一個(gè)標(biāo)準(zhǔn)的網(wǎng)絡(luò)設(shè)備,用戶不需要了解驅(qū)動(dòng)程序的接口,而直接使用Linux提供的套接字進(jìn)行網(wǎng)絡(luò)通信程序的開(kāi)發(fā)。當(dāng)用戶進(jìn)行二次開(kāi)發(fā)時(shí),可以不加修改地將上位機(jī)開(kāi)發(fā)好的網(wǎng)絡(luò)通信程序直接移植到本系統(tǒng)中,而且可以通過(guò)上位機(jī)的Telnet等工具對(duì)嵌入式系統(tǒng)進(jìn)行一定的操作。
其他驅(qū)動(dòng)程序(如OLED顯示模塊、鍵盤(pán)、紅外收發(fā)器)都作為L(zhǎng)inux下的標(biāo)準(zhǔn)字符設(shè)備編寫(xiě),使用register_chrdev( )函數(shù)進(jìn)行注冊(cè),提供了讀、寫(xiě)和控制操作。在Linux系統(tǒng)中,應(yīng)用程序?qū)ψ址O(shè)備的操作與文件的操作相同。
Linux中設(shè)備驅(qū)動(dòng)程序可以通過(guò)模塊方式動(dòng)態(tài)地加載和卸載,也可以直接編譯到內(nèi)核中。前者使用靈活,可以減小內(nèi)核,但因嵌入式系統(tǒng)要求所有設(shè)備在初始化后全部就緒,不能在使用時(shí)加載設(shè)備的驅(qū)動(dòng)模塊。所以,本系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序都直接編譯進(jìn)內(nèi)核。
每個(gè)設(shè)備驅(qū)動(dòng)程序在用戶空間對(duì)應(yīng)一個(gè)設(shè)備文件,由文件系統(tǒng)管理。本系統(tǒng)使用ext2作為根文件系統(tǒng)。為了開(kāi)發(fā)和升級(jí)方便,首先將根文件系統(tǒng)做成RAMDISK格式,所謂RAMDISK就是系統(tǒng)啟動(dòng)后將壓縮的文件解壓到內(nèi)存,形成一個(gè)虛擬硬盤(pán);然后,將引導(dǎo)程序、內(nèi)核映像及根文件系統(tǒng)燒寫(xiě)到Flash中。
系統(tǒng)加電后,引導(dǎo)程序?qū)?nèi)核映像從Flash中調(diào)入內(nèi)存,然后從核入口開(kāi)始執(zhí)行:首先初始化CPU,然后加載各個(gè)設(shè)備驅(qū)動(dòng)程序,最后掛載文件系統(tǒng),執(zhí)行應(yīng)用程序。
2.2 應(yīng)用程序設(shè)計(jì)
Linux是多任務(wù)系統(tǒng),支持多線程及多進(jìn)程。多線程的優(yōu)點(diǎn)是線程比進(jìn)程小,可以使應(yīng)用更輕便,線程間通信方便;缺點(diǎn)是所有線程使用同一個(gè)地址空間,如果一個(gè)線程出現(xiàn)問(wèn)題,整個(gè)系統(tǒng)將受影響;而進(jìn)程各自占有一份內(nèi)存空間,可以增強(qiáng)系統(tǒng)的穩(wěn)定性,但是多進(jìn)程增加了系統(tǒng)開(kāi)銷(xiāo),進(jìn)程間通信復(fù)雜。為此,根據(jù)實(shí)際情況,考慮到系統(tǒng)穩(wěn)定性,本系統(tǒng)采取兩者相結(jié)合的方式分別完成數(shù)據(jù)采集處理及文件傳輸功能。
2.2.1 數(shù)據(jù)采集處理
數(shù)據(jù)采集處理是一個(gè)進(jìn)程,它包括主線程和輔線程。主線程完成電子標(biāo)簽卡信息的讀取、寫(xiě)入、實(shí)時(shí)顯示及查詢;輔線程實(shí)現(xiàn)一個(gè)時(shí)鐘以提供用戶當(dāng)前時(shí)間,并定時(shí)對(duì)電池的電量進(jìn)行檢測(cè)和動(dòng)態(tài)顯示,在電量過(guò)低時(shí)發(fā)出警告。
應(yīng)用程序用MAIL命令方式完成電子標(biāo)簽卡的讀寫(xiě)。該進(jìn)程首先初始化屏幕,然后等待按鍵中斷,當(dāng)有鍵按下時(shí),根據(jù)鍵值執(zhí)行相應(yīng)的工作;當(dāng)指定時(shí)間內(nèi)沒(méi)有鍵按下,系統(tǒng)則進(jìn)入休眠狀態(tài),從而達(dá)到省電的目的。程序流程圖如圖6。
當(dāng)成功采集到標(biāo)簽卡信息后,應(yīng)用程序?qū)⒖ㄐ畔?包括卡號(hào)、卡狀態(tài)、用戶數(shù)據(jù)及當(dāng)前時(shí)間)通過(guò)OLED顯示屏提供給用戶,并寫(xiě)入一個(gè)文件進(jìn)行記錄。由于文件傳輸進(jìn)程會(huì)將該文件傳輸?shù)缴衔粰C(jī),所以當(dāng)讀寫(xiě)文件時(shí)要將文件上鎖。Linux提供了文件鎖以防止不同進(jìn)程同時(shí)訪問(wèn)同一個(gè)文件。本文使用flock()函數(shù)對(duì)文件上鎖和解鎖。
由于OLED是圖形點(diǎn)陣式顯示屏,而且Flash容量有限,所以不可能直接使用漢字字庫(kù)。系統(tǒng)預(yù)先提取所有用到的漢字、數(shù)字及字母的點(diǎn)陣數(shù)據(jù),然后建立自己的字庫(kù)文件,從而使應(yīng)用程序可以對(duì)漢字、數(shù)字及字母進(jìn)行顯示。
2.2.2 文件傳輸
文件傳輸是一個(gè)進(jìn)程,完成卡信息的上傳及其他數(shù)據(jù)的下載。與上位機(jī)通信采用Clinet/Server模型。該進(jìn)程實(shí)質(zhì)上是一個(gè)服務(wù)器端(本系統(tǒng))的應(yīng)用程序,它循環(huán)等待客戶端(上位機(jī))的連接請(qǐng)求。當(dāng)請(qǐng)求到達(dá)時(shí),首先判斷請(qǐng)求來(lái)自哪個(gè)接口(USB或者紅外接口),然后根據(jù)請(qǐng)求的類(lèi)型執(zhí)行相應(yīng)的上傳或下載??紤]到實(shí)際應(yīng)用中可能會(huì)使用多臺(tái)手持式閱讀器,為了方便上位機(jī)對(duì)信息的管理,規(guī)定文件名由手持式閱讀器編號(hào)和文件上傳序號(hào)組成,程序在上傳文件時(shí)自動(dòng)將其編號(hào)及上傳序號(hào)加入文件名。該進(jìn)程的流程如圖7。
3 系統(tǒng)電源管理
本系統(tǒng)使用鋰電池為系統(tǒng)供電。為了延長(zhǎng)電池的續(xù)航能力,將應(yīng)用程序設(shè)計(jì)為三種運(yùn)行狀態(tài):上電空閑狀態(tài)、程序執(zhí)行狀態(tài)及系統(tǒng)睡眠狀態(tài)。當(dāng)用戶不進(jìn)行任何操作時(shí),系統(tǒng)將進(jìn)入睡眠狀態(tài)以達(dá)到省電目的。系統(tǒng)的睡眠是基于微處理器的電源管理功能實(shí)現(xiàn)的,進(jìn)入睡眠的步驟如下:
(1)關(guān)閉所有外設(shè);
(2)保存當(dāng)前系統(tǒng)狀態(tài);
(3)使SDRAM進(jìn)入自刷新模式;
(4)設(shè)置喚醒事件,使微處理器進(jìn)入睡眠狀態(tài)。
當(dāng)喚醒事件發(fā)生時(shí),如有鍵按下,則執(zhí)行系統(tǒng)復(fù)位。過(guò)程如下:
(1)恢復(fù)部分微處理器的寄存器;
(2)喚醒外部設(shè)備,系統(tǒng)開(kāi)始運(yùn)行。
本文介紹了在AT91RM9200高性能ARM芯片上運(yùn)行嵌入式Linux,結(jié)合TagMaster AB公司功能強(qiáng)大的射頻識(shí)別模塊S1510實(shí)現(xiàn)便攜式標(biāo)簽卡的信息采集和處理。系統(tǒng)使用方便、靈活。另外,為克服LCD低溫?zé)o法工作、亮度不夠及耗電大的缺點(diǎn),采用OLED顯示模塊使系統(tǒng)可以在惡劣環(huán)境下應(yīng)用,并增加了電池的續(xù)航能力;為使系統(tǒng)與上位機(jī)通信方便,采用了支持熱插拔的USB接口。
參考文獻(xiàn)
1 Rubini A著,魏永明譯.LINUX設(shè)備驅(qū)動(dòng)程序(第二版)[M].北京:中國(guó)電力出版社,2002
2 張 娟,吳大偉.應(yīng)用RFID的便攜式數(shù)據(jù)采集與處理系統(tǒng)的研究[J].微型電腦應(yīng)用,2005;21(6)
3 蔡 震,蔣輝柏,周利華.Linux系統(tǒng)下USB設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)[J].計(jì)算機(jī)測(cè)量與控制,2003;11(2)
4 TagMaster AB. Sweden.Handheld Confi Talk Reference Manual[Z].2003
5 TagMaster AB.Programmer′s Guide LockTag Handheld[Z].2005
6 Robert Love.Linux Kernel Development(Second Edition)[M].北京:機(jī)械工業(yè)出版社,2005