Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android和Arduino之间的蓝牙数据丢失_Java_Android_Bluetooth_Byte_Buffer - Fatal编程技术网

Java Android和Arduino之间的蓝牙数据丢失

Java Android和Arduino之间的蓝牙数据丢失,java,android,bluetooth,byte,buffer,Java,Android,Bluetooth,Byte,Buffer,直截了当地说——由于某种神秘的原因,我的应用程序在接收InputStream时会丢失部分数据(字符串)。我这里说的是蓝牙连接。大多数情况下,我收到的字符串都是正确的,但有时会被缩短。这里最奇怪的是,我正在将每个输入流打印到我的ScrollView中,我可以看出整个字符串都在那里。。。然而,代码如下: @Override public void run() { InputStream inputStream; try { inputStream = mBTSock

直截了当地说——由于某种神秘的原因,我的应用程序在接收InputStream时会丢失部分数据(字符串)。我这里说的是蓝牙连接。大多数情况下,我收到的字符串都是正确的,但有时会被缩短。这里最奇怪的是,我正在将每个输入流打印到我的ScrollView中,我可以看出整个字符串都在那里。。。然而,代码如下:

@Override
public void run() {
    InputStream inputStream;

    try {
        inputStream = mBTSocket.getInputStream();
        while (!bStop) {
            byte[] buffer = new byte[256];
            int bytes;
            if (inputStream.available() > 0) {
                bytes = inputStream.read(buffer);
                final String strInput = new String(buffer, 0, bytes);;

                mTxtReceive.post(new Runnable() {
                    @Override
                    public void run() {
                        mTxtReceive.append(strInput);

                        int txtLength = mTxtReceive.getEditableText().length();
                        if (txtLength > mMaxChars) {
                            mTxtReceive.getEditableText().delete(0, txtLength - mMaxChars);
                        }

                        scrollView.post(new Runnable() {
                            @Override
                            public void run() {
                                scrollView.fullScroll(View.FOCUS_DOWN);
                            }
                        });
                        }
                    });

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        weather = strInput.split(",");
                        mTxtHumidity.setText(weather[0]);
                        mTxtTemperatureDHT.setText(weather[1]);
                        mTxtPressure.setText(weather[2]);
                        mTxtLux.setText(weather[3]);
                        mTxtRainMM.setText(weather[4]);
                        mTxtRainDaily.setText(weather[5]);
                        mTxtWSKPH.setText(weather[6]);
                        mTxtWGKPH.setText(weather[7]);
                        mTxtWSAVG2.setText(weather[8]);
                        mTxtWGAVG10.setText(weather[9]);

                    }
                });
            }
            Thread.sleep(500);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
这里的问题是数组
weather
上出现空异常,因为根据我的应用程序,我有时会访问超出边界的项目(
weather
一旦出错,大部分时间长度为6/7/8)。应用程序有10%的时间会崩溃

有什么原因吗

编辑:有时在接收InputStream而不是接收56个字节时,我分别得到33和22个

答案如下:

添加

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

由于
sleep
方法,仅解决Android和Arduino之间的非动态数据交换。事实证明,即使是
sleep(50)
也能在这种情况下工作。由于某种原因,在这短暂的
睡眠之后
缓冲区不会被分割或丢失。如果是糟糕的编码,请在投票前解释。

您使用的是什么android版本?我使用的是4.4.2版本,SGS4可能您可以检查您的缓冲区大小是否正确。如果没有,请重复网络事务。