非常に基本的なArduinoUno Serial.readString()操作

Arduinoプログラミングは非常に初めてです。シリアルモニターからの入力文字列を識別し、それに応じて出力をコンソールに出力しようとしています

コードは次のとおりです:

void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

送信文字列を入力すると、出力として「不明」が表示されますが、これは間違っています。出力として「識別」を取得する必要があります。誰かがここで結果を達成するために私を導くことができますか。

注:readStringUntil関数を使用して希望どおりに出力を取得していますが、文字列には多くの「。」があります。

コメント

  • シリアルモニターの行末設定は何ですか?
  • NLとNLの両方CR。
  • 次に、" send / r / n "
  • を確認します。 \r\nではなく/r/n
  • readStringなどに依存する場合の問題は、実際には使用しないことです'彼らが何をしているのか、どのように機能しているのかわからない。受信データを手動で解析して、作業内容がわかるようにします。

回答

設定した場合シリアルモニターの行が「BothNL & CR」で終わる場合、このコードは「send」という単語を検索します。この文字列に「send」という単語は検索されません。 「ssend」またはこの文字列では「sendd」。

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

「1234send」または「send1234」で文字列「send」を検索する場合は「1234send5678」を使用してindexOf();

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

回答

あります* .equalsテストがfalseである理由はいくつもあります。大文字と小文字の違いや、通信元から導入された余分な文字を考慮してください。印刷できない文字でも問題が発生し、テストが失敗する可能性があります。

使用を検討してください。代わりに *。substring()。このメソッドは、サブストリングが見つかった場合にtrueを返します。例:

 String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); } 

…常にすべき文字「s」、「e」、「n」、「d」が文字列stringOne内の正しい順序で見つかったため、「identified」を返します。

コメント

  • 文字列str = Serial.readString(); if(str.substring(0)== " send ")Serial.println(" identified "); else Serial.println("不明");これも機能しませんでした。
  • 奇妙です。リンク先のWebページを見て、部分文字列を正しく使用していることを確認しましたか? (このWebページ?)。また、コメントから、受信した文字列を印刷し、受信したメッセージに" send "が表示されたことがわかります。正しい?シリアル読み取り行をコメントアウトして、" String str = " 12345 send 1234 ; "すべてが機能しているかどうかをテストします。他のコメントを判断して、すぐに送信(入力)してみてください" space " + " send " + "スペース"(" ")を送信して、それが機能するかどうかを確認します。
  • それは機能しません'。 substring(n)は、位置nで始まる文字列の部分を返すだけです。したがって、substring(0)は文字列のコピーを返すだけです。 str.substring(0,4)は、文字列の最初の4文字を返します(返されるのは少なくとも4文字であると想定しています-I 'この実装に精通していないため、何を知ることができません短い文字列に対しては機能します-C#は例外をスローします。

回答

void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

コメント

  • 文字列の読み取り" send " Serial.readString()コマンドの使用は問題ありません。ただし、結果を比較に使用すると、どういうわけか機能しません(例:data == " send " …)。考えられる解決策は、文字配列(inChar [5]など)を使用することです。配列のサイズは、必要な最大文字数より1大きいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です