为什么我收到的串行BT数据被切断了?

时间:2012-05-07 13:53:38

标签: android bluetooth serial-port

我从BT串行连接收到的数据应为:

0
1
2
3
.
.
.
27
28
29
0
1
2
3
.
.
.
etc

但实际上我得到的是一些数据被砍掉了。像这样:

11
12
1
3
14
15
1
6
1
7
18
19
2
0 

在BTSerialService.java

/ **      *此线程在与远程设备连接期间运行。      *它处理所有传入和传出传输。      * /

private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;


public ConnectedThread(BluetoothSocket socket) {
    Log.d(TAG, "create ConnectedThread");
    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;

    // Get the BluetoothSocket input and output streams
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch (IOException e) {
        Log.e(TAG, "temp sockets not created", e);
    }

    mmInStream = tmpIn;
    mmOutStream = tmpOut;
}

public void run() {
    Log.i(TAG, "BEGIN mConnectedThread");
    byte[] buffer = new byte[1024];
    //final byte[] buffer = new byte[1024];
    int bytes;

    // Keep listening to the InputStream while connected
    while (true) {
        try {

            // Read from the InputStream
            bytes = mmInStream.read(buffer);

            //Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(FinalSetting.MESSAGE_READ, bytes, -1, buffer).sendToTarget();

            } catch (IOException e) {
            Log.e(TAG, "disconnected", e);
            connectionLost();
            break;
        }
    }
}

然后在FinalSetting.java 中 案例留言阅读:

case MESSAGE_READ:
                int i;

                byte[] readBuf = (byte[]) msg.obj; 


             // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                Log.i(LOG_TAG, readMessage);

                mTextView.setText(readMessage);
                String [] numbers = readMessage.split("\n");
                int [] intNumber = new int[numbers.length];

                for (String number : numbers) {
                    if(number.trim().length()>0){

                       try{
                           for (i=0;i<numbers.length;i++){
                                intNumber[i] = Integer.valueOf(number.trim());
                                if (intNumber[i]<0 || intNumber[i]>95){
                                    //some action
                                }
                            }
                       } catch (NumberFormatException e){
                        Log.i(LOG_TAG, "Unable to parse integer" + e);
                       }    
                    }

                }

                break;

LogCat显示的内容:

    05-06 17:28:07.079: I/HBAS(15090): 10

05-06 17:28:07.079: I/HBAS(15090): 11

05-06 17:28:07.079: I/HBAS(15090): 12

05-06 17:28:07.969: I/HBAS(15090): 1
05-06 17:28:08.029: I/HBAS(15090): 3

05-06 17:28:09.019: I/HBAS(15090): 14

05-06 17:28:09.979: I/HBAS(15090): 1
05-06 17:28:10.029: I/HBAS(15090): 5

05-06 17:28:10.989: I/HBAS(15090): 16

05-06 17:28:12.009: I/HBAS(15090): 17

05-06 17:28:12.999: I/HBAS(15090): 18

05-06 17:28:13.999: I/HBAS(15090): 19

05-06 17:28:14.999: I/HBAS(15090): 20

05-06 17:28:16.009: I/HBAS(15090): 21

所以有谁知道如何解决这个问题? 提前谢谢..

1 个答案:

答案 0 :(得分:2)

再次查看您的数据 - 您实际上是在接收所有数据,您刚刚做出了一个无效的假设,即您将以相同大小的块的形式收到它。

05-06 17:28:07.079: I/HBAS(15090): 11
05-06 17:28:07.079: I/HBAS(15090): 12
05-06 17:28:07.969: I/HBAS(15090): 1
05-06 17:28:08.029: I/HBAS(15090): 3

看到你得到了你的&#39; 13&#39; - 只有它作为一个&#39; 1&#39;然后是&#39; 3&#39;。

这是完全允许的,你应该期待的事情经常发生。您需要引入一些重新组合数据并将其分成有用部分的方法。

您可以执行类似发送

的操作
0011
0012
0013

等并且在尝试解析它们之前总是组装四个字节的块。如果传输是有保证的,这实际上会起作用,虽然它感觉有风险 - 如果它不同步,它将保持不同步,直到系统被重置或随机漫游。但是如果保证传输不会丢失或重新排序任何东西(至少警告你它没有),那么理论上可能不会被看到(在你的错误处理程序之外)。

另一个常见的想法是引入数据中不会出现的分隔符,例如

11\n
12\n
13\n

在尝试解析之前查找终止换行符。这样做的好处是,您可以通过同步到找到的下一个换行符来丢弃乱码并恢复。

最后,存在数据中所有值都可能的情况,因此您无法为分隔符/终止符保留一个值。在这种情况下,将一个保留为一个特殊含义序列之前的转义字符是很常见的,并且其中一个特殊序列代表转义字符的字面意义 - 这就像处理一样引用字符串中的\&#34; \ n&#34;表示换行符和&#34; \\&#34;意思是文字\

编辑:哦,幽默,我不得不逃避双反斜杠让它们显示,但不是反斜杠n