簡體   English   中英

Android和Arduino之間的藍牙通信並不總是有效

[英]Bluetooth communication between Android and Arduino doesn't always work

第一次或第二次通信成功,然后隨機失敗,使我感到困惑。 我正在使用藍牙來控制我的LED燈條的顏色,亮度和圖案。 我有一個微調器來控制模式。

首先,當選擇了微調項時,它會發送一個“ m”以表示下一個值將分配給標識模式的變量。 然后是一個值(例如1 = mode1,2 = mode2)。 因此,我必須一次發送2個字節的數據。

微調器:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        switch (position) {
            case 0:
                msg("In ed!");
                break;
            case 1:
                try {
                    btSocket.getOutputStream().write('m');
                    btSocket.getOutputStream().write(1);
                } catch (IOException e) {
                    msg("Error1");
                }
                break;
            case 2:
                try {
                    btSocket.getOutputStream().write('m');
                    btSocket.getOutputStream().write(2);
                } catch (IOException e) {
                    msg("Error2");
                }
                break;
            case 3:
                try {
                    btSocket.getOutputStream().write('m');
                    btSocket.getOutputStream().write(3);
                } catch (IOException e) {
                    msg("Error3");
                }
        }
    }
}

Arduino代碼的藍牙部分:

if(BT.available()>1) {
  COMMAND = (char)BT.read();
  inputVal = (int)BT.read();
  switch(COMMAND) {
    case 'm':
      modeSelected = inputVal;
      break;
    case 'c':
      colorOffset1 = inputVal;
      break;
    case 'b':
      brightness = inputVal;
      break;
  }
}

謝謝您的幫助!

您可能需要使用字符作為結束包。 在您的代碼中,數據包命令可能會出錯。 某種程度上,arduino可能會收到“ m1m”消息,並且會造成混淆。

假設您的and字符是“ x”,然后將結束字符添加到所有android數據包中:

btSocket.getOutputStream().write('m');
btSocket.getOutputStream().write(1);
btSocket.getOutputStream().write('x');

更改您的android代碼:

in global:
char msg[2];
int index = 0;

if(BT.available()>0) {
  char c = (char)BT.read();
  if (c == 'x') {
     COMMAND = msg[0];
     inputVal = (int)msg[1];
     switch(COMMAND) {
       case 'm':
         modeSelected = inputVal;
         break;
       case 'c':
         colorOffset1 = inputVal;
         break;
       case 'b':
         brightness = inputVal;
         break;
     }
  } else {
     msg[index%2] = c;
     index ++;
  }
}

我沒有測試代碼,它可能會失敗。 但是我為這個想法寫了代碼。

暫無
暫無

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

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