サンプリング用バッファの取り扱い方法

ここでは、入力転送(サンプリング)を行う上での代表的なパターンにおけるバッファと関数の使用方法について説明します。


パターン1:有限データ数、データをサンプリング後に取得

1回転送を行い、データをサンプリング終了後に取得する場合です。

 
                     処理

 この場合、バッファサイズは欲しいデータ数のサイズ以上用意する必要があります。

バッファの繰り返し指定は、CntSamplingSetBuffer関数にて「CNTS_WRITE_ONCE」を指定します。
データ入力個数が決まっている場合には、CntSetSamplingStopTrigger関数にてストップ条件を「CNTS_STOP_NUM」 に指定して、CntSetSamplingStopNumber 関数を使用し指定個数で転送を完了するようにしてください。

転送を開始した後は、完了メッセージを待つか、またはステータス取得関数でステータスビットCNTS_STATUS_BMSTOP が立つまで、SleepなどのWin32APIでウェイトを入れながらループで待ちます。



パターン2:有限データ数、データをサンプリングしながら取得

1回転送を行い、データをサンプリング中に取得して、使用する場合です。

 
   処理                      処理                   処理

 この場合、バッファサイズは欲しいデータ数のサイズ以上用意する必要があります。

バッファの繰り返し指定は、CntSamplingSetBuffer関数にて「CNTS_WRITE_ONCE」 を指定します。
データ入力個数が決まっている場合には、CntSetSamplingStopTrigger関数にてストップ条件を「CNTS_STOP_NUM」 に指定して、CntSetSamplingStopNumber 関数を使用し指定個数で転送を完了するようにしてください。

転送中は、転送個数取得関数(CntGetSamplingCount)でデータの入っている位置を確かめながら、処理を行います。
途中、ステータス関数でのチェックを行い、エラーなどで終了していないかを確認しながら処理を行ってください。
システムに負荷をかけないためには、ループ中でSleepなどのWin32APIでウェイトを入れてください。



パターン3:無限データ数、全てのデータを取得(無限回転送)

無限回転送を行い、一定個数データを取得したら、ファイルにデータを格納するなどの処理を行う場合です。
無限回転送は、CntSamplingSetBuffer関数にて「CNTS_WRITE_RING」を指定します。

 
   処理                     処理                    処理

転送個数の確認は、指定個数転送完了メッセージを使用するか、システムタイマ等で転送個数取得関数(CntGetSamplingCount)を使用して行います。

アプリケーションはリードポインタからライトポインタまで処理をシステムタイマまたはイベントメッセージにより周期的に行います。

この場合注意しなければならないのは、どこまでデータを処理したのかを示すリードポインタと、バッファのどこまでデータが書かれているかを示すライトポインタをユーザープログラムで管理しなければならない点です。

リードポインタ/ライトポインタは、バッファサイズまで転送すると、折り返して0に戻るカウンタです。
ライトポインタは、CntGetSamplingWritePointer を使用して求めます。
リードポインタは、前回データ処理時のライトポインタです。



パターン4:無限データ数、ライトポインタを取得して、任意の箇所から任意のデータ数を取得

無限回転送を行い、ある任意の条件が成立したら任意の箇所から任意のデータ数を取得するという場合です。
無限回転送は、CntSamplingSetBuffer関数にて「CNTS_WRITE_RING」を指定します。


この場合も、リードポインタとライトポインタの管理が必要になります。

パターン3を参考にしてください。