【问题标题】:Arduino/Android Bluetooth delayArduino/Android 蓝牙延迟
【发布时间】:2018-09-03 15:35:35
【问题描述】:

我们正在开发一个应用程序,该应用程序使用蓝牙库通过 HC-05 模块与蓝牙中的 Arduino 进行通信。我们做了一个虚拟配置来测试延迟,而无需 Arduino 或应用程序进行任何计算,我们在请求和回答之间有大约 1 秒的巨大延迟......

协议看起来很简单:Android 发送字节 -2,如果接收到的字节为 -2,Arduino 发送 -6、-9,Android 一次又一次地回答。

安卓代码:

h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case RECIEVE_MESSAGE:                                                   // if receive massage
                        byte[] readBuf = (byte[]) msg.obj;

                        for(int i=0;i < readBuf.length;i++)
                        {
                            if((int) readBuf[i] != 0) {
                                txtArduino.append(String.valueOf((int) readBuf[i]) + ", ");
                            }
                        }
                        byte[] msg = {-2};
                        mConnectedThread.writeByte(msg);
                        break;
                }
            };
        };

Arduino 代码:

const int receveidBuffLen = 8*4;


void setup() {
  Serial.begin(115200);
}

void loop() {
    if (Serial.available() > 0) 
    {
      byte buff[receveidBuffLen];
      Serial.readBytes(buff, receveidBuffLen);

      for(int i=0; i < receveidBuffLen;i++)
      {
        if(buff[i] == (byte) -2) // 254
        {
            byte message[2] = {(byte) -6, (byte) -9};
            Serial.write(message, 2);
            Serial.flush();
        }
      }
    }
    delay(3);
}

有谁知道延迟来自哪里?

我们更改了 HC05 波特率(从 9600 到 115 200):什么也没发生。我们将 HC05 更改为另一个:什么也没发生。我们之前使用了Blue2Serial库(蓝牙作为SPP),延迟是一样的......我们使用了另一个控制器(ESP8266),延迟仍然是1秒......

【问题讨论】:

    标签: android bluetooth arduino delay


    【解决方案1】:

    看起来这个字符串是个问题:

    Serial.readBytes(buff, receveidBuffLen);
    

    receveidBuffLen 是 32。 尽管一次只能读取一个字节,但您正在尝试读取其中的 32 个。当然,如果没有更多的字节,代码会一直卡到超时。

    此外,读取字节后,您永远不会检查实际读取了多少字节,而是从下到上扫描整个数组:

    for(int i=0; i < receveidBuffLen;i++)
    

    相反,您必须这样做:

    int bytesAvailable = Serial.available();
    if (bytesAvailable > 0)
    {
      byte buff[receveidBuffLen];
      int bytesToRead = (bytesAvailable < receveidBuffLen) ? bytesAvailable : receveidBuffLen;
      // Read no more than the buffer size, but not more than available
    
      int bytesActuallyRead = Serial.readBytes(buff, bytesToRead);
    
      for(int i=0; i < bytesActuallyRead;i++)
      ...
    

    【讨论】:

      【解决方案2】:

      代码有几个问题可能会导致延迟:

      1. delay 循环结束时的函数 - 这将减慢 Ardunio 可以跟上的处理速度
      2. 调用Serial.flush() - 这将阻止处理loop(),直到内部TX串行缓冲区为空。这意味着 Arduino 被阻塞,新的 RX 数据可能会堆积起来,从而减慢响应时间。
      3. 调用Serial.readBytes() - 您应该关注最小的数据单元并处理每个loop() 迭代。如果您尝试在每个循环中处理多条消息,那么现在会减慢循环时间,从而导致延迟。

      您可以尝试在 Arduino 上实现SerialEvent 模式。我们一次只从串行缓冲区读取一个字节,将loop() 函数必须执行的处理保持在最低限度。如果我们收到-2 字节,我们将标记一个标志。如果标记了标志,loop() 函数将调用Serial.write() 函数,但不会阻止数据传输。这是一个简单的例子。

      bool sendMessage = false;
      byte message[2] = {(byte) -6, (byte) -9};
      
      void loop()
      {
          if (sendMessage == true)
          {
              Serial.write(message, 2);
              sendMessage = false;
          }
      }
      
      
      /*
        SerialEvent occurs whenever a new data comes in the hardware serial RX. This
        routine is run between each time loop() runs, so using delay inside loop can
        delay response. Multiple bytes of data may be available.
      */
      void serialEvent()
      {
          while (Serial.available())
          {
              // get the new byte:
              byte inChar = ((byte) Serial.read());
      
              if (inChar == ((byte) -2))
              {
                  sendMessage = true;
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        我们只是自己找到了一些解决方案,并希望分享它们:

        初始情况:1050 毫秒得到答复。所有解决方案都是独立的,并在初始情况下完成。

        • 删除 Serial.flush():1022 毫秒。
        • 在 Arduino 代码中添加一个简单的 Serial.setTimeout(100):135 毫秒。 (天哪!)
        • 在 Android 中添加一个 100 毫秒的简单 timeout to inputStream:95 毫秒。

        哪种解决方案是最好的,我们不能说,但它现在有效......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-09
          • 2012-03-27
          • 1970-01-01
          • 2013-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多