Arduino shield crashes/stops after sending and receiving 50,000+ Udp packets


hi

i have ethernet shield on arduino due w5100 chip. arduino meant read udp (a packet size 76), send acknoledgement (28 bytes) meanwhile spaming udp packets (76 bytes), arduino work fine 50,000+ packets crash/stop. using packetsniffer see working (wireshark), , generating packets using c#.

here modified version of original send receive example problem occurs.

code: [select]
#include <spi.h>         // needed arduino versions later 0018
#include <ethernet.h>
#include <ethernetudp.h>         // udp library from: bjoern@cs.stanford.edu 12/30/2008


byte mac[] = { 0x90,0xa2,0xda,0x13,0xfb,0x6b };


unsigned int localport = 18865;

char packetbuffer[100];
byte  replybuffer[] = "acknowledged";
byte  replybuffer2[] = "aasdasdfasfasfa";

ethernetudp udp;

void setup() {
 serial.begin(57600);
 
 pinmode(4,output);
 digitalwrite(4,high);
 
   serial.println("initialize dhcp: ");
 if (ethernet.begin(mac)){
    serial.print("[success] ip: ");
    serial.println(ethernet.localip());
 }
 else
    serial.println("[failed]");
 udp.begin(localport);
 serial.println(udp_tx_packet_max_size);
}

void loop() {
 int packetsize = udp.parsepacket();
 if (packetsize)
 {
   udp.read(packetbuffer, 100);
   udp.beginpacket(ipaddress(my ip), 18007);
   udp.write(replybuffer, 28);
   udp.endpacket();
 }
 udp.beginpacket(ipaddress(my ip), 18008);
 udp.write(replybuffer2, 76);
 udp.endpacket();
}


here actual code decodes packet , other functions

code: [select]
#include <ethernetclient.h>
#include <ethernetserver.h>
#include <spi.h>         // needed arduino versions later 0018
#include <ethernet.h>
#include <ethernetudp.h>  

ethernetudp udp;
ethernetclient client;
typedef struct __attribute__((__packed__)) acknowledgement
{
 unsigned short majorack;
 unsigned short minorack;
 byte messagetypeack;
 byte channelack;
 unsigned short payloadlengthack;
 unsigned long idack;
 double datetimeack;
 byte sourceip1ack;
 byte sourceip2ack;
 byte sourceip3ack;
 byte sourceip4ack;
 signed short zeroes1ack;
 signed short zeroes2ack;
} acknowledgement;

typedef struct __attribute__((__packed__)) data
{
 unsigned short major;
 unsigned short minor;
 byte messagetype;
 byte channel;
 unsigned short payloadlength;
 unsigned long id;
 double datetime;
 byte sourceip1;
 byte sourceip2;
 byte sourceip3;
 byte sourceip4;
 signed short zeroes1;
 signed short zeroes2;
 byte payloadtype;
 byte pinnumber;
 byte digitalvalue;
 byte digitalpullupenable;
 signed short analogadcconversion;
 signed short zeroes3;
 char variablename;
 double analogvalue;
} data;

unsigned short majorversion = 2;//for functions
unsigned short minorversion = 0;
unsigned long idcountack = 1;
unsigned long idcount= 1;
double messagetimestampack = 0;
double messagetimestamp = 0;
byte timestampbuffack[8];
byte idbuffack[4];

byte majorbuffack[2];//for major , minor checks
unsigned short msgmajorversionack;
byte minorbuffack[2];
unsigned short msgminorversionack;

char variablenamebuff[32];

int = 1;//loop iteration
int count = 1;

void setup()
{
 serial.begin(57600);
 uint8_t mac[6] = {0x90, 0xa2, 0xda, 0x00, 0xfa, 0x7d};

 ethernet.begin(mac);
 udp.begin(18005);//listener port

 pinmode(4, output); //disable sd card
 digitalwrite(4, high);

 serial.print("localip: ");
 serial.println(ethernet.localip());
 serial.print("subnetmask: ");
 serial.println(ethernet.subnetmask());
 serial.print("gatewayip: ");
 serial.println(ethernet.gatewayip());
 serial.print("dnsserverip: ");
 serial.println(ethernet.dnsserverip());

}

void acknowledgementcreator () //function create , acknowledgement of 28 bytes
{
 acknowledgement* sentack = (acknowledgement*) malloc(sizeof(acknowledgement));//allocate memory
 sentack->majorack = majorversion;
 sentack->minorack = minorversion;
 sentack->messagetypeack = 2;
 sentack->channelack = 3;
 sentack->payloadlengthack = 36;
 sentack->idack = idcountack;
 sentack->datetimeack = messagetimestampack;
 sentack->sourceip1ack = ethernet.localip()[0];
 sentack->sourceip2ack = ethernet.localip()[1];
 sentack->sourceip3ack = ethernet.localip()[2];
 sentack->sourceip4ack = ethernet.localip()[3];
 sentack->zeroes1ack = 00;
 sentack->zeroes2ack = 00;
 udp.beginpacket(ipaddress(my ip), 18006);
 udp.write((byte*) sentack, 28);
 udp.endpacket();
 free(sentack);
}

void packetcreator () //function create packet head , payload of 76 bytes
{
 data* sentdata = (data*) malloc(sizeof(data));//allocate memory
 sentdata->major = majorversion;
 sentdata->minor = minorversion;
 sentdata->messagetype = 1;
 sentdata->channel = 3;
 sentdata->payloadlength = 36;
 sentdata->id = idcount;
 idcount++;//increment id count
 sentdata->datetime;
 sentdata->sourceip1 = ethernet.localip()[0];
 sentdata->sourceip2 = ethernet.localip()[1];
 sentdata->sourceip3 = ethernet.localip()[2];
 sentdata->sourceip4 = ethernet.localip()[3];
 sentdata->zeroes1 = 00;
 sentdata->zeroes2 = 00;
 sentdata->payloadtype;
 sentdata->pinnumber;
 sentdata->digitalvalue;
 sentdata->digitalpullupenable;
 sentdata->analogadcconversion;
 sentdata->zeroes3;
 sentdata->variablename;
 sentdata->analogvalue;
 udp.beginpacket(ipaddress(my ip), 18006);
 udp.write((byte*) sentdata, 76);
 udp.endpacket();
 free(sentdata);
}

void remove_all_chars(char* str, char c) //function remove unwanted character string
{
   char *pr = str, *pw = str;
   while (*pr) {
       *pw = *pr++;//always advance reading pointer
       pw += (*pw != c);//and advance writing pointer when it's not pointing given character
   }
   *pw = '\0';
}

void variabledecoder ()
{//function decode variable name
  remove_all_chars(variablenamebuff, '.');
  if (strcmp(variablenamebuff, "imv_drive")==0)
  {
     //writepin 4
     serial.println(1);
  }
  else if (strcmp(variablenamebuff, "hpv_drive")==0)
  {
    //writepin 5
    serial.println(2);
  }
  else if (strcmp(variablenamebuff, "vvt_drive")==0)
  {
    //writepin 6
    serial.println(3);
  }
  else if (strcmp(variablenamebuff, "vehicle_can")==0)
  {
    //writepin ???
    serial.println(4);
  }
  else if (strcmp(variablenamebuff, "injector_drive1")==0)
  {
    //writepin 7
    serial.println(5);
  }  
}

void readpins ()//function read pins
{
 //read pins all
}

void loop()
{
 //check new udp-packet:
 int size = 0;
 size = udp.parsepacket();
 if (size == 76)
 {
   char* msg = (char*)malloc(1024);//alocate memory
   int len = udp.read(msg, 1024);
   msg[len] = 0;
   udp.flush();

   //check major version , minor , channel , if message type == 2
   majorbuffack[0] = msg[0];
   majorbuffack[1] = msg[1];
   minorbuffack[0] = msg[2];
   minorbuffack[1] = msg[3];
   memcpy(&msgminorversionack, minorbuffack, sizeof msgminorversionack);//alocate memory major , minor check
   memcpy(&msgmajorversionack, majorbuffack, sizeof msgmajorversionack);
   if ((msgmajorversionack == majorversion) && (msgminorversionack == minorversion) && (msg[5] == 2) && ((msg[4] == 1) || (msg[4] == 3)))
   {
     if (msg[4] == 3)
     {
       idcount = 1;
       for (int = 0; < len; i++)//loop through packet timestamp
       {
         if (i >= 12 && <= 19)//copy timestamp , id acknoledgement
           {
             timestampbuffack[i - 12] = msg[i];
           }
         if (i >= 8 && <= 11)
         {
           idbuffack[i - 8] = msg[i];
         }
       }
     }
     if (msg[4] == 1)
     {
        (int = 0; < len; i++)//loop through packet timestamp
        {
           if (i >= 12 && <= 19)//copy timestamp , id acknoledgement
           {
             timestampbuffack[i - 12] = msg[i];
           }
           if (i >= 8 && <= 11)
           {
             idbuffack[i - 8] = msg[i];
           }
           if (i >= 36 && <= 67)
           {
             variablenamebuff[i -36] = msg[i];
           }
         }
         serial.println(f(variablenamebuff));//print variable name serial
         serial.println(count);
         count++;
         //variabledecoder();
      }
     memcpy(&messagetimestampack, timestampbuffack, sizeof messagetimestampack);//copy , convert timestambuff messagetimestamp
     memcpy(&idcountack, idbuffack, sizeof idcountack);//copy , convert idbuff idcount
     acknowledgementcreator();
   }
   free(msg);
 }
 if ((a % 10) == 0 )
 {
   packetcreator();
 }
 a++;
}


thanks help!

do udp packets go through router destination device?
how long take send 50,000 packets?
how long dhcp lease time in router?

i don't see renewing dhcp lease. maybe causes fail?
http://arduino.cc/en/reference/ethernetmaintain


Arduino Forum > Using Arduino > Networking, Protocols, and Devices (Moderator: fabioc84) > Arduino shield crashes/stops after sending and receiving 50,000+ Udp packets


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support