外部インタフェース/API | ![]() ![]() |
データの読み込み
本節では、シリアルポートデバイスからのデータの読み込みについて3つの部分に分けて説明します。
関数名 |
説明 |
fgetl |
デバイスからテキストを1行読み込み、ターミネータを破棄します。 |
fgets |
デバイスからテキストを1行読み込み、ターミネータを含めます。 |
fread |
デバイスからバイナリデータを読み込みます。 |
fscanf |
デバイスからデータを読み込み、テキストとして書式化します。 |
readasync |
データをデバイスから非同期的に読み込みます。 |
stopasync |
非同期読み込みと書き出し操作を終了します。 |
プロパティ名 |
説明 |
BytesAvailable |
入力バッファ内で利用可能なバイト数を示します。 |
InputBufferSize |
入力バッファのサイズをバイト単位で指定します。 |
ReadAsyncMode |
同期読み込み操作が連続かマニュアルかを指定します。 |
Timeout |
読み込みまたは書き込み操作を完了する待ち時間を指定します。 |
TransferStatus |
進行中の非同期読み込みまたは書き出し操作を示します。 |
ValuesReceived |
デバイスから読み込む値の総数を示します。 |
入力バッファとデータフロー
入力バッファは、デバイスから読み込まれるデータを格納するために、シリアルポートオブジェクトによって割り当てられるコンピュータメモリです。デバイスからデータを読み込む際に、データフローはつぎの2つのステップに従います。
InputBufferSize
プロパティは、入力バッファ内に格納可能な最大バイト数を指定します。BytesAvailable
プロパティは、入力バッファから現在読み込み可能なバイト数を示します。これらのプロパティのデフォルト値は、以下のように与えられます。
s = serial('COM1');
get(s,{'InputBufferSize','BytesAvailable'})
ans =
[512] [0]
入力バッファの容量以上のデータを読み込もうとする場合は、エラーが出力され、データは読み込まれません。
たとえば、関数fscanf
を使ってTDS 210オシロスコープに書き出された*IDN?
コマンドのテキストベースの応答を読み込みます。下記のように、テキストデータは、最初にシリアルポートから入力バッファに読み込まれます。
与えられた読み込み操作に対して、デバイスから出力されたバイト数がわからない場合があります。そのため、シリアルポートオブジェクトに接続する前にInputBufferSize
プロパティを十分な大きさの値に設定する必要があります。
下記のように、データは入力バッファに格納された後で、fscanf
によって指定された出力変数に送信されます。
テキストデータの読み込み
関数fgetl
, fgets
, fscanf
を使ってデバイスからデータを読み込み、データをテキストとして書式化することができます。
たとえば、オシロスコープに対する識別情報を出力したいと仮定します。これは、*IDN?
コマンドを機器に書き出して、コマンドの結果を読み込む必要があります。
s = serial('COM1'); fopen(s) fprintf(s,'*IDN?') out = fscanf(s) out = TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04
デフォルトでは、多くのシリアルポートデバイスから出力したデータはテキストベースなので、fscanf
は%c
フォーマットを使ってデータを読み込みます。しかし、fscanf
リファレンスページで説明するように、その他の多くのフォーマットを指定することが可能です。
デバイスから読み込まれる値の数(ターミネータを含む)をValuesReceived
プロパティを使って確認することができます。
s.ValuesReceived ans = 56
同期と非同期の読み込み操作 読み込み操作が同期かあるいは非同期であるかをReadAsyncMode
プロパティを使って指定します。ReadAsyncMode
は、continuous
またはmanual
に設定することができます。
ReadAsyncMode
がcontinuous
(デフォルト値)の場合、シリアルポートオブジェクトは、データが読み込み可能かどうかを決定するために、デバイスに連続的に問い合わせます。データが読み込み可能の場合は、入力バッファに非同期的に格納されます。データを入力バッファからMATLABへ送信するために、fgetl
またはfscanf
のような同期(blocking)読み込み関数を使います。データが入力バッファで読み込み可能の場合は、これらの関数は素早く出力します。
s.ReadAsyncMode = 'continuous'; fprintf(s,'*IDN?') s.BytesAvailable ans = 56 out = fscanf(s);
ReadAsyncMode
がmanual
の場合、シリアルポートオブジェクトは、データが読み込み可能かどうかを決定するために連続的にデバイスに問い合わせません。その代わりに、読み込み関数を実行して入力バッファにマニュアルで入力しなければなりません。データを非同期的に読み込むには、関数readasync
を使います。その後、同期読み込み関数を使ってデータを入力バッファからMATLABに送信します。
s.ReadAsyncMode = 'manual'; fprintf(s,'*IDN?') s.BytesAvailable ans = 0 readasync(s) s.BytesAvailable ans = 56 out = fscanf(s);
非同期操作は、MATLABコマンドラインへのアクセスをブロックしません。さらに、非同期読み込み操作の進行中には、以下を行うことができます。
どの非同期操作が進行中かをTransferStatus
プロパティを使って決定することができます。非同期操作が進行中でない場合は、TransferStatus
はidle
です。
s.TransferStatus ans = idle
fscanfによる読み込み操作の終了の規則 fscanf
を使った読み込み操作は、以下が行われるときまでMATLABコマンドラインへのアクセスをブロックします。
Terminator
プロパティで指定されたターミネータが読み込まれるまで。Timeout
プロパティで指定された時間が経過するまで。バイナリデータの読み込み
バイナリデータをデバイスから読み込むためには、関数fread
を使います。バイナリデータを読み込むことは、数値をMATLABに出力することを意味します。
たとえば、カーソルを出力し、オシロスコープに対する設定を表示したいとします。これは、CURSOR?
およびDISPLAY?
コマンドを機器に書き出し、それらのコマンドの結果を読み込む必要があります。
s = serial('COM1');fopen(s)
fprintf(s,'CURSOR?')
fprintf(s,'DISPLAY?')
ReadAsyncMode
プロパティに対するデフォルト値はcontinuous
なので、データはデバイスから読み込み可能になるとすぐに入力バッファに非同期的に出力されます。BytesAvailableプロパティを使って読み込まれる値の数を調べることができます。
s.BytesAvailable ans = 69
同期読み込み関数を使ってMATLABにデータを出力することができます。しかし、fgetl
, fgets
, fscanf
を利用する場合は、入力バッファに2つのターミネータが格納されるため、関数を2回実行する必要があります。fread
を利用する場合は、すべてのデータを1回の関数呼び出しでMATLABに出力することができます。
out = fread(s,69);
デフォルトでは、fread
は数値を倍精度配列に出力します。しかし、fread
リファレンスページで説明するように他の多くのフォーマットを指定することが可能です。MATLAB関数char
を使って数値データをテキストに変換することができます。
val = char(out)' val = HBARS;CH1;SECONDS;-1.0E-3;1.0E-3;VOLTS;-6.56E-1;6.24E-1 YT;DOTS;0;45
同期および非同期の読み込み操作に関する詳しい情報は、テキストデータの読み込みを参照してください。読み込み操作を終了するためにfread
で用いる規則については、リファレンスページを参照してください。
![]() | データの書き出し | 例題: テキストデータの書き出しと読み込み | ![]() |