0

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

虽然这可行,但我在尝试从函数 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 上。

4

1 回答 1

4

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

但这不是正确的解决方法,您真正想做的是等待输入整个命令。直到您按下键盘上的 Enter 键。

这是您代码中的错误,内容变量不仅包含“术语”,它还包含由终端的 Enter 键生成的字符。这就是为什么你没有得到匹配。

所以修复你的代码,添加一个测试来检查你是否得到了 Enter 键字符。然后处理命令。

于 2013-08-16T23:21:20.043 回答