StringToHex Funktion

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.

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.

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.

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.

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:

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

nomis321: oder seh ich das falsch werden ja eigentlcih oder eh nur 0 und 1 übermitetl?

Die Interpretation liegt in Deinem Programm.

nomis321: 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.

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?

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.

nomis321: 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.

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) {}

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!

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.

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.

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

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)

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

@nomis321: Du solltest vielleicht einfach mit der genauen Info zu diesem ominösen Pedal rausrücken. Modell, Datenblatt, Beschreibung ... irgendwo hast Du Deine Infos doch her.

Und vermutlich hat Serenifly (wie eigentlich immer) Recht: Du wirst ASCII schicken müssen.

Klaus_ww: Du wirst ASCII schicken müssen.

Wenn das Gerät ASCII möchte dann ist aber die ganze Sache mit der Konvertierung sinnlos, da man ja selbst ASCII eintippt

Und für den Anwendungsfall, wo das der Arduino automatisch macht:

ASCII senden und als String Literal angeben:

Serial.print("49F0");

ASCII senden und als Hex-formatierten Integer angeben (Achtung: sendet keine führenden Nullen!):

Serial.print(0x4940);

Binär senden und als Hex-formatierten Integer angeben:

Serial.write(0x4940);

Auch auf das Endzeichen achten. Manchmal wird ein CR als Abschluss verlangt. println() sendet ein CR + LF. Das ist nicht unbedingt richtig.

ok wenn es ein ascii ist kann ich ja zb einfach Serial.print("49f0") schreiben oder? wie wäre das als integer? sorry bin da ganz am anfang hoffe du verstehst was ich meine.

Hi

WAS WILLST DU? (ja, geschrien) Wann, bitte, möchtest Du uns mit den Daten zu Deinem 'Pedal' glücklich machen?

Bei Deinem jetzigen Beispiel werden die Zeichen 4 9 f 0 /cr /lf über die serielle Schnittstelle übertragen. Wie Das 'unter dem Rock' wirklich aussieht, kann Dir, sei beruhigt, vollkommen egal sein, wenn beide Seiten das Gleiche schwätzen.

Du kannst, statt einer '4' auch 0x34 (in manchen Sprachen auch 34h oder 34H gekennzeichnet), 0b00110100 als binär oder in sonst einem Zahlensystem (implementiert wäre noch Octal, sollte 064 sein, führende Null) versenden, Das ist GENAU das Gleiche! Ähnlich bei den anderen Zeichen.

Sollte Dein Pedal aber 49f0 als 0x49F0 sehen wollen, wäre Serial.write(0x49,0xF0); ... oder Serial.write(0xF0,0x49); auszuprobieren.

Das Alles bekommt aber mit, wenn man einen Blick in das Datenblatt des ominösen Pedal wirft.

MfG

Schreien hilft nicht, Deine Beispiele hoffentlich mehr. Ich bin sicher, er will uns nicht ärgern mit seinen Fragen.