Hallo,
ich habe ein Problem mit meinem Programm, welches Hex Code in normale Buchstaben umwandeln soll. Es soll eine Zahlen und Buchstabenfolge im seriellen Monitor eingegeben werden, die dann ausgelesen und in verständliche Buchstaben übersetzt werden soll.
Eine Eingabe wäre beispielsweise:
48656C6C6F20576F726C64
Als Ausgabe soll dann ein "Hello World" erscheinen.
Jetzt habe ich aber das Problem, dass ich die Variablen zum Auslesen als String angelegt habe und wenn ich sie nun in den passenden Buchstaben übersetzen möchte geht es nicht.
Serial.println(char(0x63));
funktioniert,
Serial.println(char(Variablenname));
aber nicht, obwohl 'Variablenname' 0x63 enthält
Die Fehlermeldung lautet: 'Invalid cast from type string to type char'
Enthält und ist gleich sind 2 Paar Schuhe.
Ist sicher gestellt, dass die Hex-Folgen immer 2-stellig sind?
Wenn ja, dann lies immer die 2 Zeichen in ein char-Array der Länge 3 mit '\0' hintendran ein, wandle das mit strtol in eine Zahl und gib diese als Zeichen aus.
Oder nutze sscanf.
Hallo Tommy,
vielen Dank für Deine schnelle Antwort!
Ja, für normalen Text ist Hex immer zweistellig. Dec hat auch mal drei Stellen.
Allerdings gibt es auch Buchstaben, kann ich da dann noch das ganze in eine Zahl umwandeln?
Es ging nur darum zu vermeiden, dass unterschiedliche Stellenanzahlen (bei Dec entweder 2 oder drei Stellen) berücksichtigt werden müssen. Vielleicht könnten wir ja Oct benutzen, da sind es immer 3 Zahlen.
Wenn ihr jede komplette Zahl (= Zeichen) mit einem Zeilenvorschub (NL, '\n') abschließt, ist die Stellenzahl egal.
Warum übergebt ihr nicht einfach die Zeichenkette, die ihr haben wollt?
Also z.B. "Hallo"?
Es soll eine Geheimpost sein. Wir möchten keinen offenen Text übergeben (da bräuchte es ja dann auch kein Programm zu...). Auch sollen die einzelnen Buchstaben nicht sichtbar voneinander getrennt sein. Einfach nur ein Block aus Zahlen/Buchstaben und man kann diesen Block nur mit unserem Programm entziffern. Auch wenn man das Program selber vorliegen hat, darf nicht ersichtlich sein, was hinten rauskommt.
Mit 'Programm selber' war 'Programm alleine, ohne den Zahlenblock' gemeint.
Es soll nichts 'ordentliches' oder 'professionelles' oder sonstwas werden.
Es geht hier um eine 'Dankeschön-Karte' für unseren Informatik Lehrer. Wir dachten, das wäre vielleicht lustig für ihn. Wir wollten ihm nur eine kleine Nettigkeit mitgeben, da nächste Woche unsere letzte Stunde bei ihm ist. Wir sind nicht unbedingt seine strahlendste Klasse in Punkto Programmieren. Wir haben auch nur Lichter an und aus und einen Entfernungssensor programmiert. Das Programm oben ist Neuland für uns, es hat bis zu diesem Zustand einen Tag gebraucht und viel Forschen im I-Net.
Aber Du hast Recht, ein Stückchen Papier tuts natürlich auch.
Gespalten ist mein Herz, denn die gute Absicht ist schön, aber soll ich hier eine Lösung zeigen?
Ihr seit hoffentlich alt genug, die Entscheidung, was Ihr wie macht, selbst zu treffen. Kärtchen mit Foto und dem von Euch initiierten Programm kommt bestimmt gut an. Quellenangabe nicht vergessen
Getestet mit UNO:
char eingabe[100];
char ausgabe[50];
uint8_t i = 0;
void setup() {
Serial.begin(9600);
Serial.println("\nStart ...");
}
void loop()
{
while (Serial.available())
{
eingabe[i] = Serial.read();
if (eingabe[i] == '\n')
{
eingabe[i + 1] = '\0';
Serial.print("eingabe: ");
Serial.print(eingabe);
for (uint8_t a = 0; a < i; a += 2)
{
ausgabe[a / 2] = 0x10 * h2z(eingabe[a]) + h2z(eingabe[a + 1]);
Serial.print(h2z(eingabe[a]), HEX);
Serial.print(h2z(eingabe[a + 1]), HEX);
Serial.print('-');
Serial.print(ausgabe[a / 2], HEX);
Serial.print(' ');
}
Serial.print("\nausgabe: ");
Serial.println(ausgabe);
i = 0;
} else {
if (i < sizeof(eingabe) - 1) i++;
}
}
}
uint8_t h2z(char z)
{
uint8_t r = 255;
if (z >= '0')
{
r = z - '0';
if (z >= 'A') r -= 'A' - ':';
}
return r;
}
Besonderen Spaß hat mir die Buchstabenarithmetik gemacht
Danke! Wir schauen uns das Programm genauer an und googeln das Unbekannte (wird eine Weile dauern...). Danach können wir hoffentlich konkrete Fragen stellen
Hallo agmue,
Deine Buchstabenarithmetik ist wirklich beeindruckend!
Ich bin mir nicht ganz sicher, ob ich das Ganze verstanden habe. Es ist noch ein wenig schwierig zu verstehen, wie der Arduino 'denkt'.
Wie funktioniert das Rechnen mit char? Ist es korrekt, dass die dazugehörigen Dez-Werte addiert/subtrahiert werden? Also bei r -= 'A' - ':'
255-(65-58)=248?
Was passiert in der Berechnung für die Ausgabevariable?
0x10 * h2z(eingabe[a]) + h2z(eingabe[a + 1]);
Das '0x10*' irritiert mich.
Was ist das Ergebnis wenn ich beispielsweise 4A, also 'J' eingelesen habe?
In der Funktion h2z trennst Du Zahleneingaben von Buchstabeneingaben, oder? Was bewirkt r = z - '0';?
Könnte man da auch einfach r=z; sagen?
Könnte man die ganze if-Struktur umstellen in:
Die binären Werte werden verrechnet.... Ihm kann nur binär rechnen.
Dezimal, Oktal, Buchstaben usw sind nur Darstellungen/Präsentationen für uns Menschen.