RF modules

E220-900T22S(JP) 通信プロトコル設計上で、受信後にACKを返送する疑似コード(ライブラリを使用した例)


通信プロトコル設計上で、送信側がデータを送信後、正常受信した受信側から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;
}

TOP