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.
here actual code decodes packet , other functions
thanks help!
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
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
Post a Comment