从蓝牙(Android)接收到的数据不一致

时间:2019-02-24 03:48:34

标签: android bluetooth

我正在做一个较大的项目的一部分,该项目需要我连续显示(在智能手机上)通过智能手机与HC-05(受Arduino控制)之间的蓝牙通信接收的串行数据。

首先,我只希望程序在屏幕上显示基本的“ Hello World”。根据我所拥有的内容,文本最初会正确显示为“ Hello World”。但是,在随后发送文本时,在返回正确的字符串然后重复之前,显示将变为“ ello Worldd”,后跟“ World World”以及其他几种不正确的变体。显然,我的意图是使它不断显示正确的文本(因为在我的最终项目中,传输的字符串将不是恒定的,但是为了简单起见,我决定最好在继续前进之前使恒定的字符串起作用)。

我最基本的Arduino代码如下:

void setup() {
  Serial.begin(115200);
}
void loop() {
    Serial.write("Hello World");
    delay(2000);
}

我也使用Android Studio,使用Java进行编码。我并不是特别有经验,所以我的代码基于教程。我的处理程序代码如下:

       mHandler = new Handler(){
            public void handleMessage(android.os.Message msg){
                if(msg.what == MESSAGE_READ){
                    String readMessage = null;
                    try {
                        readMessage = new String((byte[]) msg.obj, "UTF-8");
                        mReadBuffer.setText(readMessage);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
                if(msg.what == CONNECTING_STATUS){
                    if(msg.arg1 == 1)
                        mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj));
                    else
                        mBluetoothStatus.setText("Connection Failed");
                }
            }
        };

我认为代码中处理读取传入的串行数据的功能是:

public void run() {
            byte[] buffer = new byte[1024];  // buffer store for the stream
            int bytes = 0; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (true) {

                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    if(bytes != 0) {
                        SystemClock.sleep(100);
                        mmInStream.read(buffer);
                    }
                    // Send the obtained bytes to the UI activity

                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();

                } catch (IOException e) {
                    break;
                }
            }
        }

鉴于先前的文本似乎出现,我假设问题出在缓冲区的某个位置,但是我不确定如何解决该问题。我也困惑为什么有时主角似乎被切断。这可能只是由于我对Android Studio的简单经验不足,但是我找不到针对此特定问题的答案,因此我希望有人可以指出一个可能只是我遗漏的问题。

0 个答案:

没有答案