Arduino詳解その20です。前回の記事はこちらです。
シリアル通信の勘所
今回は、Arduinoでシリアル通信を使う場合の勘所を説明していきたいと思います。今まで数回に渡ってシリアル通信について説明していきましたがArduinoでシリアル通信をする際に使用するSerialオブジェクト(またはSoftSerial)は、独特のルールが有り、同時に様々な機能があるため使いこなすのにはコツがあります。ここに記述する内容は、特定の断りが無い場合Serial、SoftSerial両方で有効です。
データを受信する前
データを受信するには、事前に受信データがあることを把握して置かなければなりません。受信データがないときに受信を実行することは無駄となってしまいます。受信データの有無を確認して、あれば受信するという手順です。このときに使用するのがSerial.available()です。
・Serial.available()
Serial.begin()で使用開始したポートにある受信データのバイト数を返します。受信データがない場合は0を返します。if文などで使用すれば受信データがあるときのみデータの受信を実行します。
データを送信する前
データを送信する前にも、送信可能な状態かどうかを確認する必要がある場合があります。大量のデータを送信する場合などです。送信するデータは送信バッファに格納された後に順次送信されていきます。送信バッファを超えるデータを一度に送信することはできません。送信可能なデータ量を調べるには、Serial.availableForWrite()を使います。
・Serial.availableForWrite()
Serial.begin()で使用開始したポートで送信可能なデータのバイト数を返します。ちなみにArduinoUNOの場合、なにも送信しない状態で63(Serialの場合)となっていました。意外と少ないですね。実際の動作では、この値を超えたデータ(文字列)でも送信できるのですが、スケッチの処理スピードが遅くなることが考えられます。適度な大きさで送信しましょう。
尚、SoftSerialでも使用できるのですが0が返ってくるようです。
文字を通信するとき
シリアル通信で一番使用する通信は、おそらく文字通信だと思います。文字データを送信する際には、すでにご紹介したSerial.print()、Serial.println()を使用します。文字データを受信する場合にはSerial.readString()を使用します。
・Serial.readString()
Serial.begin()で使用開始したポートから受信した文字データをStringオブジェクトの形で返します(Stringオブジェクトについては次回ご紹介します)。タイムアウト(受信データが無くなって一定の時間が経過すること)になると終了です。
ところで、このタイムアウトが曲者でデフォルトで1秒と設定されています。このままで使用すると、受信するたびに1秒が経過することになり、スケッチの動作が緩慢になります。そこで、最初にタイムアウトの時間を短く設定しておくことをおすすめします。タイムアウトの設定は、以下で行います。100ミリ秒程度でいいでしょう。
・Serial.setTimeout()
Serial.begin()で使用開始したポートのタイムアウトの時間を設定します。カッコの中にタイムアウトの時間(ミリ秒)を記述することで設定できます。
他にも沢山の関数があるのですが、とりあえずこれだけ覚えていれば大体のことはできると思います。
Stringオブジェクト
以上、シリアル通信の勘所をまとめてみました。次回は今回少しだけ言及したStringオブジェクトについて説明しようと思います。文字データを扱うときに使うやつです。お楽しみに!!
hirocom777.hatenadiary.org