爲何要將CH340的ATD+Eclipse上的安卓工程移植到AndroidStudio
爲了在這個工程基礎上進行改動,驗證串口的數據和配置串口的參數,我首先在Eclipse上配置了安卓開發環境,注意在配置環境是需要下載一些支持包,SDK等需要科學上網,配置好環境後無法生成APK文件,找不到問題的解決方案,所以遂決定將這個工程移植到AS中。
首先在博客中找到了一些將Eclipse工程移植到AS上的方法,嘗試後沒有成功,可能是基礎較差,出現了一些新的問題不知道怎麼解決,所以我打算按照自己的方法嘗試移植。
移植的具體步驟
- 首先我們必須明確在原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 - 新建一個空白工程,佈局文件使用 layout/main.xml my_spinner_textview.xml 注意將res中上述提到的文件也要複製到AS中res目錄中,重複的選擇覆蓋。
- 將CH34xUARTDriver.jar粘貼到AS的libs中,選中點擊右鍵,選擇Add as libar…,完成後可以看見build.gradle中會添加
添加JAR包.jpg - 將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取值的可能三種情況:
- a>b,buffer中[b+1,…]中的數據沒有意義,不是從串口寫入的數據。
- a=b,buffer中的數據全部都是串口發送的數據。
- a<b,要接收的數據字節數超過緩衝數組的上界,一般不這麼寫。
實驗中遇到的情況:
- 我把a=b,而且把它設置爲128及以下時,傳輸會出現問題,同時APP會卡死,到256或更大時就會消除這個問題。
- a>b,a=256,b= 10,數據不會連續,buffer中[b+1,…]中的數據沒有意義,下次再去讀串口是繼續從buffer[b+1,…]中的添加數據,還是從buffer[0]開始存,仍有問題,下次通過實驗驗證下。
還存在的問題
還是串口讀取的問題,串口如何讀取,保證數據的實時性,比如說,通過串口給你發個4個字節的數據標誌,要你讀到這個數據就做出舉動(要保證實時性),但是如果a=b的話(目前只有這種方式能保證數據的正確性),每次都只能讀定義的整個緩衝區的大小的話,當其實你緩衝區已經接收到了這4個特定的字節時,但是由於a=b,它只能等整個緩存區填滿了才能讀所有的數據在進行判斷,這樣的話對整個實時性造成了很大的影響,改如何解決?問題所在。