hallo,
Will eine 8bit variable, in meinem Fall ist das die CheckSumme über den
UART(2te serielle) Schicken.
Die CheckSumme ist eine Varible die durch XORen von Zeichen, errechent
wird.
CheckSumme = CheckSumme ^ *checkpointer;
Printf(„%X“, CheckSumme); // ergibt einen hex.wert z.B. 13,
1 = hight-nibble und 3= low-nibble.
Übertrage ich den Wert der CheckSumme in den Buffer des UARTs und lasse
ihn ausgeben(durch Hyperterminal), wird mir nur ein Zeichen ausgegeben.
Desshalb habe ich die CheckSumme in ein hight-nibble und ein low-Nibble
umgewandelt und in einen Buffer abgelegt:
// alle variablen sind vom typ unsigned Char
checkhight = CheckSumme >> 4; // hight-Nibble, CheckSumme bsp. 1011
0111
checklow = CheckSumme & 0x0F; // low-Nibble, 0000 0111
printf(“%X”,CheckSumme); // Kontrollausgabe, 1ste serielle
WriteBuffer[check++] = checkhight; //checksumme Hight nibble 0000
1011
WriteBuffer[check++] = checklow; //checksumme low nibble 0000 0111
WriteBuffer[check++] = '\r';
WriteBuffer[check++] = '\n';
....
....
writepointer = WriteBuffer;
UARTBuffer = *writepointer; //ausgabe 2te serielle
writepointer++;
..
..
..
Trozdem wird mir ein falsches zeichnen ausgegeben.
z.B. für die Ausgabe 13(hex) wird ┌└ (Chr) in der 2ten seriellen
Ausgegeben. Allgemein sollen nur zeichen von 0...9, A....Z, a....z
Weiß einer wie man das lösen kann.
Ich weiß das printf("%X",CheckSumme); in hex. Konvertiert und mir
desshalb den erwünschen hexwert ausgibt, aber wie kann ich diesen
abspeichern und verwenden??
Ich verwende als eingabe und ausgabe den Hypertterminal.
danke
> Ich weiß das printf("%X",CheckSumme); in hex. Konvertiert und mir> desshalb den erwünschen hexwert ausgibt, aber wie kann ich diesen> abspeichern und verwenden??
Mit "sprintf" statt "printf".
Gruß,
Peter
Hi,
meines Wissens gibt das Hyperterminal von Windows nur ASCII Zeichen aus.
Der Wert 0x13 ist dann wohl das von dir genannte Zeichen. Eine
Umstellung der Anzeige ist im Hyperterminal nicht möglich.
Dieses problem hatte ich auch einmal und bin dann auf das Programm HTerm
umgestiegen, welches man frei downloaden kann. hier kannst du dann eine
Umstellung der ANzeige ziemlich komfortabel vornehmen (Dez, Bin, Hex).
Sollte dir helfen...
Grüße
mein prob ist das ich auch nur ASCII ausgeben will.
Und zwar nur 0...9, A...Z, a....z.
wenn ich z.B. 0x30 dazu addiere kriege ich dann die ganzen steurzeichen
weg.
Aber wieso geht das nicht mit hex.?? muß man dan erstes in Dec.
konvertieren?? und dan addieren?? und als letzten schritt wieder in hex
konvertieren??
Das Teilen der Nibbel ist schon richtig, dein Terminal gibt allerdings
ASCII-Zeichen aus. Schau dir mal eine ASCII-Tabelle an und überleg mal,
wie du die gewünschten Zeichen generieren könntest.
> checkhight = CheckSumme >> 4; // hight-Nibble, CheckSumme bsp. 1011 0111> checklow = CheckSumme & 0x0F; // low-Nibble, 0000 0111
Hier müsste folgender Code folgen (musst du sicher anpassen, ich bin der
Sprache C leider noch nicht mächtig, ich mach sonst Assembler):
if checkhigh < 0x0A then
checkhigh = checkhigh + 0x20 ; für die Ausgabe 0...9
else
checkhigh = checkhigh + 0x41 ; für die Ausgabe A...F
end
if checklow < 0x0A then
checklow = checklow + 0x20 ; für die Ausgabe 0...9
else
checklow = checklow + 0x41 ; für die Ausgabe A...F
end
Gruß Reinhard
Yagan es klappt. echt geil. und ohne große schleiferei. Danke
Jetzt was zu verständigung.
const char *sBinToHex = "0123456789ABCDEF";
WriteBuffer[check++] = sBinToHex[(CheckSumme>>4)&0x0F]; was passiert
eigenlich hier???
Sam,
der String sBinToHex enthält alle vorkommenden Zeichen für die
Hex-Darstellung der Werte 0 bis 15, Deklaration als Konstante (Zeiger
auf "012...F").
Mit sBinToHex[(CheckSumme>>4)&0x0F] wird auf den String indiziert
zugegriffen, d.h. als Index wird der Binärwert (0-15) benutzt, das
Ergebnis ist das passende ASCII-Zeichen (z.B. sBinToHex[0] liefert '0',
sBinToHex[15] liefert 'F').
Statt der Index-Schreibweise sBinToHex[15] könnte man auch die
Pointer-Schreiweise *(sBinToHex+15) benutzen. Das Ergebnis wäre
identisch.
Mit (CheckSumme>>4)&0x0F werden die "oberen" 4 Bits von Checksumme
extrahiert und so zurechtmaskiert, dass als Index nur 0-15 entstehen
kann (weil der String nur 16 Zeichen enthält). &0x0F ist in diesem Fall
eigentlich redundant, aber wenn CheckSumme kein 8-Bit-Wert ist,
funktioniert die Formel auch.
Ciao, Yagan
Du kannst es aber auch ohne Tabelle machen, nur mit Rechnen:
unsigned char tmp;
WriteBuffer[check++] = ((tmp=CheckSumme>>4)<10)?tmp+'0':tmp+'7';
WriteBuffer[check++] = ((tmp=CheckSumme&15)<10)?tmp+'0':tmp+'7';
Ungetesteter Code!
Zur Funktion:
wenn das Nibble <10, also 0..9 ist, wird 0x30 addiert
wenn das Nibble >10, also a..f ist, wird 0x37 addiert, also kommt für A
0x0a+0x37=0x41 (10+55=65) raus, genau wie gewünscht ein 'A'.