Go Down

Topic: StringToHex Funktion (Read 1 time) previous topic - next topic

nomis321

Gibt es für den arduino eingentlich ein fertige StringToHex Funktion?
Bin irgendwie mit google hier nicht weiter gekommen.
Vllt kann mir jemand von euch hier helfen und hat vllt eine fertige Funktion.

Klaus_ww

Quote
Bin irgendwie mit google hier nicht weiter gekommen
Glaub ich Dir nicht, und mal nebenbei führen solche Fragen zu genügend Rückfragen.

Also: beschreib genau, was Du machen möchtest. Und am besten anhand eines Beispiels, dann ist's klar.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Schuppeste

#2
Jan 07, 2018, 12:07 pm Last Edit: Jan 07, 2018, 12:08 pm by Schuppeste
Irgendwie weiss man auch nich wie Du Das meinst, hexstring to byte, char to hexstring oder was auch immer.

Ein hex ist string, da gibt google nix aus, arduino hat soweit ich weiß nichts direkt drin.. Ist auch nicht umständlich.

nomis321

Wenn ich an einen controller etwas über rs232 sende ist doch eigentlich egal ob ich das ganze als hex oder text übergebe?
oder seh ich das falsch werden ja eigentlcih oder eh nur 0 und 1 übermitetl?
mein eigentliches Ziel ist es eine Reihenfolge von Befehlen von meinem Arduino aus zu senden.
Ich will den ersten Befehl senden zB. 49f0 und wenn ich einen Antwort bekomm den zweiten Befehl zb. 49f1 usw..
Diese werte würde ich gerne als hex übergeben.

Ich habe jetzt eine Funktion gesucht die mir dieses ermöglicht.

Serenifly

#4
Jan 07, 2018, 12:34 pm Last Edit: Jan 07, 2018, 12:39 pm by Serenifly
Quote
Wenn ich an einen controller etwas über rs232 sende ist doch eigentlich egal ob ich das ganze als hex oder text übergebe?
Es ist nicht egal, weil das Programm anders sein muss je nach was man sendet. Text im seriellen Monitor ist immer ASCII. Wenn du "123" eintippst werden drei Bytes gesendet. Nicht eines. Und dann braucht man noch ein LF oder CR als Abschlusszeichen, damit der Arduino das Ende erkennt.

Die Arduino String Klasse hat nur eine eingeschränkte Funktionalität. Vor allem wenn es um Konvertierung und Formatierung geht mangelt es gewaltig. Den scheinbaren Komfort erkaufst du dir u.a. mit dieser mangelnden Flexibilität.
Mit C Strings (Null-terminierte char Arrays) ist das allerdings kein Problem. Da gibt es strtoul() um Hex-Strings in Integer zu konvertieren. Das ist eine klassische C Funktion. Deshalb taucht die in der Arduino Referenz nicht auf.

Geht auch über den Umweg der String Klasse wenn es unbedingt sein muss:
Code: [Select]

String text = "49F0";
unsigned int value = strtoul(text.c_str(), NULL, 16);

agmue

#5
Jan 07, 2018, 12:36 pm Last Edit: Jan 07, 2018, 12:37 pm by agmue
oder seh ich das falsch werden ja eigentlcih oder eh nur 0 und 1 übermitetl?
Die Interpretation liegt in Deinem Programm.

mein eigentliches Ziel ist es eine Reihenfolge von Befehlen von meinem Arduino aus zu senden.
Du kannst binäre Zahlen übermitteln oder Buchstaben. Letztlich sind auch Buchstraben Zahlen, werden aber anders ausgewertet.

Meine Meinung: Wenn Du die Wahl hast, dann übermittle Buchstaben, weil dann Steuerzeichen wie CR und LF zur Strukturierung der Datenpakete möglich sind.

Beispielsweise also "49f0\n" und "49f1\n" als Zeichenkette.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

nomis321

also wenn mein Gerät in meinem fall ist es ein Pedal was in alle richtung bewegt werden kann seine befehle in HEX erwartet müssen diese auch so übergeben werden.
Deine Funktion hab ich nicht ganz verstanden.
Ich habe ja den Befehl 49f0 also text sozusagen.
Dieser muss dann ja in Hex umgewandelt werden und dann über rs232 an mein Pedal übergeben werden.
Diese umwandlung funktioniert mit deiner Funktion?

oder vesteh ich grerade alles Falsch?

Serenifly

#7
Jan 07, 2018, 12:54 pm Last Edit: Jan 07, 2018, 12:58 pm by Serenifly
Quote
Deine Funktion hab ich nicht ganz verstanden.
Das ist eine Jahrzehnte alte Standard Funktion. Google gibt dir breit Auskunft wie die arbeitet:
http://www.cplusplus.com/reference/cstdlib/strtoul/
Oder etwas ausführlich bei strtol()
http://www.cplusplus.com/reference/cstdlib/strtol/

Entweder du liest deinen Text direkt als C String ein und wendest die Funktion darauf an. Oder du liest ihn als Arduino String Objekt ein und verwendest erst mal c_str() um das interne Array zu kommen. Die Funktion liefert einen unsigned long. 4 Hex Ziffern ergeben einen unsigned int


"Umwandlung in Hex" ist übrigens nicht ganz korrekt. Dein Pedal versteht nur Binär. Jegliches Zahlensystem ist nur für dich als Mensch relevant. Du kannst das ruhig als Hex eingeben und in einen Integer konvertieren. Und dann den Integer als Dezimal oder Binär anzeigen. Für einen Computer ist das einfach eine Zahl.

agmue

#8
Jan 07, 2018, 01:03 pm Last Edit: Jan 07, 2018, 01:09 pm by agmue
Ich habe ja den Befehl 49f0 also text sozusagen.
Woher hast Du diese Erkenntnis? Würdest Du die Quelle mit uns teilen? In meinem Auto befindet sich ein Pedal, das Druck haben möchte, Deines kenne ich nicht.

Wenn Du 0x49f0 = 18928 = 0b100100111110000 schreibst ist klar, was übertragen werden soll.

Code: [Select]
void setup()
{
  Serial.begin(9600);
  Serial.println("Hallo Welt!");
  byte t[] = {0x49, 0xf0};
  Serial.write(t[0]);
  Serial.write(t[1]);
  Serial.println();
}

void loop(void) {}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Serenifly

#9
Jan 07, 2018, 01:13 pm Last Edit: Jan 07, 2018, 01:14 pm by Serenifly
Ich glaube er will die Befehle auf dem seriellen Monitor als Text eintippen, diesen in einen Integer konvertieren und dann an das Pedal weiterreichen. Kann natürlich sein dass er durch die verschiedenen Formate verwirrt ist. Das sieht man hier immer wieder (z.B. neulich der mit seinem Projektor, wo das Datenblatt klar gesagt hat dass das Gerät Binär möchte, er aber ständig Strings gesendet hat)



Übrigens, wenn du das so möchtest, brauchst du zwei serielle Schnittstellen! Also für die Übertragung mit dem Gerät SoftwareSerial oder AltSoftSerial verwenden!

nomis321

Ich habe ein Pedal mit dem ich einen PC steuern kann.
Ich möchte mit Hilfe eines Arduino die Bewegungen dieses Pedals auslesen.
Hierfür muss ich verschiede Befehle von meinem Arduino an dieses Pedal über RS232 senden.
Der erste befehl ist 49f0 dieser soll in hex umgewandelt und an mein Pedal gesendet werden.
Ich suche jetzt eine Funktion die mir diese umwandlung ermöglicht.

49f0 entspricht ja als HEX 34 39 66 30

wenn mein Peal dann den richtigen Befehl erhält sollte es mir eine antwort schicken und ich sende den nächsten Befehl usw.


nomis321

Nein ich will eigentlcih komplett ohne den seriellen monitor arbeiten wenn alles funktioniert.
Wenn ich einen Taster drück soll eine Befehlsreihenfolge an mein Pedal gesendet werden.
Diese soll mein Pedal sozusagen in den Sendemodus bringen.
Auf einem Display sollen dann die Pedalbewegungen angezeigt werden.
Zum testen will ich mir aber diese Werte ersteinmal auf dem Seriellen Monitor anzeigen lassen.
Ich nutze einen Arduino Mega da geht das ja ohne Soft Serial.

Serenifly

#12
Jan 07, 2018, 01:24 pm Last Edit: Jan 07, 2018, 01:26 pm by Serenifly
Quote
49f0 entspricht ja als HEX 34 39 66 30
Werde dir bitte, bitte klar was du da hast. 0x49F0 ist ein Integer als Hex geschrieben. Das ist das gleiche wie 18928 in Dezimal

34 39 66 30 ist ASCII! Zwar als Hex formatiert, aber wichtig ist hier dass es ASCII ist
http://www.asciitable.com/

"Umwandeln in Hex" ist hier eine sinnfreie Aussage. Du willst den Text von einem Hex-formatierten String in einen Integer konvertieren

nomis321

ich hab folgende Info:
Die Gerätefunktionen werden über Kommandos gesetzt. Diese bestehen aus den Zeichen 0-9 und a-f (Hexadecimal 30-39 und 61-66)

Serenifly

Entweder bist du immer noch verwirrt oder du drückst dich falsch aus.

Wenn du sagst dass das Gerät ein Zeichen möchte, heißt das für mich ASCII. Es kann aber auch Integer sein und es steht nur in Hex da damit es einfacher lesbar ist (nur dafür ist das Hexdezimal System da!). z.B. 0x... Oder ...H ist ein Integer, der lediglich als Hex geschrieben ist

Go Up