使用HC-05将连续数据从arduino发送到Android App

时间:2015-11-15 19:54:15

标签: android bluetooth arduino serial-port

我一直在努力解决从arduino向Android发送连续数据的问题。 我想做的是获取模拟读取将其转换为0-5V信息,并将该信息发送到Android应用程序。 我的arduino代码很简单:

//(...)defining pins and levels
SoftwareSerial BTSerial(rxPin, txPin);
void setup()
{
  pinMode(getData, INPUT);
  digitalWrite(keyPin, LOW);
  BTSerial.begin(9600);
}
void loop()
{
  contact = digitalRead(getData);
  if (contact == HIGH) {
    sensorValue = analogRead(sensorPin);
    double voltage = sensorValue * (5.0 / 1023.0);
    if (BTSerial.available()) {
      Serial.write(BTSerial.read());
    }
    BTSerial.println(voltage, 3);
    BTSerial.write("\r");
    if (Serial.available()) {
      BTSerial.write(Serial.read());
    }
  }
  delay(5);
}

我需要发送数据,通知~200Hz频率的测量。 将数据发送到应用程序后,似乎部分数据丢失了。

我尝试了更高的绑定率,但问题仍然存在。有没有办法使用串口从arduino发送连续数据而不会丢失一些%的数据?

1 个答案:

答案 0 :(得分:2)

我认为问题在于接收器的设计。我解决了.net Xamarin中的BTL通信,但原则应该是一样的。在Android中,从InputStream读取必须快速且无法使用睡眠。您需要使用无限循环并快速读取数据到临时缓冲区。立即将沙丘字节写入辅助大缓冲区(使用读/写光标)然后,例如,在计时器中处理数据(我假设您正在使用某些数据包协议)

        public override void Run()
    {
        WriteLogInfoToLog("ConnectedThread.Run() - before");
        while (true)
        {
            try
            {
                int readBytes = 0;
                lock (InternaldataReadLock)
                {
                    readBytes = clientSocketInStream.Read(InternaldataRead, 0, InternaldataRead.Length);
                    Array.Copy(InternaldataRead, TempdataRead, readBytes);
                }
                if (readBytes > 0)
                {
                    lock (dataReadLock)
                    {
                        dataRead = new byte[readBytes];
                        for (int i = 0; i < readBytes; i++)
                        {
                            dataRead[i] = TempdataRead[i];
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                btlManager.btlState = BTLService.BTLState.Nothing;//Spadlo spojeni, musi spustit cele od zacatku
                WriteLogInfoToLog("ConnectedThread.Run() - EXCEPTION " + e.Message + ", " + e.HResult + ", " + e.StackTrace + ", " + e.InnerException);
                if (e is Java.IO.IOException)
                {
                }
                else
                {
                }
                break;
            }
        }
        WriteLogInfoToLog("ConnectedThread.Run() - after");
    }