簡體   English   中英

Arduino-Android藍牙連接有時會出現第一個字符錯誤

[英]Arduino - Android Bluetooth connecting getting 1st character wrong sometimes

我正在設計一個通過藍牙連接從Arduino獲取值的應用程序,它可以獲取數據,但有時會獲取數據,但第一個數字錯誤。 像它得到840,564,0,0,0,0而不是540,564,0,0,0,0。

這只會在我的應用中發生。 通過USB可以完美工作。

這是arduino的代碼。

void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(38400);
  pinMode(7, INPUT);
  pinMode(6, INPUT);
  pinMode(5, INPUT);
  pinMode(4, INPUT);
}

void loop() {

  // read the input on analog pin 1:
  int pot1 = analogRead(A1);
  // read the input on analog pin 0:
  int pot2 = analogRead(A0);

  int switch1 = digitalRead(7);
  int switch2 = digitalRead(6);
  int switch3 = digitalRead(5);
  int switch4 = digitalRead(4);

  // print out the value you read:

  Serial.print(pot1);
  Serial.print(",");
  Serial.print(pot2);
  Serial.print(",");
  Serial.print(switch1);
  Serial.print(",");
  Serial.print(switch2);
  Serial.print(",");
  Serial.print(switch3);
  Serial.print(",");
  Serial.println(switch4);

  delay(100);        // delay in between reads for stability
}

這是我的應用程序的一些代碼

 h = new Handler() {
                public void handleMessage(android.os.Message msg) {
                    switch (msg.what) {
                        case RECIEVE_MESSAGE:                                                   // if receive massage
                            byte[] readBuf = (byte[]) msg.obj;
                            String strIncom = new String(readBuf, 0, msg.arg1);                 // create string from bytes array
                            sb.append(strIncom);                                                // append string
                            int endOfLineIndex = sb.indexOf("\r\n");                            // determine the end-of-line
                            if (endOfLineIndex > 0) {                                            // if end-of-line,
                                String sbprint = sb.substring(0, endOfLineIndex);               // extract string
                                sb.delete(0, sb.length());                                      // and clear
                                           // update TextView
                                dataFromArd=sbprint;
                                String segments[]=dataFromArd.split(",");

                                //angle1= -90 + (Integer.getInteger(segments[0]) - -333) * (90 - -90) / (333 - -333);
                                if (segments[0].length()>2 && segments[0].length()<4) {
                                    int segmentInt1= Integer.parseInt(segments[0]);
                                    int segmentInt2= Integer.parseInt(segments[1]);
                                    if (segmentInt1 > 180 || segmentInt1 < 900) {
                                        //angle1 = Integer.parseInt(segments[0]) - 529;
                                        //angle1= -90 + (Integer.parseInt(segments[0]) - (515-333)) * (90 - -90) / (515+333) - (515-333);
                                        int data1= (int) (0.27 * segmentInt1 - 139);
                                        int data2=(int) (0.27 * segmentInt2 - 151);

                                        if (data1!=angle1 && Math.abs(data1-angle1)<10){
                                            angle1 = data1;
                                            speedView.speedTo(angle1,5);
                                            Log.d("int", segments[0] + "-" + Math.abs(data1-angle1) + "-" + angle1 + " " + segments[1] + "-" + Math.abs(data2-angle2) + "-" + angle2);
                                        }
                                        if (data2!=angle2 && Math.abs(data2-angle2)<25){
                                            speedView2.speedTo(angle2,5);
                                            angle2 = data2;
                                            Log.d("int2", segments[0] + "-" + Math.abs(data1-angle1) + "-" + angle1 + " " + segments[1] + "-" + Math.abs(data2-angle2) + "-" + angle2);
                                        }
                                        //Log.d("int", Math.abs(data1-angle1) + "-" + angle1 + " " + Math.abs(data2-angle2) + "-" + angle2);
                                        teste.setText("Data from Arduino: " + segments[0] + segments[1]);
                                    }
                                }


                            }
                            //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
                            break;
                    }
                };
            };

private class ConnectedThread extends Thread {
        private final InputStream mmInStream;

        public ConnectedThread(BluetoothSocket socket) {
            InputStream tmpIn = null;


            // Get the input and output streams, using temp objects because
            // member streams are final
            try {
                tmpIn = socket.getInputStream();
            } catch (IOException e) { }

            mmInStream = tmpIn;

        }

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

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                    h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                } catch (IOException e) {
                    break;
                }
            }
        }

    }

看來問題出在內存的過度使用,導致應用跳過幀而無法獲取正確的數據。

我通過為數據的第一段添加一個虛擬值作為String並過濾掉損壞的數據(如果第一段!=到String沒有獲取數據)來解決此問題。

之后,我進行了很多性能改進,從而解決了該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM