4 floats versturen via UDP
7 berichten
• Pagina 1 van 1
4 floats versturen via UDP
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
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
Re: 4 floats versturen via UDP
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
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)
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: 4 floats versturen via UDP
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
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
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
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
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: 4 floats versturen via UDP
2e kop koffie, boeltje draait.
Dus :
Terminal Output :
Code kan wel opschoon sessie gebruiken, ging meer om de principes.
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
Re: 4 floats versturen via UDP
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
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
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: 4 floats versturen via UDP
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.
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
Re: 4 floats versturen via UDP
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
Nogmaals bedankt voor het vele werkt wat je hebt gedaan.
Wim
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 27 gasten