#結論から
**Serial.parseInt()**という関数により、簡単に、マイナス符号も考慮した数値を読み込むことができる(整数)
小数点の場合は**Serial.parseFloat()**を用いる
追加のライブラリは必要ありません
#つまずくこと
このままでは、記事にならない、また、つまずく箇所があったため、サンプルと解説を以下に示す
このサンプルは、シリアルモニタで入力した数値×10を出力するプログラムです(Arduino Nanoにて検証済み)
///////////////////////////////////////////////////////
//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にて検証済み)
///////////////////////////////////////////////////////
//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