天天看點

android4.0下serial port給應用操作完成特殊定制

android4.0下serial port給應用操作完成特殊定制

        我們在開發中,序列槽也就是serialport或者叫uart用的是相當頻繁的,很普通的接口了,今天為什麼在這提出來呢?筆者前年完成了一款android4.0平台的車載平闆産品,客戶外接了一個DTV,我們在android這邊通過GPIO模拟IR來控制DTV盒子的。客戶前面也做了特殊的一些應用,可以通過wifi跟伺服器連。伺服器通過wifi網絡發送控制指令給車載平闆機器,但是客戶回報在wifi 在heavy WiFi trafic / interferences時,丢包率很高,達到50%以上,造成很多控制指令丢失。

/*****************************************************************************************************/

聲明:本博内容均由http://blog.csdn.net/edsam49原創,轉載請注明出處,謝謝!

        其實通過網絡傳輸,在網絡堵塞的時候,丢包率高這是很正常的問題,怎麼不能通過控制好發送指令再确認ack,如果約定時間内沒收到就繼續重發呢?不知道老外怎麼想的。由于給他做的控制DTV的GPIO模拟IR接口很好用,很穩定,是以客戶想通過序列槽去控制DTV,同時有些控制資訊就走DVB網絡,應該沒那麼堵塞,再通過DTV盒子通過序列槽回傳給android車載平台機器,這樣也确實是可行。由于目前産品早已經成形,客戶也不想把通過序列槽的資料讓我們來解析,是以我們就隻要提供一條操作序列槽的庫給上層就可以了,這樣相對對我們來說也簡單了,隻要打通序列槽,上層能收發序列槽資料就可以了。

        從android4.1起,android系統提供了操作序列槽的service,但是筆者以前是基于android4.0的,怎麼辦呢?參考android4.1以後的系統操作控制方式,主要思路還是提供一個操作序列槽的檔案句柄給應用上層使用。但是筆者覺得不大好的,android提供的serial service沒有提供關閉序列槽的接口,這樣如果頻繁關閉打開的話會存在很多句柄沒關閉的情況。當然,如果隻在service裡面打開的話也沒問題,如果在上層打開的話可能就會存在問題。下面筆者就帶你一起遊曆這個過程吧!

       第一步,肯定是要搞定驅動。序列槽驅動目前來說,每個平台基本都是做好了,直接做好配置打開就可以了,筆者使用的全志平台,配置如下:

     第二步,确認序列槽裝置檔案的權限,需要有system的權限,是以筆者把它配置成666了。筆者使用的是列印序列槽做的測試,是以是ttyS0裝置檔案。

android4.0下serial port給應用操作完成特殊定制

     第三步,寫一個JNI檔案,提供一個庫給應用調用了,因為我們不可能給他做一個系統service來使用了,以最小的代價來搞定,這樣的話使用NDK也好,可以直接用一個apk就可以完成了。在這個JNI檔案裡,筆者提供了兩個接口,一個open,一個close,剛好形成最小閉環循環。代碼也不難,涉及一點JNI基本知識,如下:

     第四步,到應用層去接應JNI庫,這裡很重要的是使用了FileInputStream跟FileOutputStream。在FileOutputStream使用上有一點要注意,就是目前FileOutputStream提供的三個read接口都是阻塞的,會一直在那等資料,但是另外還提供了一個available接口,這個接口是用來提示有多少資料現在可以讀取,這樣我們去讀的時候,就有目的性了,挺好的。

    也是在一個thread裡面去讀資料的,

     第五步,當然是起應用去call相應接口了。

             這邊調用,也就是設定好裝置檔案已經波特率,其他flag先不傳了。其他應用代碼未貼,基本的界面都不難搞的。

     第六步,就看看應用的效果吧!我從序列槽輸入了一些字元,在應用上讀出來顯示出來。

android4.0下serial port給應用操作完成特殊定制

      整個過程還是不算難搞的,整個過程參考了網上一些大俠的代碼,參考了android4.4的代碼實作,同時得到了做應用的同僚協助完成整個調試。在此看透這個問題,android4.1以後的serialservice隻不過是把它寫成一個系統service的形式供應用使用。總之,算交差了,通道建好了,客戶自己愛怎麼折騰就怎麼折騰吧!

繼續閱讀