シリアル(RS232C)通信

今ではあまり見かけなくなりましたが、パソコン(Windows)のシリアルポート(RS232C)を介したハードウェア制御についての解説です。(興味のあるかたは、Arduinoとの通信1もご覧ください。またPTBのデモにあるDatarecordingFromSerialPortDemoも参考になるかと思います)

心理学の実験装置では、このシリアルポートを使ってパソコンからの制御を行ったり、データを取得したりするものがあります。

管理人は株式会社ナックイメージテクノロジー社のアイマークレコーダー(EMR-8B)を使って、眼球位置のデータをMatlab上で取得できることを確認しました。

以下ではシリアル通信を行うための方法を簡単に説明します。なおここで説明する内容はPTBに依存したものではなく、Matlabの関数のみを使用しています。

詳しくは help serial を参照するか、Matlabのヘルプの

External Interfaces → Serial Port I/O

を参照してください。

シリアルポートオブジェクトの作成

まず、シリアルポートオブジェクトを作成します。

このときに転送速度(ボーレート)などの値を同時に設定することができます。

例えばEMR-8Bでは次のような仕様になっています。

具体的には次のようにシリアルポートオブジェクトを作成します。

myserial = serial('COM1', 'BaudRate', 38400, 'Terminator', 'CR', 'FlowControl', 'hardware')

これによって、COM1に対して、ボーレートを38400、終端文字(終端子)をキャリッジリターン(CR)、フロー制御をハードウェアとしたシリアルポートオブジェクトが作られます。

データ長、ストップビット、パリティについてはなにも指定していませんが、それはEMRの仕様とプログラムのデフォルト値が一致しているからです。

get(myserial)

とすると、作成したオブジェクトのプロパティの値の一覧を見ることができます。プロパティが適切な値になっているかどうかを確認してください。

プロパティの値を変えたいときは次のようにします。

例えば、Timeoutプロパティを5に設定するときは、

set(myserial, 'Timeout', 5)

または

myserial.Timeout = 5

装置との接続

シリアルポートオブジェクトを作成した後に、次のようにしてポートを開き、オブジェクトと装置を接続します。

fopen(myserial)

適切に接続できているかは

myserial.Status

を実行することで分かります。

openとなれば成功です。

データの読み書き

データの読み込みはテキストモードであれば

fscanf

fgetl

fgets

などで行います。

バイナリモードであれば

freadを使います。

同様にテキストモードの書き込みは

fprintf

バイナリモードの書き込みは

fwrite

を使います。

(管理人はfscanf の動作確認しかできていません)

接続を終了する

次の順番で接続を終了します。

fclose(myserial)
delete(myserial)
clear myserial