用于Android和Arduino Uno之间USB串行通信的读卡器线程

时间:2018-05-25 05:23:18

标签: android kotlin usb 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尝试了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方法的最后两行代码放在无限循环中,应用程序崩溃(无法弄清楚原因)。 我知道线程似乎同时运行但实际上它的主线程运行了一段时间然后读者,它们都没有同时运行。它的过渡非常快,因此看起来好像它们似乎同时运行。这可能是某些信息丢失的原因吗?

请帮助编写读者线程的代码,或者有更好的方法吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

经过很长一段时间后,我想通了。即使函数调用中的参数为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()