Links

送信

単純ネットワークでの送信手続きは、tsTxDataApp 構造体を確保し、この構造体に送信に必要な情報を格納します。
  1. 1.
    ローカル変数として tsTxDataApp 構造体を確保し、構造体全体をゼロクリアする。
  2. 2.
    送信したいデータを .auData にコピーする(ペイロード)。
  3. 3.
    ペイロードの格納バイト数を .u8Len に格納する。
  4. 4.
    .u32DstAddr を格納する(宛先)
  5. 5.
    .u32SrcAddr を格納する(送り元のアドレス)
  6. 6.
    その他送信オプションを指定します。
  7. 7.
    ToCoNet_bMacTxReq() を実行します。
  8. 8.
    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; // 失敗
}
}
S_OCTET() S_BE_WORD() S_BE_DWORD() マクロは、uint8 *q をペイロード格納領域のポインタとして宣言しておいた時に使う 1,2,4 バイト格納マクロです。
最終更新 6mo ago