忘備録-備忘録

技術的な備忘録

Arduinoシリアルから一行入力

2021-11-12 21:18:08 | arduino
Arduinoのシリアル通信で"\n"まで1行受信するプログラムです。関数loop(){}内で毎回呼び出します。受信していない場合はブロックせずに終了して戻り値が-1になります。また、"\n"まで受信していない場合も戻り値-1で終了します。

プログラム
#include <errno.h>

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

void loop()
{
  int cmd;

  if (Serial.available() > 0) {   // 受信したデータが存在する
    int rdata = receiveCmd();     // コマンドを受信
    if (rdata != -1) cmd = rdata; // -1 受信中 or 受信エラー
  }

  delay(100);
}

int receiveCmd(void)
{
  int cmd = -1;           // -1 受信中 or 受信エラー
  static int recptr = 0;  //受信した文字数を保存する
  static char recv[32];   //受信した文字列を保存する

  while (1) {             //すべての受信データを受け取る
    int receive = Serial.read();
    if (receive == -1) break;        //受信データなし ループを抜ける
    recv[recptr] = receive;
    if ((recv[recptr] == '\n') || (recv[recptr] == '\r')) {
      recv[recptr] = '\0';
      recptr = 0;
      char *ptr;
      long rcvdata = strtol(recv, &ptr, 10); //文字列を整数に変換
      if (recv[0] == '\0') break;            //空行
      if (errno != 0  )  break;              //エラー発生
      if (*ptr != '\0')  break;              //エラー発生
      cmd = rcvdata;
    } else {
      recptr++;
      if (recptr > 30) recptr = 0;           //バッファーオーバーフロー対策
    }
  }
  return cmd;
}


最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
レビュー依頼 (林遠)
2022-05-27 15:59:11
失礼致しました。Amazonで日本のラズベリーパイを販売している林遠です。
ブログを拝見しました。弊社のラズベリーパイ4bレビューブログ記事を書きしてくれませんか。
こちらは無料でサンプルを提供します。
連絡メールはjp02@vertue.cnです。
御返事お待ちしております。どうぞよろしくお願いします。
返信する

コメントを投稿