BYTE Srbuf[100]; //受信バッファ
Cmd[0] = 2; //リスナの数+1(ここではリスナは1台)
Cmd[1] = TalkerAdrs; //データを送信する機器アドレス
Cmd[2] = ListenerAdrs; //データを受信する機器アドレス(自分自身のアドレス)
Ret = GpListen(Cmd, &Srlen, Srbuf); //Srlen = データの長さ:Srbuf = データが格納されているバッファ
例1:マスタからのトーカ指定を確認してから受信動作に入ります。
マスタと通信タイミングを一致させるために、こちらの実装を推奨します。
DWORD Ret, RecLen, Cmd[10], LAreg;
char RecBuf[10];
do{
Ret = GpBoardstsEx(0, 0x14, &LAreg); // リスナ状態を取得
if(Ret != 0) return; // 戻り値チェック
}while(LAreg == 0); // リスナ指定されるまでループ
Cmd[0] = 0; // マルチラインメッセージ無し
RecLen = 10; // 受信データ長
Ret = GpListen(Cmd, &RecLen, RecBuf); // 受信
例2:マスタからのトーカ指定を確認せず、受信します。
BYTE Srbuf[100]; //受信バッファ
Cmd[0] = 0; //マルチラインメッセージは指定できないのでこのように記述します。
Ret = GpListen(Cmd, &Srlen, Srbuf); //Srlen = データの長さ:Srbuf = データが格納されているバッファ
受信するプログラムは送信する部分とほとんど同じです。
使う関数はGpListen関数を使用します。
注意点も同じでSrlenの値はSrbufに代入したデータ数を超えてはいけません。
しかし受信ではSrbufの大きさを必ず指定しておかなければなりません。
尚、CheckRet関数はエラーをわかりやすくするために別に関数を作成してあります。
これは標準モジュールといわれるものにコードが書かれています。
この関数を標準モジュールとすることにより、汎用性を持たせてあります。
もしこの関数を他のプログラムにもって使用するのであれば、ファイルの追加で使用可能となります。(CheckRet関数のコードは「SubFunc.cpp」に入っています。)
スレーブ機器が測定中などのタイミングでマスタ側から送受信しようとすると正常に通信処理が実施できない可能性があります。
一般的にスレーブ機器では、時間のかかる処理が終了した場合にマスタに対してSRQ要求を実施する機能が実装されています。
その場合、マスタ側は、SRQ要求を待ってから送受信することを推奨します。