如果Serial.find找不到任何东西,它是否会清除缓冲区

时间:2014-04-10 17:35:56

标签: c++ arduino serial-port buffer

我正在尝试在Arduino的串行缓冲区中查找关键字。

if (Serial.find("SOMETHING"))
{
  // do something
}
else if (Serial.find("SOMETHING ELSE"))
{
  // do another thing
}

但只有第一个如果有效。即使我发送“SOMETHINGELSE”,也根本不检查。即使找不到任何东西,也能完全找到功能清除缓冲区吗?如果是的话,在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:1)

Serial.find();读取串行缓冲区并从中删除每个字节,直至找到StringCharacter指定的点。

如果你在一个条件语句中使用它,就像在你的例子中一样,即使存在“ SOMETHING ELSE ”,它总会找到“ SOMETHING ”,因为一切都到了这一步“ SOMETHING ”从缓冲区中移除(如果“ SOMETHING ”实际上在“ SOMETHING ELSE 之前到达)。

如果我们假设您的数据按照 SOMETHING 然后 SOMETHING ELSE 的顺序到达,您的串行缓冲区将如下所示: SOMETHING ELSESOMETHING < / p>

在这种情况下:

  1. 它会找到“ SOMETHING ”并停在那里,因为满足的第一个条件是准确搜索这个词。
  2. 我认为你实际上并不打算发送“ SOMETHING ”,所以我们要先说明{strong> StringA 然后 String > StringB 即可。您的缓冲区将如下所示: StringBStringA 但是根据您的条件语句,它仍然只能找到 StringA 。这将发生,因为 StringA 仍然存在于缓冲区中,现在当检查第一个条件时,您基本上要求搜索 StringA ,并且通过这样做,您将删除 StringB 使用Serial.find(StringA) - 它只是跳过 StringB ,因为它不知道您稍后会在else if中询问它。
  3. 您的问题的解决方案取决于您希望收到的数据。您可以使用某些特定字符或字符序列标记您正在等待的数据的开头:
  4. 例如,假设您等待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。