Arduino: long in HEX-String konvertieren
Hallo zusammen,
ich habe hier ein kleines Arduino-Bastelprojekt, welches RFID-Transponder einlesen soll und den Wert als HEX-String ausgeben soll. Der Arduino wird dann als HID(Tastatur) agieren.
Leider hängt es bei mir bei der Konvertierung des eingehenden Strings in einen HEX-String. Die Umwandlung des Strings in eine LONG funktioniert, danach hakt es.
Hier ist mein Code:
Und hier die Ausgabe:
Eigentlich müsste aber 45C564 herauskommen... Wo habe ich den Fehler gemacht?
Danke für die Hilfe und beste Grüße!
Berthold
ich habe hier ein kleines Arduino-Bastelprojekt, welches RFID-Transponder einlesen soll und den Wert als HEX-String ausgeben soll. Der Arduino wird dann als HID(Tastatur) agieren.
Leider hängt es bei mir bei der Konvertierung des eingehenden Strings in einen HEX-String. Die Umwandlung des Strings in eine LONG funktioniert, danach hakt es.
Hier ist mein Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
String str;
int test = 1;
char out[20];
long strlint;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
if(test == 1){
str="0004572516";
Serial.print("str: ");
Serial.println(str);
strlint = atol(str.c_str());
Serial.print("strlint: ");
Serial.println(strlint);
Serial.print("String(strlint, HEX): ");
Serial.println(String(strlint, HEX));
Serial.print("sprintf(out,\"%08X\",strlint): ");
sprintf(out,"%08X",strlint);
Serial.println(out);
test = 0;
}
}
Und hier die Ausgabe:
1
2
3
4
2
3
4
str: 0004572516
strlint: 4572516
String(strlint, HEX): 455555
sprintf(out,"%08X",strlint): 0000C564
Eigentlich müsste aber 45C564 herauskommen... Wo habe ich den Fehler gemacht?
Danke für die Hilfe und beste Grüße!
Berthold
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 308698
Url: https://administrator.de/forum/arduino-long-in-hex-string-konvertieren-308698.html
Ausgedruckt am: 13.04.2025 um 18:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
Das sieht ja so aus als ob er dir nur die niedrigsten 16 Bit raushaut.
Ich weiß jetzt grade nicht was der Controller des Arduino so kann und macht, aber wenn Du es schon im Long richtig hast kann kannst du ja, im Zweifelsfall, die unteren 16 Bit berechnen, die Zahl um 16 Bit nach rechts shiften und dann die oberen 16 Bit berechnen. Dann hängst Du die beiden Strings zusammen und fertig.
Das sieht ja so aus als ob er dir nur die niedrigsten 16 Bit raushaut.
Ich weiß jetzt grade nicht was der Controller des Arduino so kann und macht, aber wenn Du es schon im Long richtig hast kann kannst du ja, im Zweifelsfall, die unteren 16 Bit berechnen, die Zahl um 16 Bit nach rechts shiften und dann die oberen 16 Bit berechnen. Dann hängst Du die beiden Strings zusammen und fertig.
Hallo BirdyB,
was dein String Constructor in deinem ursprünglichen Beispiel verkehrt macht, kann ich auch nicht sagen. Bei sprintf sollte aber klar sein, dass du bei einem long auch ein "%lX" und nicht nur ein "%X" als Formatbezeichner benötigst.
Und nutze eine vernünftige Funktion/Methode für die Konvertierung zum long. So ziemlich jede Funktionsreferenz weist mittlerweile darauf hin, dass alles was mit ato... anfängt in die Tonne gehört
Grüße
rubberman
was dein String Constructor in deinem ursprünglichen Beispiel verkehrt macht, kann ich auch nicht sagen. Bei sprintf sollte aber klar sein, dass du bei einem long auch ein "%lX" und nicht nur ein "%X" als Formatbezeichner benötigst.
Und nutze eine vernünftige Funktion/Methode für die Konvertierung zum long. So ziemlich jede Funktionsreferenz weist mittlerweile darauf hin, dass alles was mit ato... anfängt in die Tonne gehört
Grüße
rubberman
Ich habe überhaupt keine Ahnung von Arduino, aber Google sagt es gibt eine toInt() Methode für die Arduino-eigene Stringklasse, die ein long zurückgibt.
Als Experte kann ich mich auch nicht bezeichnen, aber so viel:
Funktion atol() ist nicht C++ sondern C. Lediglich die Tatsache, dass C fast vollständig in C++ aufgeht, ist dafür verantwortlich dass du diese Funktion nutzen kannst. In C++ würde man sich ggf. des stol() Funktionstemplates bedienen. Das erwartet aber einen std::string oder std::wstring. Das Arbeiten mit Streamklassen ist zu diesem Zweck ebenfalls üblich (siehe >>Operatorüberladungen der stringstream Klasse).
Bei C gibt es strtol() als bessere Alternative für atol(). Hier lassen sich mit dem endptr und errno Fehler bei der Konvertierung erkennen.
Grüße
rubberman
Als Experte kann ich mich auch nicht bezeichnen, aber so viel:
Funktion atol() ist nicht C++ sondern C. Lediglich die Tatsache, dass C fast vollständig in C++ aufgeht, ist dafür verantwortlich dass du diese Funktion nutzen kannst. In C++ würde man sich ggf. des stol() Funktionstemplates bedienen. Das erwartet aber einen std::string oder std::wstring. Das Arbeiten mit Streamklassen ist zu diesem Zweck ebenfalls üblich (siehe >>Operatorüberladungen der stringstream Klasse).
Bei C gibt es strtol() als bessere Alternative für atol(). Hier lassen sich mit dem endptr und errno Fehler bei der Konvertierung erkennen.
Grüße
rubberman