如何让 inputStream蓝牙正确写入/显示

问题描述

Arduino 正在通过 hc05 模块向 android 发送值。从 0 到 9、90、92、50、55 等的值,从 100 到 350 和从 400 到 650 的值。 Android 在文本框中读取和写入这些值(用于调试目的)。然后我用 if 语句控制 UI 动画。

90% android 正确读取这些值,但有时它会读取 7 而不是 77,例如,基本上它会砍掉第一个数字。我通过向它发送 7777 号码发现了这一点,它读为 777。 0 到 9(单个数字)之间的值始终按原样显示。 如果我使用 Thread.sleep(millis) 我会得到不同的结果,但 50millis 是最好的,但不是没有错误我有一种感觉,代码是在线程休眠的时候发送的,这会切断第一个数字。

Bellow 我将发布我的部分 Java 代码。这是接收 inputStream 的部分,然后使用 if 语句执行操作。我添加一个 if 语句来显示示例。我尽可能地精简了我的代码,因为它又大又乱。


        @Override
        public void run() {
            InputStream inputStream;
            try {
                mBTSocket.getoutputStream().write(demandValues.getBytes());
            } catch (IOException e) {
                // Todo Auto-generated catch block
                e.printstacktrace();
            }

            try {
                inputStream = mBTSocket.getInputStream();
                while (!bStop) {
                    byte[] buffer = new byte[256];
                    if (inputStream.available() > 0) {
                        inputStream.read(buffer);
                        int i = 0;
                        /*
                         * This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
                         */
                        for (i = 0; i < buffer.length && buffer[i] != 0; i++) {
                        }
                        final String strInput = new String(buffer,i);
                        TextView BTtext = (TextView) findViewById(R.id.BTtext);
                        BTtext.setText(strInput);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                            
                                if (BTtext.getText().toString().equals("11"))
                                {
                                    overloadSwitch = (Switch) findViewById(R.id.overloadSwitch);
                                    overloadSwitch.setChecked(false);
                                    btntwelwe.setEnabled(false);


                                }
                        });
                    }
                    Thread.sleep(50);

                }
            } catch (IOException e) {
// Todo Auto-generated catch block
                e.printstacktrace();
            } catch (InterruptedException e) {
// Todo Auto-generated catch block
                e.printstacktrace();
            }

        }

最好的事情是,如果我能识别出起始字符和结束字符。 然后我会编程 arduino 以发送 例如, 停止然后下一个

我是 Java 新手,我的项目结合了来自互联网的示例代码并将它们组合在一起,但我被困在这里

谢谢

解决方法

解决了!

我不懂java,但我懂逻辑。 我改了:

if (inputStream.available() > 0)

到:

如果 (inputStream.available() > 2)

现在它只读取输入流至少为 3 个字节。

然后我更改了我的命令值,因此它们都是 3 个字节。 我加了 9。所以例如 1 现在是 991 而 12 现在是 912 ... 有些人嘲笑我的解决方案,但它就像一个魅力,不需要额外的代码。