送信
単純ネットワークでの送信手続きは、tsTxDataApp 構造体を確保し、この構造体に送信に必要な情報を格納します。
ローカル変数として tsTxDataApp 構造体を確保し、構造体全体をゼロクリアする。
送信したいデータを .auData にコピーする(ペイロード)。
ペイロードの格納バイト数を .u8Len に格納する。
.u32DstAddr を格納する(宛先)
.u32SrcAddr を格納する(送り元のアドレス)
その他送信オプションを指定します。
ToCoNet_bMacTxReq() を実行します。
TWENET 内での送信処理が終了すると cbToCoNet_TxEvent() が実行されます。
完了イベントが消滅することは例外的ですが、タイムアウトを設け例外処理するようにしてください。 tsTxDataApp 構造体中で遅延や再送遅延が極端に長く設定されていないなら、通常 100ms も必要としません。
サンプルコード
static int16 i16TransmitIoData() {
tsTxDataApp sTx;
memset(&sTx, 0, sizeof(sTx)); // ゼロクリア
uint8 *q = sTx.auData;
// ペイロードを構成
S_OCTET(sAppData.u8AppIdentifier);
S_BE_WORD(sAppData.sIOData_now.u16Volt);
...
// 送信
sTx.u8Len = q - sTx.auData; // パケット長
sTx.u8Cmd = TOCONET_PACKET_CMD_APP_USER_IO_DATA; // パケット種別
// 送信する
sTx.u32DstAddr = TOCONET_MAC_ADDR_BROADCAST; // ブロードキャスト
sTx.u8Retry = 0x81; // 1回再送
// フレームカウントとコールバック識別子の指定
sAppData.u16TxFrame++;
sTx.u8Seq = (sAppData.u16TxFrame & 0xFF);
sTx.u8CbId = sTx.u8Seq;
/* MAC モードでは細かい指定が可能 */
sTx.bAckReq = FALSE;
sTx.u32SrcAddr = sToCoNet_AppContext.u16ShortAddress;
sTx.u16RetryDur = 4; // 再送間隔[ms]
sTx.u16DelayMax = 16; // 送信開始タイミングにブレを作る(最大16ms)
// 送信API
if (ToCoNet_bMacTxReq(&sTx)) {
// 成功(処理が終わると cbToCoNet_vTxEvent() が発生する
return sTx.u8CbId; // 成功
} else {
// 失敗
return -1; // 失敗
}
}
最終更新