1. 程式人生 > >android 串列埠程式設計總結

android 串列埠程式設計總結

        最近公司在做一款帶DVD的android裝置,DVD是linux系統。android裝置要通過串列埠實現對DVD的控制。控制方式很簡單,只需android寫命令到串列埠就行了,這樣就涉及到了android的串列埠程式設計。

      我做的是android4.2系統的串列埠程式設計,經一個多星期的摸索,找到了兩種串列埠的程式設計方法。

要實現對串列埠的開啟首先要修改串列埠的許可權,在init.rc裡面新增修改許可權語句:chmod 0777 /dev/ttyS0 。串列埠節點依照情況而定,我的串列埠是/dev/ttyS0。

    方法一:

通過android的API進行程式設計。android4.2的SDK中已經集成了對串列埠的JNI和一些串列埠的服務介面,可以在framework中找到。裡面主要封裝了兩個類:

    android.hardware.SerialManager

    android.hardware.SerialPort

通過上面兩個類可以實現對串列埠的開啟,和讀寫操作。具體實現可以參考android SDK中/frameworks/base/tests/SerialChat下的demo程式碼,我已經上傳到網盤:http://pan.baidu.com/s/1qWNsRTU。

注意要在程式碼的AndroidManifest.xml中新增android:sharedUserId="android.uid.system",然後將編譯生成的apk重新進行系統簽名。並將apk安裝到system/app目錄下。這個程式碼需要修改一下否則會出現閃退,並在log中提示許可權問題:android.permission.SERIAL_PORT。

方法二:

使用網上的開原始碼:android-serialport-api,關於這個串列埠的程式設計程式碼可以參考部落格:http://blog.csdn.net/imyang2007/article/details/8331800        和http://www.oschina.net/question/157182_39785

我也將這個api的apk例項程式碼上傳到了網盤:http://pan.baidu.com/s/1gdq1kNT,檢視程式碼的時候可以參考上面的兩篇部落格。

   開始,我以為找到android串列埠程式設計的程式碼就已經大功告成了,沒想到更糾結的問題出現了。我想傳送“0x22”等這些命令到DVD,傳送的程式碼如下:

                    int i;
                     CharSequence t = Emission.getText();
                     char[] text = new char[t.length()];
                     for (i=0; i<t.length(); i++) {
                             text[i] = t.charAt(i);
                     }
                       mOutputStream.write(new String(text).getBytes());
                       mOutputStream.write('\n');

使用上面的程式碼傳送,我測試android本身接收是正常的,但是DVD端接收就不對了,無論我傳送什麼資料,DVD端接收的資料列印都是一個值。糾結了好幾天,後來在網上發現瞭如下程式碼,才得以解決:

                    /*傳送"0x22"命令到目標機子,必須使用以下的程式碼
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    byteArrayOutputStream.write(Integer.decode("0x22").byteValue());//0x22是傳送給被控制裝置的命令
                         mOutputStream.write(byteArrayOutputStream.toByteArray());

這個程式碼可以參考:http://zhidao.baidu.com/link?url=U8S5KULipfFdlQSM9aesrqupf_UzQCCcg06NWj3kHrdLFIXxgCv_DgiY6jsfn41LWeJ9kcWUVIzwZq074xTOrq&qq-pf-to=pcqq.discussion