omzetten van waarden via UDP

Arduino specifieke Software
Berichten: 8
Geregistreerd: 12 Feb 2013, 22:53

omzetten van waarden via UDP

Berichtdoor cvanblad » 23 Apr 2013, 23:00

Ik heb onderstaande code geschreven die twee array's uitleest en hiermee enkele bewerkingen doet.
Code: Alles selecteren
#if defined DEBUG
                Serial.println("debugmode");
                long x[]={-1,-1,3,-4,11,-18,33,2046,-13,24,-12,9,-6,6,-3,5,-3,1,-2,-1,-1,0,0,-2};
                long y[]={2,1,-1,0,-1,4,-5,49,-24,-16,5,-5,1,-3,0,-3,1,1,0,0,-1,-1,-1,-3};
               
 #endif
 
                //berekeningen maken in for lussen
               //test op nul gezet
               preMTE =0;
               postMTE = 0;
               TTE = 0;
               NMTER = 0;
                for ( k =0; k <7; k++)
                 {   
                  preMTE = preMTE + (x[k]*x[k]+y[k]*y[k]);
                 Serial.print(x[k]);
                 Serial.print(" ");
                 Serial.println(y[k]);
                 }
                 Serial.println(" ");
                 
                MTE = (x[7]*x[7]+ y[7]*y[7]);
                Serial.print(x[7]);
                Serial.print(" ");
                Serial.println(y[7]);
               
                Serial.println(" ");
                 
                 for ( l =8; l <24; l++)
                 {   
                  postMTE = postMTE + (x[l]*x[l]+ y[l]*y[l]);
                 Serial.print(x[l]);
                 Serial.print(" ");
                 Serial.println(y[l]);
                 }
                 
                 Serial.println(" ");
   
                //berekenen van TTE
                 for ( m =0; m <24; m++)
                 {   
                  TTE = TTE + ((x[m]*x[m])+ (y[m]*y[m]));
                 
                 }                 
                 //berekenen van NMTER
                 NMTER = (preMTE + postMTE);
                 NMTER = (NMTER/TTE);
                 NMTER = 10*(log10(NMTER));


de resultaten zijn correct als ik het op deze manier doe.
wanneer ik echter de twee array's op laat vullen met (dezelfde) data komende van mijn ethernetshield utp poort via UDP krijg ik telkens een foutief resultaat.

de code voor automatische opvulling.
String real; // variabele voor het Reële deel
String img; // variabele voor het imaginaire deel

Code: Alles selecteren
  if(packetSize)  // als er data is dan...
      {
           Udp.read(packetBuffer,150);  // lees het pakketje in met een lengte van 150
           Serial.println("Contents:");  // afdrukken op de serial monitor
           String string1;  // variabele om verschillende bytes in te lezen
           String string2;  // variabele om verschillende bytes in te lezen
           String string3;  // variabele om verschillende bytes in te lezen
           String string4;  // variabele om verschillende bytes in te lezen
           
           for (int i =54; i < 150; i += 4)//vanaf byte 54 tot einde (150) inlezen in stappen van 4
            {
                 //de vier strings inlezen   
                 string1 = String(packetBuffer[i],HEX);
                 string2 = String(packetBuffer[i+1],HEX);
                 string3 = String(packetBuffer[i+2],HEX);
                 string4 = String(packetBuffer[i+3],HEX);
                                 
                 if (string2.length()==1)
                   {
                    string2 = "0" + string2; // als de tweede byte maar 1 karakter telt zetten we er een "0" voor
                   }
                             
                 if (string4.length()==1)
                   {
                    string4 = "0" + string4;// als de vierde byte maar 1 karakter telt zetten we er een "0" voor
                   }
                             
                 real = string1 + string2;//samenstellen van het reele deel
                 img = string3 + string4;//samenstellen van het imaginaire deel
                                   
                 if (real.startsWith("F"))
                   {
                    real = "F" + real;// als het reele deel begint met een "F" zetten we er een "F" voor
                   }
                 if (img.startsWith("F"))
                   {
                 img = "F" + img;// als het imaginaire deel begint met een "F" zetten we er een "F" voor
                   }
                                   
                 char s[16];// nodig voor de omzetting van de strings
                 char t[16];// nodig voor de omzetting van de strings
                             
                                 
                 //omzetting van de strings to long
                 real.toCharArray(s,16);
                 img.toCharArray(t,16);
                 for (j =0; j < 24; j++)
                 {
               
                 x[j] = strtol(s, 0, 16);
               
                Serial.print("x = ");
                Serial.println(x[j]);
                             
               
                 
                 y[j] = strtol(t, 0, 16);
                               
                                 
                 Serial.print(" y = ");
                 Serial.println(y[j]);
                 j++;
           
                 } //einde for j vullen array van 24
               
            }  //einde for lus
                 
      }//einde packetBuffer

 
                //berekeningen maken in for lussen
               //test op nul gezet
               preMTE =0;
               postMTE = 0;
               TTE = 0;
               NMTER = 0;
                for ( k =0; k <7; k++)
                 {   
                  preMTE = preMTE + (x[k]*x[k]+y[k]*y[k]);
                 Serial.print(x[k]);
                 Serial.print(" ");
                 Serial.println(y[k]);
                 }
                 Serial.println(" ");
                 
                MTE = (x[7]*x[7]+ y[7]*y[7]);
                Serial.print(x[7]);
                Serial.print(" ");
                Serial.println(y[7]);
               
                Serial.println(" ");
                 
                 for ( l =8; l <24; l++)
                 {   
                  postMTE = postMTE + (x[l]*x[l]+ y[l]*y[l]);
                 Serial.print(x[l]);
                 Serial.print(" ");
                 Serial.println(y[l]);
                 }
                 
                 Serial.println(" ");
   
                //berekenen van TTE
                 for ( m =0; m <24; m++)
                 {   
                  TTE = TTE + ((x[m]*x[m])+ (y[m]*y[m]));
                 
                 }                 
                 //berekenen van NMTER
                 NMTER = (preMTE + postMTE);
                 NMTER = (NMTER/TTE);
                 NMTER = 10*(log10(NMTER));


kan iemand mij hiermee helpen aub?

Advertisement

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: omzetten van waarden via UDP

Berichtdoor astrofrostbyte » 27 Apr 2013, 08:49

Denk dat het makkelijkste is om even een dump te doen naar de serial terminal nadat de waarden uit het UDP frame zijn gehaalt. en dan even vergelijken.

of een checksum/parity over alle getallen gebruiken om te zien of er niets is omgevallen. <<-- mijn voorkeur
of net voor de berekening een loopje toevoegen waar je de UDP frame getallen vergelijkt met je constanten.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

byte Xor Checksum van long array[]

Berichtdoor astrofrostbyte » 27 Apr 2013, 10:32

uitrekenen byte checksum van een long type array , ff pielen . klopt dit nou ? :?

Code: Alles selecteren
long x[]={-1,-1, 3,-4,11,-18,33,2046,-13, 24,-12, 9,-6, 6,-3, 5,-3,1,-2,-1,-1, 0, 0,-2};
long y[]={ 2, 1,-1, 0,-1,  4,-5,  49,-24,-16,  5,-5, 1,-3, 0,-3, 1,1, 0, 0,-1,-1,-1,-3};

void setup()
{ Serial.begin(9600);
  byte chksm = 0x55;                          // XORchecksum token
  byte *pX = (byte *) x;                      // byte pointers
  byte *pY = (byte *) y;                      // of?   (byte *) &y[0];
  for (byte i=0; i<(sizeof(x)-1); i++)        // x[] same length as y[]
  { chksm ^= *(pX+i);
    chksm ^= *(pY+i);                         // of?   *pY++
  }
  Serial.println(chksm);
}


Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ameuzariliv en 24 gasten