java - 通过蓝牙android接收字符串(没有换行或回车)

标签 java android bluetooth android-bluetooth

关于如何从蓝牙设备接收数据(字符串)的堆栈溢出有很多问题,但我从未见过关于如何在不检查 LF 或 CR 的情况下接收数据(字符串)的问题。

当设备在字符串末尾发送 LF 时,此代码可以完美运行:

final Handler handler = new Handler();
    final byte delimiter = 10; //ASCII code for Line Feed

    stopWorker = false;
    readBufferPosition = 0;
    readBuffer = new byte[1024];

    try {
        inStream = btSocket.getInputStream();
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
    }



    Thread workerThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted() && !stopWorker) {
                try {
                    int bytesAvailable = inStream.available();
                    if (bytesAvailable > 0) {
                        byte[] packetBytes = new byte[bytesAvailable];
                        inStream.read(packetBytes);
                        for (int i = 0; i < bytesAvailable; i++) {
                            byte b = packetBytes[i];
                            if (b == delimiter) {
                                byte[] encodedBytes = new byte[readBufferPosition];
                                System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                final String data = new String(encodedBytes, "US-ASCII");
                                readBufferPosition = 0;
                                handler.post(new Runnable() {
                                    public void run() {
                                        //test
                                        textview1.setText(data);
                                    }
                                });
                            } else {
                                readBuffer[readBufferPosition++] = b;
                            }
                        }
                    }
                } catch (IOException ex) {
                    stopWorker = true;
                }
            }
        }
    });
    workerThread.start();

但是发送字符串的设备不会发送换行符,也不会在末尾发送 CR。我已经尝试了很多东西(还有谷歌的蓝牙指南(http://developer.android.com/guide/topics/connectivity/bluetooth.html))。我想接收发送到应用程序的所有数据(并用于测试在 TextView 中显示接收到的字符串)。

提前致谢, 米歇尔夫克

最佳答案

假设所有字符串均以“1”字符开头,您应该能够通过替换 final byte delimiter = 10; 来读取倒数第二个字符串by final byte delimiter = 49;(因为 49 是 ASCII 表中“1”的十进制表示形式)。

如果没有后缀分隔符,则无法读取最后一个字符串(并断言您正在读取完整字符串,而不仅仅是一部分)。

编辑:

您在此评论提要中提供了协议(protocol)的文档。医生说: 结果字符串 [...] 由 38 个 ASCII 字符组成。

根据每个响应由 38 个 ASCII 字符组成的事实,您应该能够通过替换以下内容来读取所有消息: if (b == 分隔符) { 和 : if (readBufferPosition >= 37) {

关于java - 通过蓝牙android接收字符串(没有换行或回车),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36676733/

相关文章:

java - 格式解析异常 “EEE MMM dd HH:mm:ss Z yyyy”

java - 如何在viewPager中随机排列内容?

android,滚动Horizo​​ntalScrollView到ListView结束

android - 如何在android中获取蓝牙连接设备的MAC地址

Java EE TDD 起点

java - 使用 Java 按一个键

java - 如何使用 Play 框架和 Java 为所有动态 url 提供相同的静态 .html 文件?

java - Kotlin 中的错误但仅使用 Java - 类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

audio - 通过 SPP 蓝牙实时传输 12-16 位音频是否现实?

android - Qt 蓝牙服务器不能与 QCoreApplication 一起工作