ibnotifyの使用例
int __stdcall MyCallback (int LocalUd, unsigned long LocalIbsta, unsigned long LocalIberr, unsigned long LocalIbcnt, void *RefData);
int ReadingsTaken = 0;
float Readings[1000];
BOOL DeviceError = FALSE;
char expectedResponse = 0x43;
int main()
{
int ud;
// 固有の識別子をデバイスに割り当て、変数udに格納します。利用可能な
// デバイスをibdevが開き、GPIB0にアクセスするためにプライマリアドレス1、
// セカンダリアドレス0、タイムアウト10秒を設定します。
// E0Iラインによる終了メッセージを有効にして、EOSモードを無効にします。
// udが0より小さい場合は、呼び出しが失敗したというエラーメッセージを表示し、
// プログラムを終了します。
ud = ibdev (0, // デバイスが接続されたボード番号
1, //GPIBデバイスのプライマリアドレス
0, //GPIBデバイスのセカンダリアドレス
T10s, // タイムアウト10秒
1, //EOTモードON
0); //EOSモード解除
if (ud < 0) {
printf ("ibdevに失敗しました。\n");
return 0;
}
// データを送信するように、デバイスに対して要求します。ERRビットがIbstaに
// 設定されていたら、コールに失敗したというエラーメッセージを表示して、
// プログラムを終了します。
ibwrt (ud, "SEND DATA", 9L);
if (Ibsta() & ERR) {
printf ("デバイスへ書き込みできません。\n");
return 0;
}
// RQSビットに対する、非同期のイベント通知の設定を行います。
ibnotify (ud, RQS, MyCallback, NULL);
if (Ibsta() & ERR) {
printf ("ibnotifyコールに失敗しました。\n");
return 0;
}
while ((ReadingsTaken < 1000) && !(DeviceError)) {
// アプリケーションが有効な処理をします。たとえば、デバイスの
// 読み取り処理などです。
}
// イベント通知を解除
ibnotify (ud, 0, NULL, NULL);
// ibonl関数をコールして、ハードウェアおよびソフトウェアを無効にします。
ibonl (ud, 0);
return 1;
}
int __stdcall MyCallback (int LocalUd, unsigned long LocalIbsta, unsigned long LocalIberr,
unsigned long LocalIbcnt, void *RefData)
{
char SpollByte;
char ReadBuffer[40];
// LocalIbstaにERRビットが設定されていたら、エラーメッセージを表示して
// 戻ります。
if (LocalIbsta & ERR) {
printf("GPIBエラー%dが発生しました。これ以上、コールバックはありません。\n",
LocalIberr);
DeviceError = TRUE;
return 0;
}
// Read the serial poll byte from the device.ERRビットが
// LocalIbstaに設定されている場合、エラーメッセージを表示して戻ります。
LocalIbsta = ibrsp (LocalUd, &SpollByte);
if (LocalIbsta & ERR) {
printf("ibrspに失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
}
// 返されたステータスバイトが予期された応答であれば、デバイスには
// 送信する有効データがあります。ない場合は失敗状態なので、
// そのことを知らせます。
if (SpollByte != expectedResponse) {
printf ("デバイスは無効な応答を返しました。Status byte = 0x%x\n",
SpollByte);
DeviceError = TRUE;
return 0;
}
// デバイスからデータを読み取ります。ERRビットがLocalIbstaに設定されている場合、
// エラーメッセージを表示して戻ります。
LocalIbsta = ibrd (LocalUd, ReadBuffer, 40L);
if (LocalIbsta & ERR) {
printf("ibrd に失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
}
// ibrdによって返された文字列は、Ibcntlのバイトカウント
// により指定された長さを持つバイナリ文字列です。ただし、
// 多くのGPIB計測器は、ASCIIデータ文字列を返します。この
// サンプルもそうであると仮定します。このため、NULL文字
// を受信データの終わりに追加し、printf()関数を使用して
// ASCIIデータを表示することができます。以下のコードは、
// それを示しています。
ReadBuffer[LocalIbcnt()] = '\0';
// データを数値に変換します。
sscanf (ReadBuffer, "%f", &Readings[ReadingsTaken]);
// データを表示します。
Printf ("Reading : %f\n", Readings [ReadingsTaken]);
ReadingsTaken += 1;
if (ReadingsTaken >= 1000) {
return 0;
}
else {
// データを送信するようにデバイスに対して要求し、RQSに対するコールバック
// を再設定します。
LocalIbsta = ibwrt (LocalUd, "SEND DATA", 9L);
if (LocalIbsta & ERR) {
printf("ibwrtに失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
}
else {
return RQS;
}
}
}
関連項目: