java:使用RXTXcomm向安卓系統板子的串列埠進行命令寫入

柴月和岐月發表於2017-10-13

 

最近的任務是用java和一塊安卓板子進行互動,讀取命令,使用的是RXTXcomm,這個百度一下就有很多資料並且十分簡單。

同時你也可以使用SecureCRT這個軟體來先與板子進行互動,其中遇到的名詞對你後面理解串列埠設定屬性還是有幫助的。

左轉,吾愛破解搜尋:SecureCRT最新版和中文版

1.使用RXTX流程

1.找到所有可用埠(你要是實先就知道名字了也可以不需要這步)

2.開啟某一個串列埠,並設定屬性

3.新增回撥,在你輸入命令後,會返回系統給你傳送資料的回撥

4.獲取串列埠的輸出流,輸出命令

5.在會調裡等待回撥,並在回撥裡,開啟輸入流讀取資料

可以寫個while重複45,不過建議每一個輸入和輸出之間都等待50ms

6.關閉串列埠和釋放相關資源

2.注意事項

有兩點需要注意的是:

1.命令寫入

安卓系統是(UNIX)Linux系統,裡面的換行是“\n”,而我們在進行命令寫入的時候不能只寫入命令,還需要加換行符,就像你輸入了命令需要按下ENTER一樣

 

SerialUtil.sendToPort(serialPort, (str + "\n").getBytes());

其實str是你輸入的命令,如ls,ll之類的。有的命令在安卓系統裡是沒有的,這點還是得注意下

 

2.資料讀取

在你輸入命令之後,推薦等待50ms後讀取資料,避免資料一段一段的。

一、有的資料是有一定返回的,不會一直列印,如ll,ls。這種命令就可以使用下面一直讀取位元組方式進行資料讀取

 

    /**
     * 從串列埠讀取資料
     *
     * @param serialPort 當前已建立連線的SerialPort物件
     * @return 讀取到的資料
     * @throws ReadDataFromSerialPortFailure     從串列埠讀取資料時出錯
     * @throws SerialPortInputStreamCloseFailure 關閉串列埠物件輸入流出錯
     */
    public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {

        //開啟輸入流
        InputStream input;
        try {
            input = serialPort.getInputStream();
        } catch (IOException e) {
            throw new ReadDataFromSerialPortFailure();
        }

        byte[] bytes = new byte[1024];
        //因為返回值為byte陣列,所以這裡採用bite流的方式,同時也方便輸入流讀取
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int len;

        try {
            while ((len = input.read(bytes)) > 0) {//這裡大於0而不是!=-1,是因為後面會一直傳來讀取長度為0的讀操作,會一直停在這裡
                output.write(bytes, 0, len);
            }
        } catch (IOException e) {//讀取失敗,關閉輸入輸出流
            try {
                output.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                input.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            throw new SerialPortInputStreamCloseFailure();
        }


        //返回,並關閉輸入輸出流
        try {
            input.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

二、有的資料則是會一直列印資訊,如logcat,則可用下面的方式:讀取一行的字串,然後一直讀取

 

 

                    InputStream input;
                    try {
                        input = serialPort.getInputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                    InputStreamReader inputReader = new InputStreamReader(input);
                    BufferedReader reader = new BufferedReader(inputReader);
                    String line;
                    try {
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    } catch (IOException e) {
                    }
                    try {
                        reader.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }


不過這種情況,在終端的時候還有用ctrl+c的方式來停止,但是用java的話,目前還沒找到辦法

 

針對這種情況,我選擇的是隻列印一定資料的行數,並期望自己想要的資料就在裡面,如logcat -t 1000

三、有的資料則是某一行會重新整理進度,而不是下一行顯示新的進度,如yum命令安裝軟體的時候,但是安卓裡並沒有,並且也不在此次任務需求之列,所以有興趣的朋友可以自己去試試

rxtx包和工具類程式碼在這:http://download.csdn.net/download/ons_cukuyo/10023567

相關文章