簡體   English   中英

用於Android和Arduino Uno之間的USB串行通信的讀取器線程

[英]Reader thread for USB serial communication between Android and Arduino Uno

我正在嘗試使用android的USB Host API在Arduino UNO和我的android智能手機之間進行通信。 到目前為止,一切都很好。 我每秒通過函數Serial.print()從Arduino發送一個測試字符串“ Try data”。 兩台設備的波特率均設置為9600。 Android智能手機充當主機。

我使用的一些教程是:

http://android.serverbox.ch/?p=549

http://android-er.blogspot.in/2014/09/send-data-from-android-to-arduino-uno.html

以及android usb主機文檔。 我已經通過mik3y嘗試了類固醇和另一個庫,但是它們沒有用。 兩種情況下設備均無法打開。

我正在使用一個線程,通過它我可以從Arduino接收數據(下面的所有代碼都在onCreate()中

val reader = object : Thread(){
        override fun run() {
            var buf = ByteArray(endpointIn.maxPacketSize)
            connection.bulkTransfer(endpointIn, buf, buf.size, 0)
            tv.text = String(buf)//tv is the id of a textview 
        }
    }
 reader.start()

問題在於僅接收到來自測試字符串的字母T。 如果相反,我將buf的聲明移出線程類,則僅讀取4個字符。 我無法理解為什么只讀取有限的字符。 如果我改為將run方法的最后兩行代碼放入無限的while循環中,則應用程序將崩潰(無法找出原因)。 我知道線程似乎正在同時運行,但實際上它的主線程運行了一段時間,然后讀取器又不在同一時間運行。 它的轉換非常快,因此,它們看起來好像在同時運行。 這可能是某些信息丟失的原因嗎?

請幫助編寫用於讀者線程的代碼,或者有更好的方法嗎?

提前致謝

終於,經過很多時間,我終於明白了。 即使函數調用中的參數為64,Android手機也不會在每次批量傳輸中讀取64個字節。這是因為線程執行得更快。 它有時讀取4個字節,有時讀取2個字節。 解決方案是:使用環形緩沖區或僅使用substring()方法來獲取相關字符。 修改后的代碼如下所示:

val reader = object : Thread(){
        override fun run() {
            var buf = ByteArray(64)
            while(true){
                var len = connection.bulkTransfer(endpointIn, buf, buf.size, 0)
                if(len > 0) {
                    val msg = String(buf) 
                    tvAppend(msg.substring(0, len)) //tv is the textview inside sv
                    sv.fullScroll(View.FOCUS_DOWN) //sv is a scrollview
                }
            }
        }
    }
reader.start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM