ArduinoでPCと通信する・その2

Arduino

前回は Arduino から PC にデータを送信するやり方を試しました。今回は逆に、PC から Arduino にデータを送信することを考えてみます。

プログラム

今回のソースコードは以下の通りです。

C++
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 が送信側の場合と設定方法は同じです。

C++
void setup() {
  Serial.begin(9600);
}

このプログラムでは、データ長・パリティ・ストップビットはデフォルトのままで、通信速度のみ 9600bps に設定しています。

String は文字列型

このプログラムでは、loop() 関数の最初で、

C++
  String name;

として String型の変数 name を宣言しています。String型はC言語のプリミティブな型ではありませんが、Arduino の開発環境では Java風に文字列を扱える Stringクラスが定義されていて、特別な手続きなどなく、普通の型名と同じように使用できます。C言語と同様に char型の配列でも文字列を扱うことができますが、Stringクラスの方が連結などの文字列操作が簡単です。

Serial.available() で受信したデータがあるか確認する

PCから送信されたデータが Arduino に到着すると、Arduino はプログラムの動作とは関係なく、受信したデータをシリアルバッファとよばれるメモリ領域に格納します。Serial.available() 関数はシリアルバッファに格納されているデータの量を求める関数です。

Serial.available() 関数には引数はなく、シリアルバッファ内のデータのバイト数を整数値で返します。

このプログラムでは、

C++
  if(Serial.available()>0){
    name = Serial.readString();
    name.trim();
    Serial.println("Hello, "+name+" !");
  }

として、シリアルバッファ内のデータが0バイトより多いかどうか、つまり既に受信したデータがあるかどうかの判別を行っています。

なお、Serial.available() 関数はシリアルバッファ内のデータのバイト数を返すだけで、シリアルバッファ内のデータそのものを変化させることはありません。

Serial.readString() でデータを読み込む

Serial.readString() 関数は、シリアルバッファに格納されているデータを読み、String型のオブジェクトとして返します。読んだデータはシリアルバッファからは削除されます。なお、Serial.readString() 関数には引数はありません。

このプログラムでは、

C++
name = Serial.readString();

として、シリアルバッファに格納されている( PC から送信されてきた)データを変数 name に代入しています。

trim() で改行を削除する

Serial.readString() で読み込んだ文字列は、末尾に改行記号を含んでいます。これをそのまま表示すると『!』の前で改行されてしまいます。そこで、String::trim() 関数を使って末尾にある改行文字を削除します。

書式は以下の通りです。

string.trim()
引数

なし

返却値

なし

string は String 型の変数です。引数はありません。string.trim() 関数は string の先頭と末尾にある空白・改行文字取り除きます。処理後のものを関数の値として返すのではなく、string 自体を書き換えてしまいますので、元の状態も保存しておきたい場合にはあらかじめ別の変数にコピーしておく必要があります。

string の先頭または末尾に連続して複数の空白・改行文字ある場合もすべて取り除いてくれますので、たとえば改行が “\r\n” の2文字で表されている場合には両方取り除いてくれます。ただし途中にある空白・改行文字は取り除きません。

このプログラムでは

C++
name.trim();

として、String型変数 name の先頭・末尾にある空白・改行文字を削除しています。
関数によってname 自体が書き換えられますので、name=name.trim(); とする必要はありません。

String型は『+』で連結できる

String型の変数や定数は、演算子『+』を使うと文字列の連結ができます。

このプログラムでは、

C++
Serial.println("Hello, "+name+" !");

としてシリアル通信に文字列を出力していますが、

変数 name=”Yamada” なら、出力は『 Hello, Yamada ! 』
変数 name=”Takahashi” なら、出力は『 Hello, Takahashi ! 』

となります。

コンパイル&実行

Arduino と PC を USB ケーブルで接続して『 』ボタンを押してコンパイル&実行しましょう。正常にプログラムが動いたら、シリアルモニタを起動して、送信入力欄になにか(名前)を入力してみましょう。

このように動いたでしょうか?

まとめ

  • シリアル通信で Arduino へ送られてきたデータがあるかどうかは Serial.available() 関数で確認する
  • シリアル通信で Arduino に送られてきたデータは、Serial.readString() 関数で改行記号までまとめて読むことができる

コメント

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