送信をするには?

[マスタ側]

BYTE Srbuf[10];

 

Cmd[0] = 2;                        //リスナの数+1(ここではリスナは1台)

Cmd[1] = TalkerAdrs;               //データを送信する機器アドレス(自分自身のアドレス)

Cmd[2] = ListenerAdrs;             //データを受信する機器アドレス

Ret = GpTalk(Cmd, Srlen, Srbuf);   //Srlen = データの長さ:Srbuf = データが格納されているバッファ

 

[スレーブ側]

例1:マスタからのトーカ指定を確認してから送信動作に入ります。
マスタと通信タイミングを一致させるために、こちらの実装を推奨します。

DWORD   Ret, SendLen, Cmd[10], TAreg;

char    SendBuf[10];

do{

    Ret = GpBoardstsEx(0, 0x13, &TAreg); // トーカ状態を取得

    if(Ret != 0) return;                 // 戻り値チェック

}while(TAreg == 0);                      // トーカ指定されるまでループ

Cmd[0] = 0;                              // マルチラインメッセージ無し

strcpy(SendBuf, "Hello" );               // 送信データ「Hello」を設定

SendLen = strlen(SendBuf);               // 送信データから送信文字数を取得

Ret = GpTalk(Cmd, SendLen, SendBuf);     // 送信

 

例2:マスタからのトーカ指定を確認せず、送信します。

BYTE Srbuf[10];

 

Cmd[0] = 0;                        //マルチラインメッセージは無いのでこのように記述します。

Ret = GpTalk(Cmd, Srlen, Srbuf);   //Srlen = データの長さ:Srbuf = データが格納されているバッファ

 

 

説明

送信を行うには大変なプログラムを書かなければいけないと思うかもしれませんが、実際には数行で済んでしまいます。
流れとしてはマスタ、リスナの指定、送信データは何かを記述するだけです。

まずは配列Cmdを作成します。

Cmd[0] = 2;               //リスナの数+1(ここではリスナは1台)

Cmd[1] = TalkerAdrs;      //データを送信する機器アドレス(自分自身のアドレス)

Cmd[2] = ListenerAdrs;    //データを受信する機器アドレス

もしリスナが2台であればCmd[3]を追加し、Cmd[0] = 3にすればいいことになります。

次に送信部分ですがGpTalk関数を使います。
GpTalk関数の記述は次のようになっています。

GpTalk(Cmd, Srlen, Srbuf);

はじめのRetはGpTalkの戻り値が入ってきます。
GpTalk関数の中は1番目の引数では配列Cmdの先頭のアドレスを指定します。

Srlenの値はSrbufに代入したデータ数(バイト数)を超えないように注意してください。
超えてしまった場合には相手機器に対し無効なデータを送ってしまったり、プログラムが不測の動作をする場合があります。

 

マスタ側に関する注意点:

スレーブ機器が測定中などのタイミングでマスタ側から送受信しようとすると正常に通信処理が実施できない可能性があります。
一般的にスレーブ機器では、時間のかかる処理が終了した場合にマスタに対してSRQ要求を実施する機能が実装されています。

その場合、マスタ側は、SRQ要求を待ってから送受信することを推奨します。