0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シリアル通信で1行の文字列を入力

Last updated at Posted at 2023-04-28

シリアル通信によりテキストを1行読み込み

arduinoやesp32でシリアル通信により1行分だけ受信します。
受信したテキストをコマンドとして処理することで、マイコン側の動作を変えていくことができます。

#define MAX_LINE_LENGTH 100


static int recptr = 0;  //受信した文字数を保存する
static char recv[MAX_LINE_LENGTH];   //受信した文字列を保存する


int receiveCommand(void)
{
  int cmd = -1;           // -1 受信中 or 受信エラー


  //すべての受信データを受け取る
  //whileループを抜ける条件はシリアル受信データが無い
  while (1) {
    int receive_byte = Serial.read();

    //受信データが無ければループを抜ける
    if (receive_byte == -1) {
      cmd = 0;
      break;
    }

    recv[recptr] = receive_byte;


    //受信データの終わりをCRまたはLFとする(他の文字にすることも可能)
    //CRまたはLFの受信でループを抜ける
    if ((recv[recptr] == '\n') || (recv[recptr] == '\r')) {

      //'\0'は文字列の終端として認識される
      recv[recptr] = '\0';
      recptr = 0;
      cmd = 0;
      break;

    } else {

      //受信データがある場合は文字列の書込位置を一文字分だけ移動
      recptr++;
      //MAX_LINE_LENGTHで定義された文字数以上の場合は先頭に戻って上書きする
      if (recptr >= MAX_LINE_LENGTH) recptr = 0;

    }
  }
  return cmd;
}



void setup() {
  Serial.begin(115200);
}


void loop() {

  int cmd;

  // コマンドを受信
  if (Serial.available() > 0) {
    int rdata = receiveCommand();
    if (rdata != -1) cmd = rdata;
  }


  Serial.printf("%s\n", recv);
  delay(500);
}

動作確認

arduinoIDEの場合は[CRおよびLF]に設定する必要があります。

image.png

こちらを参考にして書き換えています

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?