前回は Arduino から PC にデータを送信するやり方を試しました。今回は逆に、PC から Arduino にデータを送信することを考えてみます。
プログラム
今回のソースコードは以下の通りです。
void setup() {
Serial.begin(9600);
}
void loop() {
String name;
if(Serial.available()>0){
name = Serial.readString();
name.trim();
Serial.println("Hello, "+name+" !");
}
}
プログラムの解説
Serial.begin() でシリアル通信設定
Arduino が PC から送られたデータを受信する場合も、Arduino が送信側の場合と設定方法は同じです。
void setup() {
Serial.begin(9600);
}
このプログラムでは、データ長・パリティ・ストップビットはデフォルトのままで、通信速度のみ 9600bps に設定しています。
String は文字列型
このプログラムでは、loop() 関数の最初で、
String name;
として String型の変数 name を宣言しています。String型はC言語のプリミティブな型ではありませんが、Arduino の開発環境では Java風に文字列を扱える Stringクラスが定義されていて、特別な手続きなどなく、普通の型名と同じように使用できます。C言語と同様に char型の配列でも文字列を扱うことができますが、Stringクラスの方が連結などの文字列操作が簡単です。
Serial.available() で受信したデータがあるか確認する
PCから送信されたデータが Arduino に到着すると、Arduino はプログラムの動作とは関係なく、受信したデータをシリアルバッファとよばれるメモリ領域に格納します。Serial.available() 関数はシリアルバッファに格納されているデータの量を求める関数です。
Serial.available() 関数には引数はなく、シリアルバッファ内のデータのバイト数を整数値で返します。
このプログラムでは、
if(Serial.available()>0){
name = Serial.readString();
name.trim();
Serial.println("Hello, "+name+" !");
}
として、シリアルバッファ内のデータが0バイトより多いかどうか、つまり既に受信したデータがあるかどうかの判別を行っています。
なお、Serial.available() 関数はシリアルバッファ内のデータのバイト数を返すだけで、シリアルバッファ内のデータそのものを変化させることはありません。
Serial.readString() でデータを読み込む
Serial.readString() 関数は、シリアルバッファに格納されているデータを読み、String型のオブジェクトとして返します。読んだデータはシリアルバッファからは削除されます。なお、Serial.readString() 関数には引数はありません。
このプログラムでは、
name = Serial.readString();
として、シリアルバッファに格納されている( PC から送信されてきた)データを変数 name に代入しています。
trim() で改行を削除する
Serial.readString() で読み込んだ文字列は、末尾に改行記号を含んでいます。これをそのまま表示すると『!』の前で改行されてしまいます。そこで、String::trim() 関数を使って末尾にある改行文字を削除します。
書式は以下の通りです。
string.trim()
引数
なし
返却値
なし
string は String 型の変数です。引数はありません。string.trim() 関数は string の先頭と末尾にある空白・改行文字取り除きます。処理後のものを関数の値として返すのではなく、string 自体を書き換えてしまいますので、元の状態も保存しておきたい場合にはあらかじめ別の変数にコピーしておく必要があります。
string の先頭または末尾に連続して複数の空白・改行文字ある場合もすべて取り除いてくれますので、たとえば改行が “\r\n” の2文字で表されている場合には両方取り除いてくれます。ただし途中にある空白・改行文字は取り除きません。
このプログラムでは
name.trim();
として、String型変数 name の先頭・末尾にある空白・改行文字を削除しています。
関数によってname 自体が書き換えられますので、name=name.trim(); とする必要はありません。
String型は『+』で連結できる
String型の変数や定数は、演算子『+』を使うと文字列の連結ができます。
このプログラムでは、
Serial.println("Hello, "+name+" !");
としてシリアル通信に文字列を出力していますが、
変数 name=”Yamada” なら、出力は『 Hello, Yamada ! 』
変数 name=”Takahashi” なら、出力は『 Hello, Takahashi ! 』
となります。
コンパイル&実行
Arduino と PC を USB ケーブルで接続して『 → 』ボタンを押してコンパイル&実行しましょう。正常にプログラムが動いたら、シリアルモニタを起動して、送信入力欄になにか(名前)を入力してみましょう。
このように動いたでしょうか?
まとめ
- シリアル通信で Arduino へ送られてきたデータがあるかどうかは Serial.available() 関数で確認する
- シリアル通信で Arduino に送られてきたデータは、Serial.readString() 関数で改行記号までまとめて読むことができる
コメント