[英]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.