通过RN42蓝牙模块从Android到Arduino的通信不匹配

时间:2013-11-03 21:24:05

标签: java android bluetooth arduino

这个问题之后 Bluetooth connection in Android > 4.1.2 我通过反复尝试连接一次迭代来强制连接来修复,现在我还遇到了Android / Arduino通信的另一个问题。 我的硬件是Nexus 7 MY2012,Android 4.3,Arduino UNO R3和BT模块RN42。

从Android我发送一个字节数组到Arduino得到一个字符串。 一开始,使用Baudrate 115200并且没有奇偶校验,只有第一个字节到达正确,其余部分显然不匹配(主要是以重复方式)。 在RN42模块中设置奇偶校验EVEN后,我看到至少前3个字节正确到达,其余的都搞砸了。 下面是Android通信的核心部分(BT的初始化基本上遵循SDK示例)。它位于AsyncTask中用于管理连接工作的类中:

        public void write(String message) {
        Log.d(TAG, "...Data to send: " + message + "...");
        byte[] msgBuffer = message.getBytes();

        try {
            mmOutStream.write(msgBuffer);
        } catch (IOException e) {
        mHardwareToServiceHdlr.obtainMessage(MSG_ERR_BT_WRITE).sendToTarget();
            Log.d(TAG, "...Error data send: " + e.getMessage() + "...");
        }

        }

和Arduino sketch

#include <SoftwareSerial.h>
#include <Streaming.h>

const int bluetoothTx = 2;
const int bluetoothRx = 3;
byte incomingByte;
String incomingString;

SoftwareSerial bluetooth(bluetoothTx,bluetoothRx);

void setup() {
  Serial.begin(115200);
  bluetooth.begin(115200); 
  bluetooth.print("$$$");
  delay(100);
  bluetooth.println("U,115K,E");
  bluetooth.begin(115200);
  delay(100); 
}

void loop(){

  if (bluetooth.available() > 0) {  // if the data came

    incomingByte = bluetooth.read(); // read byte
    Serial.println((char)incomingByte);
  }
}

如果我向Arduino发送一个字符串,例如&#34; hello horld&#34;这就是我在串行监视器中获得的一系列传输:

 hel,o wo2ld
 hel<o wo2ld
 hel,o7orld
 hel,o wo2ld
 hel,o wo2ld
 hel<o7or6d
 hel,o wo2ld
 hel,o wo2ld
 hel,o wo2ld
 hel<o wo2ld
 hel,o7orld
 hel<o wo2ld

这只是示例,结果还取决于我将字符串发送到Arduino的频率。 大多数时候,第四个和第九个字节(但并不总是以相同的方式,并不总是只有它们)不匹配。

将数据从Arduino传输到Android似乎可以解决任何特殊问题。

任何帮助都会受到很大的影响,这件事让我疯狂,因为我需要传输超过3个字节的数据。 感谢

2 个答案:

答案 0 :(得分:0)

您的设置可能存在多个问题:

  1. 不要多次使用SoftwareSerial的begin()。如果您需要清空缓冲区,请在bluetooth.flush()之后和延迟之前使用println()
  2. 取自SoftwareSerial docs

      

    如果使用多个软件串行端口,则一次只能有一个接收数据。

    尝试使用UART作为串行端口,而不是使用bit-banged串口。

  3. Arduino UNO仅支持针脚2和3的中断,并且它们经常用于其他内容,检查它们在您的设计中是否完全免费。

  4. 尝试使用较慢的波特率,您的布局甚至可能出现115200 bps的RF问题。

  5. 如果以前的方法不起作用,请尝试在执行主循环中的Serial.print之前将字符存储在缓冲区中。完成后,最后打印出来,这样(注意边界检查):

    char buffer[MAX_LEN];
    unsigned int count = 0;
    
    void loop(){
    
      if (bluetooth.available() > 0) {  // if the data came
        buffer[count++] = bluetooth.read(); // read byte
      }
      buffer[count] = '\0'; 
      Serial.print(buffer);
      count = 0;
    }
    

答案 1 :(得分:0)

请确保明确地将设备与Android手机的设置配对。通常,对代码为1234.如果在Arduino上空闲,则首选硬件Tx,Rx引脚。 96200波特率通常更好