我一直在努力解决从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发送连续数据而不会丢失一些%的数据?
答案 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");
}