通过蓝牙设备向平板电脑发送数据时出错

时间:2012-12-13 13:38:23

标签: android sockets bluetooth

我遇到以下问题: 我通过蓝牙插座连接两个设备,一个平板电脑安卓和一个蓝牙设备,如读卡器条码,到目前为止还可以,问题是,当蓝牙设备读取条形码并将其发送到平板电脑时,条形码有时候它分两部分发送,例如,如果我读了内容为“212154521212”的条码,平板电脑收到“2121”,“54521212”之后,任何人都知道告诉我该怎么办才能避免这种情况?

先谢谢。

我的代码从蓝牙设备读取数据:

[代码]     私有类ConnectedThread扩展了线程{

    private final InputStream mmInStream;
    private BluetoothSocket socket;

    public ConnectedThread(BluetoothSocket socket) {
        this.socket = socket;

        InputStream tmpIn = null;

        try {

            tmpIn = socket.getInputStream();

        } catch (IOException e) {
            new LogDeErrosRodesTablet(e);
            Log.e(TAG, e.getMessage());
            Log.e(TAG, "Erro no construtor da classe ConnectedThread.");

        }

        mmInStream = tmpIn;
    }

    public void run() {     
        // continua lendo o inputstream até ocorrer um erro

        while (true) {

            int read = 0;
            byte[] buffer = new byte[128];

            do {

                try {

                    read = mmInStream.read(buffer);
                    Log.e(TAG, "read: " + read);
                    final String data = new String(buffer, 0, read);
                    Log.e(TAG, "data: " + data);

                    //TODO
                    //send data only (bar code) only after read all
                    Bundle bundle = new Bundle();
                    bundle.putString(TelaInserirPedido.CODIGO_BARRAS, data);
                    Message message = new Message();
                    message.what = TelaInserirPedido.MSG_COD_BARRAS;
                    message.setData(bundle);

                    //Send a message with data
                    handler.sendMessage(message);

                } catch(Exception ex) {
                    read = -1;
                    return;
                }

                Log.e(TAG, "inside while.");

            } while (read > 0);

            Log.e(TAG, "outside of while.");
        }

    }

    public void cancel () {
        try {
            socket.close ();
        } catch ( IOException e) { }
    }

}

[/代码]

2 个答案:

答案 0 :(得分:1)

这不是蓝牙错误。蓝牙设备正在将所有数据发送到您的应用程序,但您在收到所有数据之前正在读取流。如果你知道数据的确切长度,你可以在读取之前检查流上的可用字节数();您可以连接所有读取的结果,直到达到已知的终点。或者你可以在任意时间延迟,并希望在那段时间内完成传输。

您将在收集输入字符串的while循环之后创建Bundle和Message,因为在该循环结束之前您不知道整个字符串。 (除非您期望在一个连接中使用多个字符串,在这种情况下,您需要更复杂的代码来处理部分数字)。

答案 1 :(得分:0)

使用OutputStream.flush()强制发送所有数据。