LoginSignup
3
2

More than 3 years have passed since last update.

ArduinoでPCから、シリアル通信で数値を送る (Serial.parseInt())

Last updated at Posted at 2020-11-06

結論から

Serial.parseInt()という関数により、簡単に、マイナス符号も考慮した数値を読み込むことができる(整数)

小数点の場合はSerial.parseFloat()を用いる

追加のライブラリは必要ありません

つまずくこと

このままでは、記事にならない、また、つまずく箇所があったため、サンプルと解説を以下に示す

このサンプルは、シリアルモニタで入力した数値×10を出力するプログラムです(Arduino Nanoにて検証済み)

スケッチ.ino
///////////////////////////////////////////////////////
//setup
///////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);     //シリアル通信初期化
}

///////////////////////////////////////////////////////
//loop
///////////////////////////////////////////////////////////
void loop() {
  //受信データがある場合if内を処理
  if (Serial.available() > 0) {
    delay(10);
    int val = Serial.parseInt();    //文字列データを数値に変換

    while (Serial.available() > 0) {//受信バッファクリア
      char t = Serial.read();
    }

    Serial.println(val*10);         //出力
  }
}

ここで、受信バッファをクリアしなければ、Serial.parseInt()で、ループ?(うごかなくなる)や、次の周で0が取得されたりする。

追記: 受信バッファをクリアする以外の方法をコメントにて@KeitetsuWorksが記述してくださいましたので、コメントもぜひご覧ください(コメントの方法では、parseIntではなくtoIntを利用します)

他のサイトでは、(ASCIIコード)などから、計算する方法などが紹介されておりますが、簡単な関数があるという紹介でした。

複数の数値を送信する

1度に、数値をスペースなどで区切って複数送信するサンプル

このサンプルは、シリアルモニタで入力した3つの数値を加算し、出力するプログラムです(Arduino Nanoにて検証済み)

スケッチ2.ino
///////////////////////////////////////////////////////
//setup
///////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);     //シリアル通信初期化
  Serial.setTimeout(10);    //タイムアウト短縮1sから0.01sへ
}

///////////////////////////////////////////////////////
//loop
///////////////////////////////////////////////////////////
void loop() {
  int val[3] = {0};

  //受信データがある場合if内を処理
  if (Serial.available() > 0) {
    delay(10);
    for (int i = 0; i < 3; i++) {
      val[i] = Serial.parseInt();    //文字列データを数値に変換
    }

    while (Serial.available() > 0) {//受信バッファクリア
      char t = Serial.read();
    }

    Serial.println(val[0]+val[1]+val[2]);         //出力
  }
}

区切り文字は、たぶん数値とマイナス以外なら、なんでも大丈夫そう。詳しくは引用を参照されたし

またSerial.setTimeoutが追加されているが、これは、入力された数値の個数が、3つ未満である場合(このサンプルは値を3つ入力することが前提)、シリアル通信がタイムアウトするまで(1秒)、動作が停止するため、高速化させるために追加した

引用

Arduinoリファレンス Serial.parseInt()
https://garretlab.web.fc2.com/arduino_reference/language/functions/communication/serial/parseInt.html

3
2
1

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
3
2