直截了当-我的应用程序由于某种神秘的原因而在接收InputStream时失去了部分数据(字符串)。我在这里谈论蓝牙连接。大多数时候,我会收到正确的字符串,但有时会缩短一次。这里最奇怪的是,我正在将每个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上的null异常,因为根据我的应用程序,我有时会越界访问项目(weather出现错误的大多数时间是6/7/8)。应用程序在10%的时间内崩溃。

背后有什么原因吗?

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

最佳答案

在这里找到答案:Android InputStream dropping first two bytes (modified BluetoothChat)

新增中

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


由于sleep方法,仅解决了Android与Arduino之间非动态数据交换的问题。事实证明,即使sleep(50)在这种情况下也可以工作。出于某种原因,此sleep短缓冲区永远不会被分割或丢失。如果编码错误,请在投票之前解释。

关于java - Android和Arduino之间的蓝牙数据丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30465263/

10-11 22:54
查看更多