亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        適配Android手機(jī)的串口通信套件設(shè)計(jì)

        2020-03-20 10:38:26王明輝雷衛(wèi)延黃海譚晗凌
        廣東氣象 2020年1期

        王明輝,雷衛(wèi)延,黃海,譚晗凌

        (廣東省氣象探測(cè)數(shù)據(jù)中心,廣東廣州 510640)

        在自動(dòng)氣象觀測(cè)領(lǐng)域,有大量觀測(cè)設(shè)備和通信設(shè)施通過(guò)串口配置參數(shù)或輸出氣象報(bào)文,需要借助電腦才能準(zhǔn)確檢查串口通信是否正常[1-3]。由于筆記本電腦配備成本高、攜帶不方便,因此,很多維保人員在維修現(xiàn)場(chǎng)無(wú)電腦可用,對(duì)串口通信故障束手無(wú)策,難以準(zhǔn)確定位故障點(diǎn)。

        Android是Google公司主導(dǎo)開(kāi)發(fā)的一種基于Linux的開(kāi)源操作系統(tǒng),廣泛應(yīng)用于通信、物流、互聯(lián)網(wǎng)行業(yè),基于Android系統(tǒng)的智能手機(jī)在全球智能手機(jī)市場(chǎng)占有率已經(jīng)超過(guò)Apple公司搭載ios系統(tǒng)的iphone,排名第1。近年來(lái),氣象行業(yè)已經(jīng)基于Android智能手機(jī)開(kāi)展了一些應(yīng)用,顯著地提高了效率[4-9]。本研究基于Android手機(jī)的USB-OTG功能研發(fā)了一套便攜的串口通信套件,實(shí)現(xiàn)Android手機(jī)APP與氣象觀測(cè)設(shè)備串口雙向通信,使維保人員在維修現(xiàn)場(chǎng)能夠通過(guò)Android手機(jī)方便、高效、準(zhǔn)確地檢查設(shè)備的串口工況,具有很高的業(yè)務(wù)應(yīng)用價(jià)值。

        1 套件架構(gòu)

        套件架構(gòu)如圖1所示。

        圖1 套件架構(gòu)示意圖

        USB協(xié)議是一種用于計(jì)算機(jī)與外設(shè)方便連接的數(shù)據(jù)總線,建立連接的2個(gè)USB設(shè)備分為主設(shè)備 host和從設(shè)備 device(又稱(chēng) slave),僅當(dāng)host與device連接時(shí)才能傳輸數(shù)據(jù)。OTG是對(duì)USB 2.0協(xié)議的補(bǔ)充,其最重要的擴(kuò)展是更節(jié)能的電源管理和允許設(shè)備以host和device兩種形式工作[10-12]。目前絕大部分Android手機(jī)支持OTG協(xié)議,當(dāng)該種手機(jī)通過(guò)USB連接電腦時(shí),電腦為host,手機(jī)為device。在本方案中,串口通信套件包含硬件轉(zhuǎn)換模塊和運(yùn)行在Android手機(jī)上的APP軟件,Android手機(jī)工作形式為host,硬件轉(zhuǎn)換模塊為device。轉(zhuǎn)換模塊擁有一個(gè)Micro-USB接口和一個(gè)RS232串口,當(dāng)模塊的Micro-USB接口與Android手機(jī)相連時(shí),APP軟件自動(dòng)啟動(dòng),再將RS232串口與自動(dòng)氣象站等設(shè)備的串口連接,即可建立手機(jī)到設(shè)備的RS232串口通信。

        2 轉(zhuǎn)換模塊設(shè)計(jì)

        2.1 功能性設(shè)計(jì)

        常用的 USB轉(zhuǎn)串口芯片有 CH340、FT232、PL2303等系列[13-15],這些芯片的最新版本多已加入對(duì) Android系統(tǒng)的支持。PL2303HXD是Prolific公司PL2303系列第5代USB轉(zhuǎn)TTL電平串口芯片,支持Android系統(tǒng),因性價(jià)比最高而廣泛商用。該芯片自帶12 MHz晶振,支持75~12 Mbp波特率,完全滿足自動(dòng)氣象觀測(cè)設(shè)備常采用的1 200、9 600波特率。芯片支持以5、6、7、8位數(shù)據(jù)位和1、2位停止位收發(fā),校驗(yàn)方式可選奇校驗(yàn)、偶校驗(yàn)或無(wú)校驗(yàn),滿足自動(dòng)氣象觀測(cè)設(shè)備常用的串口配置,如7位數(shù)據(jù)位、1位停止位、偶校驗(yàn),或8位數(shù)據(jù)位、1位停止位、無(wú)校驗(yàn)。芯片具有可配置的512 Byte雙向數(shù)據(jù)緩沖器,本套件將輸入和輸出緩沖區(qū)分別配置為256 Byte,通過(guò)編程循環(huán)讀取、寫(xiě)入緩沖區(qū)實(shí)現(xiàn)串口讀取、發(fā)送。由于自動(dòng)氣象站等設(shè)備的串口為RS232電平,在與PL2303HXD通信時(shí)還需要做RS232-TTL電平的轉(zhuǎn)換。該套件采用了 NI公司的MAX202芯片與PL2303HXD配合,實(shí)現(xiàn)RS232電平和TTL電平的相互轉(zhuǎn)換。硬件轉(zhuǎn)換模塊在物理上實(shí)現(xiàn)了USB-RS232信號(hào)轉(zhuǎn)換。

        2.2 電路設(shè)計(jì)

        硬件轉(zhuǎn)換模塊設(shè)計(jì)通過(guò)Micro-USB型接口與手機(jī)建立OTG連接,該接口為5線制,依次定義為 VBUS、DM、DP、ID、GND。PL2303HXD和MAX202芯片工作電壓均為+5 V,典型電流分別為20和8 mA,滿足手機(jī)OTG接口的帶負(fù)載能力,故設(shè)計(jì)轉(zhuǎn)換模塊通過(guò)VBUS、GND從手機(jī)的Micro-USB接口獲取+5 V供電。為防止芯片經(jīng)電源線從手機(jī)引入干擾,或轉(zhuǎn)換模塊傳輸數(shù)據(jù)時(shí)產(chǎn)生高頻信號(hào)通過(guò)電源線傳入手機(jī),在VBUS、GND傳輸線上各設(shè)計(jì)一個(gè)80μH的電感抑制高頻信號(hào)。根據(jù)OTG協(xié)議,手機(jī)USB端口內(nèi)部ID線上拉,默認(rèn)工作在device狀態(tài)。轉(zhuǎn)換模塊設(shè)計(jì)ID線與GND短接,與手機(jī)連接后將手機(jī)USB端口的ID線下拉,使手機(jī)進(jìn)入host狀態(tài)。

        DM、DP是一對(duì)傳輸數(shù)據(jù)的差分信號(hào)線,在手機(jī)USB端口內(nèi)部,DM和DP各連接一個(gè)15 kΩ的下拉電阻,設(shè)計(jì)轉(zhuǎn)換模塊的DP接口連接一個(gè)1.5 kΩ的上拉電阻,兩者連接時(shí)手機(jī)的DP電平被拉高,從而將 PL2303HXD識(shí)別為全速USB。為防止數(shù)據(jù)傳輸過(guò)程中的高速信號(hào)在端口附近產(chǎn)生反射,模塊在盡量靠近PL2303HXD芯片的DM和DP上各串聯(lián)一個(gè)22Ω的匹配電阻。在數(shù)據(jù)傳輸時(shí),芯片U1、U2間TTL電平的TXD、RXD信號(hào)線會(huì)發(fā)生高速的高低電平翻轉(zhuǎn),模塊在VBUS和TXD、RXD之間設(shè)計(jì)了LED用于顯示數(shù)據(jù)傳輸情況。當(dāng)TXD、RXD信號(hào)線為低電平時(shí),利用1 kΩ的限流電阻使得通過(guò)LED的電流<3 mA,LED導(dǎo)通發(fā)光。轉(zhuǎn)換模塊核心電路如圖2所示。

        圖2 轉(zhuǎn)換模塊核心電路示意圖

        3 軟件設(shè)計(jì)

        為實(shí)現(xiàn)Android手機(jī)的OTG通信,需要開(kāi)發(fā)與轉(zhuǎn)換模塊匹配的APP軟件。PL2303HXD芯片原廠提供了JAR驅(qū)動(dòng)庫(kù),支持系統(tǒng)版本3.2(API Level 13)以上的Android手機(jī),不需要root即可實(shí)現(xiàn)OTG通信。本研究搭建了Eclipse+ADT+Android SDK開(kāi)發(fā)環(huán)境,基于JAVA語(yǔ)言和驅(qū)動(dòng)庫(kù)pl2303multilib.jar開(kāi)發(fā)了APP軟件,軟件可運(yùn)行在Android 3.2及以上版本的Android手機(jī)上。軟件測(cè)試平臺(tái)為魅族牌Android手機(jī),Android版本7.1.2。

        軟件設(shè)計(jì)為單Activity窗體,包含串口參數(shù)設(shè)置、串口讀取顯示、串口發(fā)送3個(gè)功能區(qū),如圖3所示。串口參數(shù)包括波特率、校驗(yàn)位、數(shù)據(jù)位、停止位,均采用Spinner控件進(jìn)行選擇。Android手機(jī)檢測(cè)到轉(zhuǎn)換模塊插入后自動(dòng)啟動(dòng)軟件,設(shè)置串口參數(shù)后點(diǎn)擊“打開(kāi)”Button打開(kāi)串口,軟件自動(dòng)讀取串口信息并顯示在TextView控件中,當(dāng)收到下一條信息時(shí)自動(dòng)刷新顯示。發(fā)送時(shí),將待發(fā)送信息輸入EditText控件,點(diǎn)擊“發(fā)送”Button實(shí)現(xiàn)信息發(fā)送。

        圖3 APP軟件界面

        3.1 打開(kāi)串口

        軟件打開(kāi)是Activity窗體進(jìn)入Running狀態(tài)的過(guò)程,Activity需要依次經(jīng)過(guò)onCreate()-->onStart()-->onResume()3個(gè)生命周期。在onCreate()方法中對(duì)窗體界面進(jìn)行渲染,將控件初始化并設(shè)置事件監(jiān)聽(tīng),一旦觸發(fā)則執(zhí)行相應(yīng)方法。在Spinner控件初始化時(shí)設(shè)置選擇條目監(jiān)聽(tīng)setOnItemSelectedListener,當(dāng)選擇串口參數(shù)時(shí),觸發(fā)執(zhí)行MyOnItemSelectedListener類(lèi)的onItem-Selected()方法,實(shí)現(xiàn)串口參數(shù)修改。

        //渲染窗體

        setContentView(R.layout.activity_main);//波特率選擇控件初始化

        spBaudRate1=(Spinner)findViewById(R.id.DevSpinner1);

        ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this,R.array.BaudRateList,android.R.layout.simple_spinner_item);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spBaudRate1.setAdapter(adapter);

        spBaudRate1.setOnItemSelectedListener(new MyOnItemSelectedListener());

        APP軟件的串口參數(shù)缺省設(shè)置為9 600、N、8、1。以波特率為例,9 600在Spinner下拉列表中排序第5,在初始化時(shí),需通過(guò)setSelection()方法將第5項(xiàng)設(shè)置為缺省。

        //缺省波特率設(shè)置為9 600

        spBaudRate1.setSelection(5);

        spBaudRate1.setEnabled(false);

        在 Button、CheckBox、EditText等控件初始化時(shí),設(shè)置點(diǎn)擊事件監(jiān)聽(tīng)setOnClickListener。在點(diǎn)擊“打開(kāi)”Button時(shí),觸發(fā)執(zhí)行 OpenUARTDevice()方法。

        //設(shè)置“打開(kāi)”Button的點(diǎn)擊事件監(jiān)聽(tīng)

        btOpen1 = (Button)findViewById(R.id.OpenButton1);

        btOpen1.setOnClickListener(new Button.On-ClickListener(){

        public void onClick(View v){

        OpenUARTDevice(DeviceIndex1);

        });

        在OpenUARTDevice()方法中,根據(jù)onItem-Selected()方法設(shè)置的串口參數(shù)或缺省串口參數(shù)打開(kāi)串口,其中boolean型返回值res如為true,表明串口打開(kāi)成功。

        //按照預(yù)設(shè)串口參數(shù)打開(kāi)串口

        res=mSerialMulti.PL2303OpenDevByUARTSetting (index, info.mBaudrate,info.mDataBits,info.mStopBits,info.mParity,info.mFlowControl);

        在串口打開(kāi)后,依然可以在onItemSelected()方法中修改串口參數(shù),并重新建立串口連接。

        //重設(shè)串口參數(shù)

        res=mSerialMulti.PL2303SetupCOMPort(iSelected,info.mBaudrate,info.mDataBits,info.mStopBits,info.mParity,info.mFlowControl);

        3.2 串口讀取

        APP軟件在讀取串口信息時(shí),并不知道信息何時(shí)發(fā)送,也不知道信息的長(zhǎng)度,需要定時(shí)檢查是否有信息傳來(lái)。本研究建立了一個(gè)單獨(dú)的串口讀取子線程,在子線程中持續(xù)訪問(wèn)PL2303HXD芯片輸出緩沖區(qū),以便在溢出或覆蓋前及時(shí)將串口發(fā)來(lái)的信息取出,流程如圖4所示。

        圖4 串口讀取流程示意圖

        利用Runnable接口創(chuàng)建子線程是Android系統(tǒng)中常用的技術(shù),通過(guò)重寫(xiě)其run()方法來(lái)實(shí)現(xiàn)程序功能。本研究基于此建立了串口讀取子線程ReadLoop1,在其run()方法中通過(guò)for循環(huán)不斷讀取串口輸出緩沖區(qū)。子線程在主線程中通過(guò)Thread實(shí)例創(chuàng)建并運(yùn)行,直至軟件退出才結(jié)束。

        //啟動(dòng)串口讀取子線程

        new Thread(ReadLoop1).start();

        ……

        //子線程的實(shí)現(xiàn)

        private Runnable ReadLoop1=new Runnable(){

        public void run(){

        for(;;){

        //延時(shí) 50ms

        DelayTime(50);

        ……

        };

        驅(qū)動(dòng)庫(kù)pl2303multilib.jar提供了串口的讀取方法PL2303Read(),本研究在每個(gè)for循環(huán)中讀取一次輸出緩沖區(qū),讀取的信息保存在字節(jié)型數(shù)組ReadBuf1中,int型返回值ReadLen1為本次讀取信息的長(zhǎng)度。緩沖區(qū)內(nèi)的數(shù)據(jù)為Byte格式,讀出后轉(zhuǎn)換為字符串并追加到ReadBufOrig中,多次讀取的數(shù)據(jù)長(zhǎng)度累加為ReadLen。for循環(huán)需要在PL2303HXD芯片輸出緩沖區(qū)寫(xiě)滿之前將數(shù)據(jù)讀出,并將緩沖區(qū)清空,以便后續(xù)信息從緩沖區(qū)的開(kāi)始位置繼續(xù)寫(xiě)入。在for循環(huán)中檢測(cè)到某次讀取為空時(shí),表明一次數(shù)據(jù)傳輸完畢,整條數(shù)據(jù)已完全存放于字符串ReadBufOrig中,總長(zhǎng)度為ReadLen。

        //讀取PL2303HXD芯片輸出緩沖區(qū)

        ReadLen1=mSerialMulti.PL2303Read(DeviceIndex1,ReadBuf1);

        for(int j=0;j<ReadLen1;j++){

        sbHex.append((char) (ReadBuf1[j]&0x000000FF));

        ReadBufOrig=ReadBufOrig+sbHex.toString();

        ReadLen+=ReadLen1;

        在Android系統(tǒng)中,主線程只負(fù)責(zé)初始化和界面顯示等任務(wù),費(fèi)時(shí)的操作全部放到子線程執(zhí)行,在子線程完成運(yùn)算需要顯示時(shí),必須將要顯示的信息傳遞給主線程,通過(guò)主線程完成顯示。一次數(shù)據(jù)傳輸完畢后,需要將讀取到的信息顯示到軟件窗體的TextView控件上。本研究利用Handler.post(Runnable)方法將讀取完整的字符串格式信息傳遞到主線程,在主線程更新Text-View顯示控件tvRead1,實(shí)現(xiàn)讀取數(shù)據(jù)的顯示。在接收到下一條串口信息時(shí),tvRead1刷新顯示新接收的信息。DZZ1-2新型自動(dòng)氣象站在開(kāi)機(jī)時(shí)通過(guò)串口輸出一系列中文編碼的系統(tǒng)說(shuō)明[16],為兼容顯示,字符串在顯示前轉(zhuǎn)換為GBK字符集編碼。

        //在主線程中創(chuàng)建Handler

        HandlermHandler1=new Handler();……

        //在子線程中通過(guò) Handler.post(Runnable)方法更新主線程UI

        mHandler1.post(new Runnable(){public void run(){

        //轉(zhuǎn)換為GBK字符集編碼ReadBuf=new String(ReadBufOrig.getBytes(“ISO-8859-1”),“GBK”);

        //更新 TextView顯示

        tvRead1.setText(ReadBuf);

        ……}

        });

        3.3 串口發(fā)送

        軟件的串口發(fā)送功能需要人工輸入待發(fā)送內(nèi)容,通過(guò)點(diǎn)擊“發(fā)送”按鍵完成串口發(fā)送。程序初始化時(shí)對(duì)串口“發(fā)送”Button控件設(shè)置了點(diǎn)擊事件監(jiān)聽(tīng) setOnClickListener,重寫(xiě)其 WriteT-oUARTDevice()方法,利用驅(qū)動(dòng)庫(kù)pl2303multilib.jar提供的串口發(fā)送方法PL2303Write()將要發(fā)送的信息按字節(jié)寫(xiě)入PL2303HXD芯片輸入緩沖區(qū),通過(guò)串口發(fā)送出去。由于要發(fā)送的信息長(zhǎng)度可能超過(guò)輸入緩沖區(qū)容量,本研究將待發(fā)送信息打斷,逐64 Byte發(fā)送,剩余長(zhǎng)度不足64 Byte時(shí)則一次性發(fā)送。

        while(strWrite.length()/64! =0){

        String tmp=new String(strWrite.substring(0,64));

        //串口逐64 Byte發(fā)送

        res = mSerialMulti.PL2303Write(index,tmp.getBytes(“GBK”));

        strWrite=strWrite.substring(64);

        DelayTime(50);

        //不足64 Byte則一次性發(fā)送

        res=mSerialMulti.PL2303Write(index,str-Write.getBytes(“GBK”));

        根據(jù)中國(guó)氣象局綜合觀測(cè)司的要求,新型自動(dòng)氣象(氣候)站的指令以<回車(chē)> <換行>(“\r\n”)結(jié)尾[17,18]。在 PC的串口助手中,只需要敲擊鍵盤(pán)的“回車(chē)”鍵即可輸入<回車(chē)><換行>,但在Android系統(tǒng)的輸入法中,“回車(chē)”鍵只能輸入 <換行 >(“\n”),而無(wú) <回車(chē) >(“\r”)。為此,軟件設(shè)計(jì)了“指令”CheckBox控件,勾選后自動(dòng)在待發(fā)送字符串末尾追加字符串“\r\n”,實(shí)現(xiàn)正常的指令下發(fā)。

        4 應(yīng)用介紹

        4.1 串口測(cè)試

        套件支持Android手機(jī)與電腦串口通信,能夠?qū)ZZ1-2新型自動(dòng)氣象站、WP3103區(qū)域自動(dòng)氣象站、EWOS-1生態(tài)氣象自動(dòng)觀測(cè)系統(tǒng)、PTB330氣壓傳感器、Belfort6000能見(jiàn)度儀等設(shè)備的串口輸出檢查,也可應(yīng)用于其他通用串口設(shè)備。利用轉(zhuǎn)換模塊連接DZZ1-2新型自動(dòng)氣象站數(shù)據(jù)采集器和手機(jī),在Android手機(jī)上運(yùn)行APP軟件,勾選“指令”,向數(shù)據(jù)采集器發(fā)送“dmgd”即可調(diào)取分鐘觀測(cè)數(shù)據(jù),如圖5所示。

        圖5 向DZZ1-2型數(shù)據(jù)采集器發(fā)送指令

        4.2 打環(huán)測(cè)試

        利用套件可以對(duì)光電轉(zhuǎn)換器、串口服務(wù)器、通信電纜等通信傳輸設(shè)備做打環(huán)測(cè)試。將套件的RS232串口與光電轉(zhuǎn)換器RS232串口連接,用光纖回路器連接光電轉(zhuǎn)換器的光纖收發(fā)接口,在APP軟件發(fā)送測(cè)試信息,如光電轉(zhuǎn)換器工作正常,則軟件串口讀取顯示區(qū)將顯示發(fā)出的測(cè)試信息,如圖6所示。

        圖6 打環(huán)測(cè)試界面

        自動(dòng)氣象站、氣壓傳感器、超聲風(fēng)傳感器、能見(jiàn)度儀、串口服務(wù)器、光電轉(zhuǎn)換器等多種設(shè)備均使用了串口通信,以往只能通過(guò)電腦串口來(lái)檢查設(shè)備串口狀態(tài)或設(shè)置設(shè)備參數(shù)。本研究利用PL2303HXD芯片開(kāi)發(fā)了運(yùn)行在Android手機(jī)的串口通信套件,實(shí)現(xiàn)Android手機(jī)與設(shè)備間的串口通信,為自動(dòng)氣象觀測(cè)設(shè)備串口通信故障現(xiàn)場(chǎng)排查提供了一個(gè)方便、可靠、低成本的工具。由于Android手機(jī)廣泛普及,本套件的經(jīng)濟(jì)成本極低,也更加便攜,適合在自動(dòng)氣象觀測(cè)維保一線推廣應(yīng)用。

        手机在线免费观看的av| 国产精品搭讪系列在线观看| 国产欧美日韩图片一区二区| 亚洲一区二区av免费观看| 亚洲天堂av三区四区不卡| 日韩成人无码| 亚洲男女免费视频| 中文字幕你懂的一区二区| 日韩av一区二区网址| 日本丰满熟妇videossex8k| 久久精品亚洲牛牛影视| 亚洲av精品一区二区三| 女同视频一区二区在线观看 | 精品一区二区三区亚洲综合| 高清毛茸茸的中国少妇| 国产免费无码一区二区三区| 国产国拍亚洲精品福利| 一区二区精品天堂亚洲av| 国产做无码视频在线观看| 日本一区午夜艳熟免费| 国产V亚洲V天堂A无码| av网页免费在线观看| 国产精品毛片无遮挡| 波多野结衣免费一区视频| 久久精品国产亚洲av成人擦边| 性生大片免费观看性少妇| 中文字幕人妻中文| 欧美性久久| 国产精品亚洲精品专区| 性欧美丰满熟妇xxxx性久久久| 亚洲av无码国产剧情| 大陆啪啪福利视频| 久久精品亚洲成在人线av乱码| 人妻夜夜爽天天爽| 亚洲A∨无码国产精品久久网| 麻豆国产成人av高清在线| 欧美成人猛片aaaaaaa| 韩国v欧美v亚洲v日本v| 免费人成视频网站在线观看不卡| 我要看免费久久99片黄色 | 日本免费看一区二区三区|