如果不在循环中,Arduino Serial.println()输出一个空行()

时间:2013-08-16 23:04:04

标签: c arduino

我正在尝试编写一个函数,它将文本从不同的源(以太网客户端/串行/等)拉到一行,然后比较它们并运行基于它们的其他函数。简单..

虽然这有效,但是在尝试从函数OTHER而不是loop()调用简单的Serial.println()时遇到问题。

到目前为止,我有大约140行代码,但这是一个导致我出现问题的部分的修剪版本:

boolean fileTerm;

setup() {
  fileTerm = false;
}

loop() {
 char character;
 String content="";
 while (Serial.available()) {
   character = Serial.read();
   content.concat(character);
   delay(1);
 }

 if (content != "") {
 Serial.println("> " + content);

 /** Error from Serial command string.
  * 0 = No error
  * 1 = Invalid command
  */
  int err = testInput(content);
}

int testInput(String content) {
  if (content == "term") {
    fileTerm = true;
    Serial.println("Starting Terminal Mode");
    return 0;
  }

  if (content == "exit" && fileTerm == true) {
    fileTerm = false;
    Serial.println("Exiting Terminal Mode");
    return 0;
  }
  return 1;
}

http://pastebin.com/prEuBaRJ完整来源)

所以重点是捕获“term”命令并进入某种文件系统终端模式(最终访问和操作SD卡上的文件)。 “exit”命令将离开终端模式。

但是,每当我实际编译并将这些命令与其他人一起输入串行监视器时,我会看到:

> hello
> term

> test for index.html
> exit

> test
> foo
> etc...

我认为该功能正在捕获那些保留的术语并实际正确处理它们,但无论出于何种原因,它都没有通过串行总线发送所需的响应。

只是为了正确的语法,我也在一个单独的标题中声明testInput()函数,但我怀疑这与是否会发生这个特定错误有关。

任何可以解释的原因?

感谢。

型号:Arduino Uno R3,IDE版本:1.0.4,虽然在某些情况下这种行为也发生在v1.0.5上..

1 个答案:

答案 0 :(得分:3)

有点可以猜测你是如何在你的代码中放置延迟(1)的,这是代码中的错误的解决方法。但你没有正确解决它。您可能看到的是,在您完成键入之前,您的代码太急于处理命令。所以你放慢了速度。

但这不是正确的修复,你真正想要做的就是等待输入整个命令。直到你按下键盘上的Enter键。

现在代码中的错误是什么, content 变量不只包含“term”,它还包含终端的Enter键生成的字符。这就是为什么你没有得到匹配。

因此,修复代码,添加测试以检查是否有Enter键字符。然后然后处理命令。