我正在尝试在Arduino的串行缓冲区中查找关键字。
if (Serial.find("SOMETHING"))
{
// do something
}
else if (Serial.find("SOMETHING ELSE"))
{
// do another thing
}
但只有第一个如果有效。即使我发送“SOMETHINGELSE”,也根本不检查。即使找不到任何东西,也能完全找到功能清除缓冲区吗?如果是的话,在这种情况下我该怎么办?
答案 0 :(得分:1)
Serial.find();
读取串行缓冲区并从中删除每个字节,直至找到String
或Character
指定的点。
如果你在一个条件语句中使用它,就像在你的例子中一样,即使存在“ SOMETHING ELSE ”,它总会找到“ SOMETHING ”,因为一切都到了这一步“ SOMETHING ”从缓冲区中移除(如果“ SOMETHING ”实际上在“ SOMETHING ELSE ”之前到达)。
如果我们假设您的数据按照 SOMETHING 然后 SOMETHING ELSE 的顺序到达,您的串行缓冲区将如下所示: SOMETHING ELSESOMETHING < / p>
在这种情况下:
String
> StringB 即可。您的缓冲区将如下所示: StringBStringA 但是根据您的条件语句,它仍然只能找到 StringA 。这将发生,因为 StringA 仍然存在于缓冲区中,现在当检查第一个条件时,您基本上要求搜索 StringA ,并且通过这样做,您将删除 StringB 使用Serial.find(StringA)
- 它只是跳过 StringB ,因为它不知道您稍后会在else if
中询问它。例如,假设您等待String
类型的数据。在将其发送到序列号之前,请将每封邮件以$START$SOMETHING$
然后,您可以使用此命令查找以标记开头的第一个命令,并将消息内容加载到String
,以便您可以使用条件语句将其与预期结果进行比较。
注意!!! 以下代码将在带有$START$
标记的第一条消息上停止,因此如果您想要查看您的串行缓冲区中的其他消息,您不希望{{1 } break
并使用数组来存储每个结果。
while(Serial.available > 0)
我只会在你想使用char myCharacter;
String myIncomingData;
if(Serial.find("$START$"))
{
while (Serial.available() > 0) {
// Reads byte of Serial at the time
myCharacter = Serial.read();
// Stops at the end of data
if (myCharacter == "$") {
break;
}
// Adds each character to String with your data
myIncomingData += myCharacter;
}
if (myIncomingData == "SOMETHING") {
// Do whatever you like to with your data
} else if (myIncomingData == "SOMETHING ELSE") {
// Do whatever you like to with your data
}
的情况下使用这个解决方案,我确信你也可以用很多不同的方式得到你的结果,最后你总是可以通过整个64字节的缓冲区字节使用您自己的代码按字节:D。