複数の文字をシリアル受信

複数の文字をシリアル通信で受信する方法を紹介します。

結論:下記スケッチを使え!
 

//参考サイト:http://ch.nicovideo.jp/yugata/blomaga/ar1177727

void setup() {
  Serial.begin(115200);
}
void loop() {
  if (Serial.available() > 0)
  {
    str = Serial.readStringUntil(';');  //「;」を検出したら終了
    Serial.println(str);
    str = "";

    //ここは、シリアル受信したときに実行する
  }

  //ここは、何もシリアル受信していないときに実行する
}
 
 

 

よく、いろいろなサイトで紹介されているのは、次のスケッチです。

//参考サイト:http://denshi.blog.jp/arduino/serial

void setup(){
  // シリアルポートを9600 bps[ビット/秒]で初期化
  Serial.begin(9600);
}
 
void loop(){
   
  int input;
  // シリアルポートより1文字読み込む
  input = Serial.read();
  
  if(input != -1 ){
    // 受け取った文字を送信
    Serial.write(input);
    Serial.write("\n");
  }
}
 

しかし、このスケッチには欠点があります。

それは…
シリアル受信に使う「Serial.read();」は、受信データの1バイトのみを返すコマンドです。(→参考サイト
よって、複数の文字を受信する際は、「void loop()」を何回も繰り返して1バイトずつ読み取る必要があるのです。
 
そのため、void loop()内に書かれたスケッチも同時に実行されてしまいます。
はじめに記載したスケッチでは、「str = Serial.readStringUntil(‘;’);」の部分で、終了コマンド(ここでは「;」)を検出するまで待機するので、それより下は受信後に実行されます。
(そのため、シリアル送信側は「[送りたい文字列]+[終了コマンド]」の形で送る必要があります。)