崔世鋼 代鳳輝 梁帆



摘要:為了實現將植物生長柜傳感器節點的信息傳輸到Android系統下,同時在該系統下實現對各傳感器節點的數據顯示和控制。本研究在對Android平臺串口驅動進行重點分析的基礎上,設計并實現多傳感器(包括2個溫度傳感器、1個濕度傳感器、1個光照傳感器、1個二氧化碳濃度傳感器)的數據傳輸和實時顯示。Android平臺具有強大的功能,將多傳感器數據傳輸到該平臺下,為后續開發提供廣闊空間。
關鍵詞:智能植物生長柜;Android系統;智能控制;串口驅動;多傳感器;
中圖分類號:TP274;S126 文獻標志碼:A 文章編號:1002—1302(2016)01—0403—03
當前,世界人口不斷增長、物質需求不斷增加,而資源卻不斷減少,環境不斷惡化,為解決全球資源與環境問題,設施農業越來越受到人們的推崇,得到了前所未有的發展與應用。智能植物生長柜作為設施農業的一部分,以節省資源、環境保護、安全、放心、健康為出發點,得到社會的廣泛關注與認可。隨著城市的現代化建設步伐和環境污染速度越來越快,可利用農業耕地面積越來越少,同時人們生活水平的提高,對生活質量也提出了更高的要求。作為一種保護環境、節約資源和能生產出安全健康的新型植物生產系統,智能植物生長柜有很強的應用性。在我國,對于農業生產環境的監控基本處于人工采樣、化學分析的人工監測階段,實時性不好,少數便攜式儀表還存在使用維護困難等問題,此外生長柜對環境具有非常高的要求。Android系統作為開源的操作系統、操作簡單、功能強大,基于該平臺下的各類控制系統很多大學與公司的研究方向。Android設備驅動程序是Android操作系統的重要組成部分,是軟件與硬件連接的“橋梁”,分析該系統下的設備驅動運行機理,對于Android系統上層應用程序的設計開發有重大的指導意義。
1材料與方法
1.1系統方案
系統主要分為執行模塊、生長柜監控模塊、Android測控端等部分。本研究對Android系統內核中的串口驅動程序進行了詳細的分析,并在此基礎上編寫了應用程序,實現多傳感器的數據傳輸。試驗利用FS_V210開發板(運行Android系統)為終端,由下位機STM32實現對5個傳感器數據的采集,通過其串口與運行Android系統的上位機進行通信,在開發板顯示屏上實時顯示5個傳感器數據。FS_V210開發板具有攝像頭、LCD觸摸屏、網口等豐富硬件資源,便于攜帶、交互性強、易于開發,為智能植物生長柜提供優秀的控制系統平臺。Android系統結構框圖如圖1所示。
1.2實現方法
1.2.1 Android串口驅動開發 串口驅動的實現過程就是Android系統下的通信數據流和功能調用的過程。Android串口終端驅動結構如圖2所示,串口驅動結構共分為4個層次,即驅動層、HAL層(1ibhardware)、JNI層(java native inter-face)、Framework層和應用層。
1.2.1.1串口驅動層 Android內核是由標準的Linux內核修改而來的,最底層的Android硬件驅動層就是Linux設備驅動層,二者內核驅動程序的編寫方法是一樣的,都是以Linux模塊的方法實現的。驅動層是與硬件設備直接聯系的一層,通過訪問相應驅動程序直接對硬件進行操作,在該層中定義串口設備文件的訪問方法,主要定義串口的Open、Read和Write。此外,還執行了串口設備的注冊和初始化操作。
1.2.1.2 HAL層 硬件驅動程序一方面分布在Linux內核中,另一方面分布在用戶空間的硬件抽象層中,在該層中增加串口的硬件抽象層模塊訪問Linux內核驅動程序。按照An-droid硬件抽象層規范的要求,分別定義模塊ID(UART_HARDWARE_MODULE_ID)、模塊結構體(struct uart_module_t)以及硬件接口結構體(struct uart_control_device_t)。在硬件接口結構體中,fd表示設備文件描述符,HAL層結構如圖3所示。
1.2.1.3 JNI層 Android系統的應用程序是用Java語言編寫的,而硬件驅動程序是用c語言來實現的,應用程序要調用串口驅動程序操作硬件必須通過Java本地調用JNI來調用硬件抽象層接口。JNI層主要實現Java與C/C++之間的過渡,不涉及復雜的邏輯,只根據規則為上層函數調用串口的下層接口。該層定義HAL的模塊ID和2個全局變量sUartDe-vice和sUartModule,在Uart_init函數中,通過Android硬件抽象層提供的hw_get_module方法來加載模塊ID為UART_HARDWARE_MODULE_ID的硬件抽象層模塊,其中HELLO_HARDWARE_MODULE_ID是在
1.2.1.4 Framework層 為硬件抽象層模塊編寫完串口的JNI方法后,須要為Android系統的Application Frameworks層增加硬件訪問服務MyUartService,通過該層提供的硬件服務來調用JNI方法,進而調用底層的硬件抽象層接口去訪問硬件。在Application Frameworks層中包含自定義的硬件服務MyUartService,在Android系統啟動時自動加載MyUartSer-vice。這時應用程序就可以通過Java接口來訪問uart硬件服務了。
1.2.2串口應用程序的開發 本研究中實現的功能是由單片機STM32實現對2個溫度傳感器(為區分2個溫度傳感器的值,顯示分別命名為根部溫度、溫度)、1個濕度傳感器、1個光照強度傳感器、1個CO2濃度傳感器數據的采集,通過其串口將接收到的5個傳感器數據在開發板上實時顯示。底層編寫的串口驅動程序,實現的功能是1個字節的讀和字符串的寫,在應用程序層調用字符型函數GpsDataUpdate()實現1個字節的讀取,整型函數GpsDataUpdate_write(string s)實現字符串的寫。為實現各個傳感器數據的正確顯示,須要在上層對串口應用程序進行開發。程序設計流程圖如圖4所示。
開發的關鍵技術和部分代碼如下:(1)在Android系統應用程序開發軟件eclipse中新建工程,然后在該工程新建Uart類,這個類主要用來加載SO文件(uart_runtime.so),通過JNI的方式打開關閉串口。
(2)為實現通過串口接收到的所有數據的顯示,定義1個字符串s1,用于存放通過GpsDataUpdate()讀取到的1個字節(以下代碼是把該字節先讀取到sbuffer,再由sbuffer存放于s1辛),在這里有1個while循環用于判斷是否數據接收完,未接收完就繼續接收,并把接收到的值放到s1,接收完就跳出。在區里加1個線程將接收到的數據實時顯示,睡眠時間為1 s。
(3)實現以上代碼的功能,可以讀到5個傳感器的數據,但是須要將5個傳感器的數據分開,分別顯示在5個EditText中。利用split根據給定的參數把原來的分割為幾個子字符串。核心代碼如下:
在本例中,下位機STM32串口發送的1串數據中開頭與結尾分別加上字母b,中間的每個傳感器數據之間都加上字母a。以上代碼strView.split(“b”)中,將字符串strView根據參數b分割為3個部分,取中間的傳感器數據部分,再根據參數a進行分割,可以準確得到5組數據,分別存放于字符串strView0、strViewl等5個字符串中。updateView()為刷新函數,數據不斷更新。
2結果與分析
本例中使用Android第3方圖形庫AndroidPlot繪制圖形,先創建1個數組保存繪制用的數據,然后將數組轉換為XYSeries,將數組中的傳感器值繪制在圖形庫中,生成曲線圖。試驗結果以植物生長柜的空氣溫度為例,如圖5所示。
3結論
本研究通過對Android系統下的串口驅動原理的具體實現方法進行詳細分析的狀態下,實現FS_V210開發板與單片機STM32的串口通信,完成對智能植物生長柜中各個傳感器節點信息的接收與顯示,為實現生長柜的智能化、網絡化打下基礎。設計實例,開發Android系統的串口應用程序,接收到5個傳感器數據,對串口驅動程序進行驗證分析,對智能植物生長柜在Android系統下的開發具有指導意義。