我正在使用蓝牙串行连接将数据从Arduino发送到Android。这是我在arduino中用来发送数据的代码:
char toSend = (char)Serial.read();
bluetooth.print(toSend);
这个代码在我的Android应用程序上读取这些数据:
void inputthread() {
final Handler handler = new Handler();
stopWorker = false;
workerThread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopWorker)
{
try
{
int bytesAvailable = mmInputStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
final String s = new String(packetBytes);
final String t = new String("s");
if (s==t)
{
handler.post(new Runnable()
{
public void run()
{
try {
closeBT();
}
catch (IOException ex) { }
}
});
}
handler.post(new Runnable()
{
public void run()
{
// txtaggiorna.setText(s);
}
});
}
} catch (IOException ex)
{
stopWorker = true;
}
}
}
});
当我从Arduino串口显示器发送“Ciao”时,Android首先显示“C”,然后显示“iao”,但我不知道为什么。
答案 0 :(得分:1)
这是您必须允许的预期结果。每当数据流在逐个字符的传输和批处理或分组传输之间转换时,不使用旨在保留分组的逻辑,就有可能将消息拆分为多个批处理/数据包。
您的项目涉及逐字符串行传输和打包蓝牙传输,因此很可能会发生这种类型的拆分。
重新组合消息的一种相对较差的方法是假设任何以较小时间间隔到达的消息都是单个消息,然后假设在有较长时间间隔时开始新消息。
更健全的机制是声明消息将被终止,例如使用换行符。在这种情况下,您将在换行符之间获得的所有内容重新组合为单个消息。请注意,数据包/读取调用完全可以为您提供一条消息的尾端,换行符,然后是新消息的开头。