我正在开发一个 Android 蓝牙应用程序,它将在 Arduino 和 Android 之间进行终端通信。通信正常,但输入流从蓝牙套接字读取并创建单独的字符串。
例如。在 1 行中接收的命令是: LED 亮起
我当前的实现给了我: L ED 开启
或者如果字符串更长: S 埃尔沃中心 R
val buffer = ByteArray(1024)
var numBytes: Int
inputStream = mSocket.inputStream
while (mSocket.isConnected) {
numBytes = inputStream.read(buffer)
mHandler.obtainMessage(
HandlerConstant.MESSAGE_READ,
String(buffer, 0, numBytes)
).sendToTarget()
}
如有任何建议,我们将不胜感激。
我尝试将每个字节读入数组并从中创建一个字符串。我不断收到分隔线。
例如: L 乙 D
O
我查看了Google蓝牙聊天如何实现,它与我正在使用的类似。
考虑到我的线程可能被阻塞,我尝试利用 PC 上的终端通过蓝牙发送字符串,得到相同的结果。
看来我无法中断 inputStream.read(buffer) 来验证或循环接收到的数据,然后再将其交给处理程序。
我还尝试了下面的代码,取得了更好的成功。当字符串较长时,也会发生同样的问题。
例如: 伺服中心
val buffer = ByteArray(1024)
var numBytes: Int
inputStream = mSocket.inputStream
while (true) {
loop = 0
val avail = inputStream.available()
if (avail > 1) {
numBytes = inputStream.read(buffer)
if(numBytes > 0) {
mHandler.obtainMessage(
HandlerConstant.MESSAGE_READ,
String(buffer, 0, numBytes)
).sendToTarget()
}
}
}
Kotlin 有一个用于读取 InputStream 内容的特定扩展。
val inputAsString = input.bufferedReader().use { it.readText() }
您可以尝试在这个堆栈溢出帖子中阅读有关此内容的内容:在 Kotlin 中,如何将 InputStream 的全部内容读取到字符串中?