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



我正在尝试使用Android的USB Host API在Arduino UNO和我的Android智能手机之间进行通信。到目前为止,一切都很好。我每秒通过函数 Serial.print(( 从我的 Arduino 发送一个测试字符串"尝试数据"。两个设备的波特率均设置为 9600。安卓智能手机充当主机。

我使用的一些教程是:

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

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

以及安卓 USB 主机文档。 我已经尝试了 physicaloid 和 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 方法的最后 2 行代码放在无限 while 循环中,应用程序就会崩溃(无法找出原因(。 我知道线程似乎同时运行,但实际上是主线程运行了一段时间,然后是阅读器,它们不会同时运行。它的过渡非常快,因此,它们看起来好像是同时运行的。这可能是某些信息丢失的原因吗?

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

提前致谢

终于在很多时间之后,我想通了。Android 手机不会在每次批量传输中读取 64 字节,即使函数调用中的参数为 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()

最新更新