外部インタフェース/API    

データの読み込み

本節では、シリアルポートデバイスからのデータの読み込みについて3つの部分に分けて説明します。

データの読み込みに関連する関数は、以下の通りです。

表 8-7: データの読み込みに関連する関数 
関数名
説明
fgetl
デバイスからテキストを1行読み込み、ターミネータを破棄します。
fgets
デバイスからテキストを1行読み込み、ターミネータを含めます。
fread
デバイスからバイナリデータを読み込みます。
fscanf
デバイスからデータを読み込み、テキストとして書式化します。
readasync
データをデバイスから非同期的に読み込みます。
stopasync
非同期読み込みと書き出し操作を終了します。

データの読み込みに関連するプロパティは、以下の通りです。

表 8-8: データの読み込みに関連するプロパティ 
プロパティ名
説明
BytesAvailable
入力バッファ内で利用可能なバイト数を示します。
InputBufferSize
入力バッファのサイズをバイト単位で指定します。
ReadAsyncMode
同期読み込み操作が連続かマニュアルかを指定します。
Timeout
読み込みまたは書き込み操作を完了する待ち時間を指定します。
TransferStatus
進行中の非同期読み込みまたは書き出し操作を示します。
ValuesReceived
デバイスから読み込む値の総数を示します。

入力バッファとデータフロー

入力バッファは、デバイスから読み込まれるデータを格納するために、シリアルポートオブジェクトによって割り当てられるコンピュータメモリです。デバイスからデータを読み込む際に、データフローはつぎの2つのステップに従います。

  1. デバイスから読み込まれるデータは、入力バッファに格納されます。
  2. 入力バッファ内のデータは、読み込み関数で指定されたMATLAB変数に出力されます。

InputBufferSizeプロパティは、入力バッファ内に格納可能な最大バイト数を指定します。BytesAvailableプロパティは、入力バッファから現在読み込み可能なバイト数を示します。これらのプロパティのデフォルト値は、以下のように与えられます。

入力バッファの容量以上のデータを読み込もうとする場合は、エラーが出力され、データは読み込まれません。

たとえば、関数fscanfを使ってTDS 210オシロスコープに書き出された*IDN?コマンドのテキストベースの応答を読み込みます。下記のように、テキストデータは、最初にシリアルポートから入力バッファに読み込まれます。

与えられた読み込み操作に対して、デバイスから出力されたバイト数がわからない場合があります。そのため、シリアルポートオブジェクトに接続する前にInputBufferSizeプロパティを十分な大きさの値に設定する必要があります。

下記のように、データは入力バッファに格納された後で、fscanfによって指定された出力変数に送信されます。

テキストデータの読み込み

関数fgetl, fgets, fscanfを使ってデバイスからデータを読み込み、データをテキストとして書式化することができます。

たとえば、オシロスコープに対する識別情報を出力したいと仮定します。これは、*IDN?コマンドを機器に書き出して、コマンドの結果を読み込む必要があります。

デフォルトでは、多くのシリアルポートデバイスから出力したデータはテキストベースなので、fscanf%cフォーマットを使ってデータを読み込みます。しかし、fscanfリファレンスページで説明するように、その他の多くのフォーマットを指定することが可能です。

デバイスから読み込まれる値の数(ターミネータを含む)をValuesReceivedプロパティを使って確認することができます。

同期と非同期の読み込み操作   読み込み操作が同期かあるいは非同期であるかをReadAsyncModeプロパティを使って指定します。ReadAsyncModeは、continuousまたはmanualに設定することができます。

ReadAsyncModecontinuous(デフォルト値)の場合、シリアルポートオブジェクトは、データが読み込み可能かどうかを決定するために、デバイスに連続的に問い合わせます。データが読み込み可能の場合は、入力バッファに非同期的に格納されます。データを入力バッファからMATLABへ送信するために、fgetlまたはfscanfのような同期(blocking)読み込み関数を使います。データが入力バッファで読み込み可能の場合は、これらの関数は素早く出力します。

ReadAsyncModemanualの場合、シリアルポートオブジェクトは、データが読み込み可能かどうかを決定するために連続的にデバイスに問い合わせません。その代わりに、読み込み関数を実行して入力バッファにマニュアルで入力しなければなりません。データを非同期的に読み込むには、関数readasyncを使います。その後、同期読み込み関数を使ってデータを入力バッファからMATLABに送信します。

非同期操作は、MATLABコマンドラインへのアクセスをブロックしません。さらに、非同期読み込み操作の進行中には、以下を行うことができます。

どの非同期操作が進行中かをTransferStatusプロパティを使って決定することができます。非同期操作が進行中でない場合は、TransferStatusidleです。

fscanfによる読み込み操作の終了の規則   fscanfを使った読み込み操作は、以下が行われるときまでMATLABコマンドラインへのアクセスをブロックします。

バイナリデータの読み込み

バイナリデータをデバイスから読み込むためには、関数freadを使います。バイナリデータを読み込むことは、数値をMATLABに出力することを意味します。

たとえば、カーソルを出力し、オシロスコープに対する設定を表示したいとします。これは、CURSOR?およびDISPLAY?コマンドを機器に書き出し、それらのコマンドの結果を読み込む必要があります。

ReadAsyncModeプロパティに対するデフォルト値はcontinuousなので、データはデバイスから読み込み可能になるとすぐに入力バッファに非同期的に出力されます。BytesAvailableプロパティを使って読み込まれる値の数を調べることができます。

同期読み込み関数を使ってMATLABにデータを出力することができます。しかし、fgetl, fgets, fscanfを利用する場合は、入力バッファに2つのターミネータが格納されるため、関数を2回実行する必要があります。freadを利用する場合は、すべてのデータを1回の関数呼び出しでMATLABに出力することができます。

デフォルトでは、freadは数値を倍精度配列に出力します。しかし、freadリファレンスページで説明するように他の多くのフォーマットを指定することが可能です。MATLAB関数charを使って数値データをテキストに変換することができます。

同期および非同期の読み込み操作に関する詳しい情報は、テキストデータの読み込みを参照してください。読み込み操作を終了するためにfreadで用いる規則については、リファレンスページを参照してください。


 データの書き出し 例題: テキストデータの書き出しと読み込み