ArduinoのSerial.available()とは?

Free electrical circuit image 電子工作

電子工作でArduinoのシリアルモニターを使うコードを書いていたのですが、Serial.available()という処理があることに気づきました。

何なのかよくわからなかったので調べてみたらシリアルモニターを使うコードのほとんどにこの処理がありました。

そこで「Arduinoでシリアルモニターを使う際にSerial.available()は必須なのか?」と思ったので備忘録も兼ねて解説してみようと思います。

Serial.available()とは

まずSerial.available()とは何かについてです。

Serial.available()とはArduinoのbufferにあるデータのByte数を出力する関数です。

bufferとはメモリの一領域のことで、シリアル通信によってArduinoに送られたデータが待機しているところになります。

bufferはデータを64バイトまで保持可能です。

Serial.available()の使い方

Serial.available()を使う目的ですが、シリアル通信が行われたかどうかを確認するために使うことが多いようです。

具体的には以下のようにif(Serial.available()>0){…}のようにif文と使います。

int incomingASCII = 0;	// 受信データ格納用

void setup() {
	Serial.begin(9600);	// シリアルポートを開き, 通信速度を9600 bpsに設定
}

void loop() {

	// send data only when you receive data:
	if (Serial.available() > 0) {
		// read the incoming ASCII:
		incomingASCII = Serial.read();

		// say what you got:
		Serial.print("I received: ");
		Serial.println(incomingASCII, DEC);
	}
}

上記のコードをArduinoに書き込んだ後、シリアルモニターを立ち上げてaと入力してEnterを押すと以下のように1行目に”I recieved: 97″、2行目に”I received: 10″と表示されます。

ここでは入力した文字をSerial.read()で読み込むのでaのASCIIコードである十進数の97が出力されます。2行目の”I recieved: 10″はシリアルモニターに文字を入力した後に押したEnterの改行コードLFのASCIIコードである十進数の10が出力されたものです。

ちなみに「Enterを打ち込んだ後に何も出力させたくない」という場合は、シリアルモニターの右上にあるNew LineをNo Line Endingに変更すればできます。

上のように書くことでシリアル通信が行われた時だけ(ここではシリアルモニターに何らかの文字を打ち込んでEnterを押したときだけ)if文の中身が実行されるようになります。

Serial.available()が無いとどうなる?

例えば先ほどのコードでif(Serial.available()>0)が無いと以下のように延々と-1という値を出力し続けます。

if(Serial.available()>0)が無くなったことでシリアル通信が行われたかどうかに関係なくSerial.read()が実行されています。

シリアル通信が行われた時だけデータを読み込むなり、出力するなりしてほしいのが大半だと思いますのでif(Serial.available()){…}はシリアル通信を行うほとんどのコードに出てくるということです。

コメント

タイトルとURLをコピーしました