

現在、SpresenseとW5500-etherを使用してカメラモジュールで撮影した映像をUDP通信にて送信するシステムをArduino
IDEにて開発しています。  
そして、その前段階としてuint8_t配列のデータを送信しようとしたのですが、データ量が1472バイトを超過すると、1472バイト以降のデータを送信することができません。通常のEthernetを経由したUDP通信の場合、1500バイトを超えると自動的にパケットが分割されて送信されるといった認識でしたが、Spresenseにはそのような機能はないのでしょうか？  
また、この問題を回避するために配列を1400バイトごとに分割して送信したのですが、動作周期が目標の30Hzに届かず、また途中でSpresense側の動作が停止してしまいます。  
そのため、可能であれば通常のUDP通信のように1回の通信で送信したいのですが、何か方法はありませんでしょうか？  
以下にコードを記載しますので、ご参照ください。長くなってしまい申し訳ありませんが、よろしくお願いします。

[code]

    #include <stdio.h> 
    #include <Camera.h>
    // ----------------------------------------------------------------------- //
    //Add-onボード用インクルード
    #include <SPI.h>
    #include "src/Ethernet.h"
    #include "src/M24C64.h"
    #include "src/EthernetUdp.h"
    #define UDP_TX_PACKET_MAX_SIZE 5000
    // ----------------------------------------------------------------------- //
    
    // ----------------------------------------------------------------------- //
    //Add-onボード搭載EEPROMへのアクセス用
    M24C64 eep;
    // ----------------------------------------------------------------------- //
    
    // ----------------------------------------------------------------------- //
    //Add-onボード用のSPIはSPI5となるため、本ライブラリ使用時は以下の定義が必要(socket.cpp内にて使用)
    //参考：https://developer.sony.com/develop/spresense/docs/arduino_developer_guide_ja.html#_spi_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA
    #define USE_SPRESENSE_SPI5
    // ----------------------------------------------------------------------- //
    #define data_size 5000
    uint8_t data[data_size];
    
    byte mac[] = {
      ****, ****, ****, ****, ****, ****
    };
    IPAddress ip(***, ***, ***, ***);
    unsigned int localPort = 8888;
    
    IPAddress remote(***, ***, ***, ***);
    int pClocalPort = 8888;
    
    EthernetUDP Udp;
    
    bool isI2C(uint8_t address)
    {
      Wire.beginTransmission(address);
      if (Wire.endTransmission() == 0)
      {
        return true;
      }
      return false;
    }
    
    void setup() {
    ////////////////////////////////////////////////////////////////////////////////
      // W5500-Ether用の初期化方法
      digitalWrite(21, LOW);//W5500_Eth RESET# = HIGH
      delay(500);
      digitalWrite(21, HIGH);//W5500_Eth RESET# = HIGH
      Ethernet.init(19);// use I2S_DIN pin for W5500 CS pin
      // W5500-Ether用のMACアドレス取得処理
      // I2C device scan
      Serial.print(F("I2C Devices(0x) : "));
      Wire.begin();
      //I2C spec. have reserved address!! these scanning escape it address.
      for (uint8_t ad = 0x08; ad < 0x77; ad++)
      {
        if (isI2C(ad))
        {
          Serial.print(ad, HEX);
          Serial.write(' ');
        }
      }
      Serial.write('\n');
      //EEPROM MAC ADDRESS read
      eep.init(0x57);
      Serial.println("MAC read from on board eeprom.");
      for(int i=0;i<6;i++)
      {
        mac[i] = eep.read(i);
        Serial.print(mac[i],HEX);
        Serial.print(":");
      }
      Serial.println("");
    //////////////////////////////////////////////////////////////////////////////////
    
      Serial.begin(115200);
      Serial.println("W5500 reset done.");
      
      Ethernet.begin(mac, ip);
      
      if (Ethernet.hardwareStatus() == EthernetNoHardware) {
        while (true) {
          delay(1);
        }
      }
      if (Ethernet.linkStatus() == LinkOFF) {
      }
    
      for(int a = 0; a < data_size; a++){
        data[a] = 10;
      }
      Udp.begin(localPort);
    }
    
    void loop() {
      Udp.beginPacket(remote,pClocalPort);
      Udp.write(data, data_size);
      Udp.endPacket();
      delay(33);
    }
    
[/code]


CC BY-SA 4.0
2022-07-12T11:13:36.433
89933
2022-07-12T21:12:56.470
53146
question
spresense arduino
SpresenseとEhernetモジュールW5500-etherを用いたUDP通信にて大容量のデータが送信できません