通信プロトコル設計上で、送信側がデータを送信後、正常受信した受信側からACKを返送する疑似コードです。
ダウンロード・サポート内のESP32・Arduino ライブラリを使用した例となります。
【疑似コードの説明】
送信側は送信パケットに自機アドレスとチャンネルを含めて送信。
受信側は送信側アドレスとチャンネル向けに、ACKパケットを、自機アドレス、チャンネルを含めてを送信。
送信側は、ACK受信の確認と同時に、受信側のアドレス、チャンネルも確認する。
//
//   ACK を利用した送受信の疑似コード
// 
//  @送信側 SendPacket()
//
//  @受信側 ReceivePacket()
// 
//--------------------------------------------------------
//
// 送信側 ブロードキャスト送信の場合の例
//
int SendPacket() {
 
  // ブロードキャスト送信のためのアドレス、チャンネルのセット
  
    config.target_address = 0xffff; // ブロードキャストアドレス
    config.target_channel = 0x00;   // チャンネルを0に
  // 送信パケットデータに自機アドレス、チャンネルをセット
    uint8_t IDENT = id;             // (必要なら)通信フォーマット上の任意の識別コード
    uint8_t ADDH = addr >> 8;       // 自機アドレスHigh
    uint8_t ADDL = addr & 0xff;     // 自機アドレスLow
    uint8_t CHANNEL = ch;           // 自機チャンネル
    send_data[0] = IDENT;           // 識別コードのセット
    send_data[1] = ADDH;            // 自機アドレスHigh のセット
    send_data[2] = ADDL;            // 自機アドレスLow のセット
    send_data[3] = CHANNEL;         // 自機チャンネルのセット
  // 送信データのセット
    send_data[] = データ;            // 送信データ長分のデータをセット
 // パケット送信
    SendFrame(struct LoRaConfigItem_t &config, uint8_t *send_data, int size);
  // ACK受信
    RecieveFrame(struct RecvFrameE220900T22SJP_t *recv_frame);
  // ACK受信チェック
    recv_frame[4] が ACK ?
  // ACKを送信したデバイスのアドレスを確認
    code = ACK受信 or NACK(フォーマットエラーなど)
  return code;
}
//--------------------------------------------------------
//
// 受信側 の例
//
int ReceivePacket() {
  // パケットの受信
  
    RecieveFrame(struct RecvFrameE220900T22SJP_t *recv_frame);
  // 通信フォーマット上のエラー有無チェック
    code = 結果;
  // 受信データから返信先アドレス、チャンネルを取得
  uint8_t TXADDRH = recv_frame[1];    // 返信先アドレスHigh
  uint8_t TXADDRL = recv_frame[2];    // 返信先アドレスLow
  uint8_t TXCHANNEL = recv_frame[3];  // 返信先チャンネル
  // 送信先アドレス,、チャンネルのセット
  
    config.target_address = (uint16_t)TXADDRH << 8 | (uint16_t)TXADDRL;
    config.target_channel = TXCHANNEL;
  // 返信データセット
    uint8_t IDENT = id_ack;            // 識別コード
    uint8_t ADDH = addr >> 8;          // 自機アドレスHigh
    uint8_t ADDL = addr & 0xff;        // 自機アドレスLow
    uint8_t CHANNEL = ch;              // 自機チャンネル
    send_data[0] = IDENT;              // (必要なら)識別コード
    send_data[1] = ADDH;               // 自機アドレスHigh
    send_data[2] = ADDL;               // 自機アドレスLow
    send_data[3] = CHANNEL;            // 自機チャンネル
  // code がエラーか否かで、ACK or NACKのセット
  
    if (code) で ACK or NACK
        send_data[4] = ACK or NACK;
 // パケット送信
    SendFrame(struct LoRaConfigItem_t &config, uint8_t *send_data, int size);
   return code;
}
