CH340與Android串口通信

爲何要將CH340的ATD+Eclipse上的安卓工程移植到AndroidStudio

爲了在這個工程基礎上進行改動,驗證串口的數據和配置串口的參數,我首先在Eclipse上配置了安卓開發環境,注意在配置環境是需要下載一些支持包,SDK等需要科學上網,配置好環境後無法生成APK文件,找不到問題的解決方案,所以遂決定將這個工程移植到AS中。
首先在博客中找到了一些將Eclipse工程移植到AS上的方法,嘗試後沒有成功,可能是基礎較差,出現了一些新的問題不知道怎麼解決,所以我打算按照自己的方法嘗試移植。

移植的具體步驟

  1. 首先我們必須明確在原ADT工程下哪些文件是必須並獨特的,哪些文件是系統自動生成的,不需要複製的。
    重點文件與目錄: src libs res androidManifest.xml
    需要複製的文件:
    1:src目錄 MainActivity.java MyApp.java
    2:res目錄 drawable/icon.png layout/main.xml my_spinner_textview.xml values/strings.xml xml/device_filter.xml
    3:libs目錄 CH34xUARTDriver.jar
  2. 新建一個空白工程,佈局文件使用 layout/main.xml my_spinner_textview.xml 注意將res中上述提到的文件也要複製到AS中res目錄中,重複的選擇覆蓋。
  3. 將CH34xUARTDriver.jar粘貼到AS的libs中,選中點擊右鍵,選擇Add as libar…,完成後可以看見build.gradle中會添加
    添加JAR包.jpg
  4. 將java文件粘貼到AS中的Java目錄下。
    tips: 注意在AS中使用jar包時要導入,否則用不了包中所提供的類,即在上述的JAVA文件中需要加入,在Eclipse中不需要如此操作(import cn…CH34xUARTDriver)

在佈局文件中可能有些rEC中某些res中的文件沒有複製到AS中的目錄下,可以根據系統報的錯誤或提示再去複製。
通過上述的步驟,這個工程即可在AS上修改編譯打包。

CH340串口通信驅動函數

驅動函數有一個詳細的PDF文檔說明其中的各個函數與參數設置,這裏不加贅述。

通信過程中重難點

項目中真個通信都是單向的,所以在這裏主要討論接收數據,並不涉及到發送數據。

驅動中接收函數是
讀取數據函數原型
Tips:
JAVA是對類的操作,所以[] date輸入沒有數據,經過處理以後它就會存儲緩衝區串口發送的數據。

在安卓工程中它開了一個線程,在線程中它的代碼如下

 private class readThread extends Thread {

        public void run() {

            byte[] buffer = new byte[128];

            while (true) {

                Message msg = Message.obtain();
                if (!isOpen) {
                    break;
                }
                int length = MyApp.driver.ReadData(buffer, 128);
                if (length > 0) {
					String recv = toHexString(buffer, length);
//					String recv = new String(buffer, 0, length);
                    totalrecv += length;
//                    String recv = String.valueOf(totalrecv);
                    msg.obj = totalrecv;
                    handler.sendMessage(msg);
                }
            }
        }
    }

串口讀取的原理:
串口中一級緩存是程序中寫的,也就是上述代碼中的buffer,與驅動程序無關,驅動程序是負責來一個字節,就把這個字節填入你開的一級緩存buffer中。
byte[] buffer = new byte[a]中的a與ReadData(buffer, b)中b辨析:
a:代表你開的字節的大小,b讀取的字節數,即讀取緩存去buffer中的字節數。
a、b取值的可能三種情況:

  1. a>b,buffer中[b+1,…]中的數據沒有意義,不是從串口寫入的數據。
  2. a=b,buffer中的數據全部都是串口發送的數據。
  3. a<b,要接收的數據字節數超過緩衝數組的上界,一般不這麼寫。

實驗中遇到的情況:

  1. 我把a=b,而且把它設置爲128及以下時,傳輸會出現問題,同時APP會卡死,到256或更大時就會消除這個問題。
  2. a>b,a=256,b= 10,數據不會連續,buffer中[b+1,…]中的數據沒有意義,下次再去讀串口是繼續從buffer[b+1,…]中的添加數據,還是從buffer[0]開始存,仍有問題,下次通過實驗驗證下。

還存在的問題

還是串口讀取的問題,串口如何讀取,保證數據的實時性,比如說,通過串口給你發個4個字節的數據標誌,要你讀到這個數據就做出舉動(要保證實時性),但是如果a=b的話(目前只有這種方式能保證數據的正確性),每次都只能讀定義的整個緩衝區的大小的話,當其實你緩衝區已經接收到了這4個特定的字節時,但是由於a=b,它只能等整個緩存區填滿了才能讀所有的數據在進行判斷,這樣的話對整個實時性造成了很大的影響,改如何解決?問題所在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章