0

さまざまなソース (イーサネット クライアント/シリアル/など) からテキストを 1 行にプルし、それらを比較して、それらに基づいて他の関数を実行する関数を作成しようとしています。単純..

これは機能しますが、単純な Serial.println() を loop() 以外の関数から呼び出そうとすると問題が発生します。

これまでのところ、約 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

どのようにしてコードに delay(1) を入れたのか、それはコードのバグの回避策であったことはちょっと推測できます。しかし、あなたはそれを適切に解決しませんでした。おそらく、あなたが見たのは、あなたがコマンドを入力し終える前に、あなたのコードがあまりにも熱心にコマンドを処理できなかったということでした. だからあなたはそれを遅くしました。

しかし、それは正しい修正ではありませんでした。本当にやりたいことは、コマンド全体が入力されるのを待つことです。キーボードの Enter キーを押すまで。

これは現在のコードのバグです。コンテンツ変数には「用語」だけではなく、端末の Enter キーによって生成された文字も含まれています。これが、一致しない理由です。

コードを修正し、Enter キー文字を取得したことを確認するテストを追加します。そして、コマンド処理します。

于 2013-08-16T23:21:20.043 に答える