入力転送時のバッファ使用方法について

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


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

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


                  処理

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

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

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


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

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


   処理     処理    処理

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

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

転送中は、指定個数転送完了通知(DioDmSetCountEvent)と、
転送個数取得関数(DioDmGetCount)でデータの入っている位置を確かめながら処理を行なう必要があります。


パターン3:無限データ数、全てのデータを取得

無限転送を行ない、一定個数データを取得したら、ファイルにデータを格納するなどの処理を行なう場合です。


   処理     処理    処理

転送個数の確認は、指定個数転送完了メッセージを使用するか、システムタイマ等で転送個数取得関数を使用して行ないます。
アプリケーションはリードポインタからライトポインタまで処理の処理をシステムタイマまたはイベントメッセージにより周期的に行ないます。

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

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

リードポインタは、前回データ処理時のライトポインタです。


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


無限転送を行ない、ある任意の条件が成立したら任意の箇所から任意のデータ数を取得する場合です。

この場合も、リードポインタとライトポインタの管理が必要となります。
パターン3を参考にしてください。