シリアル入出力のためのクラス
シリアル通信プロトコルを使ってデータをやりとりするためのクラスがSerialです。ここではシリアル通信を介して、センサー値やスイッチの状態を表す値を読み、それに応答するプログラムを作成することを想定し、説明します。シリアル入力を行うにはプログラム内に次のような処理を記述します。
・Serialオブジェクトを生成する→Serialクラスのコンストラクタを使う
・Serialオブジェクトにデータが来たか調べる→avaliable()メソッドあるいはSerialEvent()関数を使う
・Serialオブジェクトからデータを読む→read()メソッドを使う
Serialクラスの機能を使うには、serialパッケージをimportする必要があります。
import processing.serial.*;
Serialクラスのコンストラクタ
■ Serial(parent)■ Serial(parent, baudRate)
■ Serial(parent, portName)
■ Serial(parent, portName, baudRate)
第一引数parentは、Serialオブジェクトと通信するプログラム(スケッチ)で通常、thisを使います。
baudRateは通信速度で、デフォルトは9600。
portNameはポート番号を表す文字列を指定します(デフォルトは"COM1")。
【例】Serial myPort; String name = Serial.list()[0]; myPort = new Serial(this, name, 9600);Serial.list()についてはSerialクラスのlist()メソッドを参照。
Serialクラスの主なメソッド
■ int available()読めるデータのバイト数を返します。戻り値が0より大きければ、データが使える(読める)ことを意味します。
■ int read()
次の1バイトを読んで、0-255の間の値を返します。読めるバイトがないと-1を返しますが、読む前にavailable()を使って調べることで、この事態は避けるようにしてください。
【例】if (myPort.available() > 0) { //データがあるか調べる int val = myPort.read(); //読む println(val); }
■ String[] list()
使用可能なシリアルポートのリストを返します。
Serialクラスのコンストラクタの引数には、ポート名を指定する必要がありますが、このメソッドが返すリストの中身をprintArray()を使って表示することで、ポートの名前を確認できます。
【例】void setup(){ //このようにsetup()の中でポート名を確認する printArray(Serial.list()); }リストの先頭が使うポートであれば、Serial.list()[0]をコンストラクタのポート名として指定します。
【例】Serial myPort; String name = Serial.list()[0]; //リストの先頭が使用するポート名 myPort = new Serial(this, name, 9600);
SerialEvent() 関数によるイベント処理
SerialEvent()関数は、シリアルポートにデータが来た時に実行される関数です。引数は新しいデータが来たポートの名前です。【文法】void serialEvent(Serial whichPort) { 処理 }マウスのイベント処理と同様で、シリアル通信でデータが来た時に、この関数に定義しておいた処理が実行されます。
Serialクラスのbuffer()メソッドを使って決まった数のデータ要素が読まれた後、あるいはbufferUntil()メソッドを使って特定の文字が読まれた後に、この関数が実行されるように設定することもできます。