Android和Arduino之间的蓝牙通信并不总是有效

时间:2018-03-24 12:44:37

标签: android bluetooth arduino

第一次或第二次通信成功,然后随机失败并让我感到困惑。我正在使用蓝牙控制我的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;
  }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可能希望将字符用于结束数据包。在你的代码中,数据包顺序我错了。不知何故,arduino可能会收到“m1m”消息而且会混淆。

假设您的和字符是“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 ++;
  }
}

我没有测试代码,它可能会失败。但我写了这个想法的代码。