【问题标题】:Reader thread for USB serial communication between Android and Arduino Uno用于 Android 和 Arduino Uno 之间 USB 串行通信的读取器线程
【发布时间】:2018-05-25 05:23:17
【问题描述】:

我正在尝试使用 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 方法的最后 2 行代码置于无限循环中,则应用程序崩溃(无法找出原因)。 我知道线程似乎同时运行,但实际上它的主线程运行了一段时间,然后是阅读器,它们都不会同时运行。它的过渡非常快,因此它们看起来好像是同时运行的。这可能是某些信息丢失的原因吗?

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

提前致谢

【问题讨论】:

    标签: android kotlin usb arduino-uno


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      相关资源
      最近更新 更多