Android 蓝牙套接字从 InputStream 读取字符串跳过行

问题描述 投票:0回答:1

我正在开发一个 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()
                        }
                    }
                }
android arrays kotlin bluetooth inputstream
1个回答
0
投票

Kotlin 有一个用于读取 InputStream 内容的特定扩展。

val inputAsString = input.bufferedReader().use { it.readText() }

您可以尝试在这个堆栈溢出帖子中阅读有关此内容的内容:在 Kotlin 中,如何将 InputStream 的全部内容读取到字符串中?

© www.soinside.com 2019 - 2024. All rights reserved.