4 floats versturen via UDP

Arduino specifieke Software
Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

4 floats versturen via UDP

Berichtdoor paysan » 04 Mei 2013, 22:11

Ik wil 4 float vars versturen via UDP.

Kan dat in 1 packet?

Moet ik dan 4 keer een Udp.write doen en dan de Udp.endPacket(); ?

Of moet ik de 4 floats omzetten als 1 lange ascii string en die die verzenden en aan de ontvangst zijde weer omzetten naar 4 floats?

Graag een tip.

Wim

Advertisement

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: 4 floats versturen via UDP

Berichtdoor Karel » 04 Mei 2013, 23:22

Van waar naar waar wil je die floats versturen?
Het hangt van de processor en de compiler af wat de interne representatie van een float is. Die kan bij de ene processor precies andersom zijn als de andere.
Als je niet weet wat de ontvangende zijde is, dan kan je waarschijnlijk beter een string versturen. Zet dan bijv. een spatie tussen de getallen als scheidingsteken. Gaat het van de ene naar de andere arduino (en weet je zeker dat dat ALTIJD zo blijft!), dan kan je gewoon de bytes oversturen.

Groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)

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

Re: 4 floats versturen via UDP

Berichtdoor astrofrostbyte » 05 Mei 2013, 07:18

http://arduino.cc/en/Reference/EthernetUDPWrite
Syntax : UDP.write(message);
Parameters: message: the outgoing message (char)

Hieruit zou je toch zeggen dat je met deze functie alleen een (NULL terminated) character string kan versturen.

Maar om nou een float te 'vertalen' naar een string en aan de overkant weer terug klink suf. Je verliest gewoon naukeurigheid.
mischien wel naar string maar dan in HEX notatie ala: 62A7C190 dan verlies je geen naukeurigheid.
Dus kan je een string opbouwen waar alle vier de floats in verpakt zitten

het String object zou mischien wel kunnen helpen : http://arduino.cc/en/Reference/StringObject

Code: Alles selecteren
void setup() {
 Serial.begin(9600);
 
 float f[3];
 f[0] =  1.2233736;
 f[1] =  38482.349;
 f[2] = -0.0239847;
 byte* bytep = (byte*)f;   // byte pointer wijst naar float array f
 
 String frame = "floats#";
 for (byte i=0; i< sizeof(f);i++)
 { frame += String(*bytep, HEX);
   bytep++;
 }
 frame += String("#");
 Serial.print(frame);
}

void loop() {  // put your main code here, to run repeatedly:
}

geeft als resultaat op de terminal : floats#82979c3f59521647907bc4bc# , dus ook de string die we versturen via UDP


En aan de overkant moeten we dit frame weer terug vertalen naar een echte float
Code: Alles selecteren
float f[3];
String frame = "floats#";

void setup() {
 Serial.begin(9600);

 f[0] =  1.2233736;
 f[1] =  38482.349;
 f[2] = -0.0239847;
 byte* bytep = (byte*)f;

 for (byte i=0; i< sizeof(f);i++)
 { frame += String(*bytep, HEX);
   bytep++;
 }
 frame += String("#");
 Serial.print("TxFrame: "); Serial.println(frame);
}

void loop()
{
  byte i = frame.indexOf("floats#");  //zoek token in received frame
  i = i + sizeof("floats#") - 1 ;
  Serial.print("Index  : ");Serial.println(i);
 
  String a = frame.substring(i    , i+8    );
  String b = frame.substring(i+8  , i+8+8  );
  String c = frame.substring(i+8+8, i+8+8+8);
 
  Serial.print("Float 1: "); Serial.println(a);
  Serial.print("Float 2: "); Serial.println(b);
  Serial.print("Float 3: "); Serial.println(c);

  //convert_hex_float();

  while(1);
}

geeft op de terminal :
TxFrame: floats#82979c3f59521647907bc4bc#
Index : 7
Float 1: 82979c3f
Float 2: 59521647
Float 3: 907bc4bc


Nu alleen nog een HEX naar float conversie :?
of eigenlijk een HEX naar Byte is voldoende
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

Re: 4 floats versturen via UDP

Berichtdoor astrofrostbyte » 05 Mei 2013, 09:39

2e kop koffie, boeltje draait.

Dus :
  • Float naar Hex String
  • verzenden hex string in ascii formaat
  • ontvangen ascii string, de floats als hex isoleren
  • Hex floats decoderen

Terminal Output :
Code: Alles selecteren
Original float numbers
Float 1: 1.223374
Float 2: 38482.347656
Float 3: -0.023985
Coding HEX string ...
TxFrame: floats#82979c3f59521647907bc4bc#
Decoding HEX string ...
Index  : 7
Float 1: 82979c3f
Float 2: 59521647
Float 3: 907bc4bc
Decoded received float numbers
Float 1: 1.223374
Float 2: 38482.347656
Float 3: -0.023985



Code: Alles selecteren
#include <cctype.h>

const byte NRFLOAT = 3;
float f[NRFLOAT];
byte* bytep = (byte*)f;
String frame = "floats#";

void setup() {
 Serial.begin(9600);

 f[0] =  1.2233736;
 f[1] =  38482.349;
 f[2] = -0.0239847;
 Serial.println("Original float numbers");
 Serial.print("Float 1: "); Serial.println(f[0],6);
 Serial.print("Float 2: "); Serial.println(f[1],6);
 Serial.print("Float 3: "); Serial.println(f[2],6); 

 Serial.println("Coding HEX string ...");
 for (byte i=0; i< sizeof(f);i++)
 { frame += String(*bytep, HEX);
   bytep++;
 }
 frame += String("#");
 Serial.print("TxFrame: "); Serial.println(frame);
}

void loop()
{
  Serial.println("Decoding HEX string ...");

  byte i = frame.indexOf("floats#");  //zoek token in received frame
  i = i + sizeof("floats#") - 1 ;
  Serial.print("Index  : ");Serial.println(i);
 
  String a = frame.substring(i    , i+8    );
  String b = frame.substring(i+8  , i+8+8  );
  String c = frame.substring(i+8+8, i+8+8+8);
 
  Serial.print("Float 1: "); Serial.println(a);
  Serial.print("Float 2: "); Serial.println(b);
  Serial.print("Float 3: "); Serial.println(c);

  bytep = (byte*)f;
  *bytep = hexstr2byte(a,0 );  bytep++;
  *bytep = hexstr2byte(a,2 );  bytep++;
  *bytep = hexstr2byte(a,4 );  bytep++;
  *bytep = hexstr2byte(a,6 );

  bytep = (byte*) &f[1];
  *bytep = hexstr2byte(b,0 );  bytep++;
  *bytep = hexstr2byte(b,2 );  bytep++;
  *bytep = hexstr2byte(b,4 );  bytep++;
  *bytep = hexstr2byte(b,6 );

  bytep = (byte*) &f[2];
  *bytep = hexstr2byte(c,0 );  bytep++;
  *bytep = hexstr2byte(c,2 );  bytep++;
  *bytep = hexstr2byte(c,4 );  bytep++;
  *bytep = hexstr2byte(c,6 );

  Serial.println("Decoded received float numbers");
  Serial.print("Float 1: "); Serial.println(f[0],6);
  Serial.print("Float 2: "); Serial.println(f[1],6);
  Serial.print("Float 3: "); Serial.println(f[2],6);
  while(1);
}

// convert HEX string to a byte
byte hexstr2byte(String in, byte start)
{ byte ca,cb;

  char c = in.charAt(start);
  if      (isdigit(c))  ca  = c - 0x30;      // [0..9]
  else if (isupper(c))  ca  = c - 0x41 + 10; // [A..F]
  else if (islower(c))  ca  = c - 0x61 + 10; // [a..f]
  ca <<= 4;                             // shift to high nibble
  ca  &= 0xF0;

  c = in.charAt(start+1);
  if      (isdigit(c))  cb  = c - 0x30;      // [0..9]
  else if (isupper(c))  cb  = c - 0x41 + 10; // [A..F]
  else if (islower(c))  cb  = c - 0x61 + 10; // [a..f]
  cb  &= 0x0F;

  return( cb + ca);
}

Code kan wel opschoon sessie gebruiken, ging meer om de principes.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: 4 floats versturen via UDP

Berichtdoor paysan » 05 Mei 2013, 09:58

Heel mooi!!!!

Dank je wel voor het mooie voorbeeld. Heel leerzaam.

Ik moet aan de andere kant wel degelijk de floats weer hebben want die moeten een grafiek gaan vullen.
Maar daar kom ik wel uit denk ik.

Wim

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

Re: 4 floats versturen via UDP

Berichtdoor astrofrostbyte » 05 Mei 2013, 11:22

Aan de 'andere kant' zijn de floats al gerecovered .. in het laatste voorbeeld zie je ook de ontvangen floats weer in float formaat geprint naar de terminal.

En ik zie net dat je 4 floats hebt ipv van 3 zoals in m'n voorbeeld
Mischien hebben andere mensen nog wat tips om de code wat netter/compacter te kunnen maken.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: 4 floats versturen via UDP

Berichtdoor paysan » 05 Mei 2013, 13:08

J, dat maakt niet uit, 3 of 4 of 5. Ik begrijp nu hoe ik het moet aanpakken, en daar gaat het om.

Nogmaals bedankt voor het vele werkt wat je hebt gedaan.

Wim

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 29 gasten