bugfix> android > 投稿

AndroidのUSBホストAPIを使用して、Arduino UNOとAndroidスマートフォンの間で通信しようとしています。これまでのところ、すべてが良好です。私はArduinoからテスト文字列「Try data」をSerial.print()関数を介して毎秒送信しています。両方のデバイスのボーレートが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 host documentationとともに。 私はmik3yでphysicaloidと別のライブラリを試しましたが、動作していません。どちらの場合もデバイスは開きません。

私は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メソッドの最後の2行のコードを無限のwhileループに入れると、アプリがクラッシュします(理由がわかりません)。 スレッドは同時に実行されているように見えますが、実際にはそのメインスレッドがしばらく実行され、次にリーダーが実行されます。両方とも同時に実行されません。その遷移は非常に高速であるため、同時に実行されているように見えます。これが一部の情報が失われている理由になりますか?

リーダースレッドのコードを書くのを手伝ってください、またはそれを行うより良い方法はありますか?

前もって感謝します

回答 1 件
  • 最後に多くの時間をかけて、私はそれを理解しました。関数呼び出しのパラメーターが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()
    
    

あなたの答え