PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ascii2Hex UART Problem



Robinsam
24.01.2006, 00:29
Ave AVR-Freunde!

Ich hab' ein kleines Problemchen, 8-[

müsste mal mit Terminal Zahl in zwei Formaten an den UART übergeben können, und damit weiter im µC rechnen.

Format I: hh hh hh also z.B. F9540F auf dem µC: 0xF9, 0x54, 0x0F
Format II: hhh also z.B. 7E0 - auf dem µC: 0x00, 0x07, 0xE0

Also am Terminal soll man einfah 7e0 eintippen dann läuft es als ASCII mit UART an den µC, wird als String zusammengesetzt und....

...und hier benötige ich Eure Hilfe. Könnte mir jemand sagen wie so eine Funktion aussehen könnte? :-k

Eine lib wegen einer Funktion einzubinden würde ich ungeren tun, zumal ich nicht mal weiss welche es sein könnte...

Grüsse

Robinsam.


PS. Beim kompilieren zeigt mir WinAVR Program: 17,6% Full und 2758 Bytes. Die Datei hat aber 8K im Explorer.... (Genau 7.778 Bytes). Was beinhaltet sie noch?

PicNick
24.01.2006, 07:27
Das ist eine Routine nur zum Verständnis. davon geht vieles besser und kürzer.


unsigned uint32_t Data;
char ink;
Data = 0; // initialize


one-data-in:
ink = UDR;
Data <<= 4;
switch (ink)
{
case 13: break; // <RETURN> fertig
case 'A': Data |= 0x0A; break;
case 'B' Data |= 0x0B; break;
case 'C': Data |= 0x0C; break;
case 'D': Data |= 0x0D; break;
case 'E': Data |= 0x0E; break;
case 'F': Data |= 0x0F; break;
case '0': Data |= 0x00; break;
case '1': Data |= 0x01; break;
..................
case '9': Data |= 0x09; break;
default: break;

Robinsam
24.01.2006, 07:53
Recht herzlichen Dank für die Antwort... Und vor allem so schnell...

Zu der Rutine... Vielleicht ist mir was entgangen, aber ist es nicht so, dass, wenn ich "70e" schreibe und dann ENTER drücke bekome ich "70e0"? Soll aber "070e" kommen.. und das ist mein Problem... Oder habe ich da was nicht verstanden?

Trotzdem herzlichen Dank, und falls ich im Unrecht sein sollte, bitte nicht schreien ;-).

PicNick
24.01.2006, 08:31
Du hast recht. :oops: Das shiften von DATA darfst du erst machen, wenn ein gültiges Zeichen erkannt wurde

Robinsam
24.01.2006, 09:14
Danke Rob, aber auch das hilft nicht so ganz....
dann hätte ich aus "f2b" "f20b" statt "0f2b"...
Ich habe mir da was gebastellt, aber es ist leider sehr lange mit String-Kopiererei, und offset-verschiebung ...

Obwohl diesen Part mit dem Zeichen-Ersatz statt offset-rechnerei könnte ich schon von Dir übernehmen... Das versuche ich.

Thx.

auch robert ;-)

PicNick
24.01.2006, 09:58
Moment: Input "F2B"


1 ------------------------------
Data = 00000000
inpc = "F" uppercase beachten !
Shift Data = 00000000
Data OR inpc = 0000000F
2 ------------------------------
Data = 0000000F
inpc = "2"
Shift Data = 000000F0
Data OR inpc = 000000F2
3 ------------------------------
Data = 000000F2
inpc = "B"
Shift Data = 00000F20
Data OR inpc = 00000F2B
4 ------------------------------
Data = 00000F2B
inpc = <ENTER>
nix
Data = 00000F2B

SprinterSB
24.01.2006, 10:55
Beim kompilieren zeigt mir WinAVR Program: 17,6% Full und 2758 Bytes. Die Datei hat aber 8K im Explorer.... (Genau 7.778 Bytes). Was beinhaltet sie noch?
Neben dem reinen Code sind noch andere Informationen in der Binärdatei -- unterschiedlich je nachdem, auf welches Format du dich beziehst (elf, ihex, bin, srec,...) Es können etwa Debug-Informationen drinne sein, die ja nicht auf dem Flash/EEPRIOM landen.

Wenn's auf Codegrösse ankommt, ist wohl so was am knackigsten, ohne viel zu hacken:

...
data <<= 4;
uint8_t offset = 0;

switch (ink)
{
case '0' ... '9':
offset = '0';
break;
case 'A' ... 'F':
offset = 'A'-10;
break;

case 'a' ... 'f':
offset = 'a'-10;
break;

case 10:
case 13:
break;
default:
// ???
break;
}

data += ink-offset;
...

Robinsam
24.01.2006, 14:52
Ich danke Euch beiden für den Einsatz. Genau das, was ich mir gewünscht hatte.

@PicNic
Recht hast Du... ich habe leider die Initialisierung übersehen... ](*,) ... und bin von uint8_t ausgegangen.... :oops:
sorry.


Nochmal danke.

Robert