ASCII in Hex und zurück

Gast
Lesenswert?
• ▲
▼
für die zeichen 0..F hast du 4 bits. die ascii tabelle ist eine 7 bzw 8
bit angelegenheit. um also alle zeichen von 0..255 (wenn du mit 8 bit
arbeitest) hexadezimal darstellen willst, musst du pro "ascii"
zeichen 2 zeichen in der hexadezimalen darstellung senden.

einmal durch 16 teilen > dann kommen die obersten 4 bits raus
wenn der wert < 10, dann 48 aufaddieren, sonst 55 aufaddieren

dann zu untersten 4 bits, da kannst du einfach die 4 obersten bits auf
0 setzen mit logisch "AND", also and 0x0F.
wenn diese zahl < 10, dann 48 aufaddieren sonst 55 aufaddieren.

beispiel:

0 = 00
1 = 01
10 = 0A
16 = 10
Gast
Lesenswert?
• ▲
▼
@R.Marx:
Nene, ich bekomme ein ASCII-Zeichen (Bsp.AXY...) und dieses soll ins
EEPROM.
Das kann ich aber doch nicht einfach so als A da rein pumpen.?

@dicky:
Ich versuche das mal zu verstehen. Ich melde mich wieder. Danke
Gast
Lesenswert?
• ▲
▼
ja ist anfangs etwas komplex.
du musst die hexdezimale schreibweise gut draufhaben, wenn du damit
arbeiten willst.

dez hex
0 0
1 1
2 2
. .
. .
9 9
10 A
11 B
12 C
13 D
14 E
15 F

mehr geht nicht. wenn du dich auf ascii zeichen (hier 8 bit)
beschränkst, musst du 2 zeichen a´ 4 bit (0..F) übertragen, das erste
ist das höherwertige, das 2. das niederwertige. das heisst die
reihenfolge ist wichtig und darf nicht durcheinanderkommen, daher
werden strings ins hex-schreibweise gerne von steuerzeichen eingerahmt
oder haben eine bestimmte länge wie motorolas-s-records oder andere
formate.

dekodieren:
erstes zeichen = höchstwertiges nibble.
wenn > dez 67 (zahl 9), dann 65 abziehen und mit 16 malnehmen, sonst 48
abziehen und mit 16 malnehmen

zweites zeichen:
wie vor, aber nicht mit 16 malnehmen.

beide werte addieren, fertig.



das erste hex-zeichen
Gast
Lesenswert?
• ▲
▼
ausserdem telefoniert gerade meine frau mit voip stundenlang (kost ja
nix), und das hat auf dem router vorrang, da wir ein sehr langesames
dsl haben dauert das jetzt hier alles eine ewiiiiiigkeit. bin nachher
nochmal da. ciao.
Gast
Lesenswert?
• ▲
▼
Das könnte es sein. Danke für die Mühen aber C kann ich so ohne weiteres
nicht lesen.
Mit meinen VB-Kenntnissen muss ich da erst das Wörterbuch zu Rate
ziehen.
Würde mich mal in Assembler interessieren.
Eigentlich hat sich mein Problem ja auch in soweit gelöst, dass ich ja
nur empfangene Daten ins EEPROM schreiben will und nachher wieder
auslesen und per UART versenden will.
Da es sich im MC immer um Hex-Daten handelt, brauche ich ja auch nichts
zu konvertieren.
Da hab ich mich wieder mal von meinem Display blenden lassen. Der MC
empfängt schliesslich keine ASCII-Daten.
Aber dieser Threat zeigt zumindest, dass es offensichtlich
Anwendungsfälle gibt.
Gast
Lesenswert?
• ▲
▼
hallo an allen,


ich habe folgendes problem:

Hex-Daten in ASCII-Daten konvertieren und dan über den UART schicken,
nur ohne Konvertierung kommt nur "scheisse" an.Und das ganze muss
leider alles unter Assembler laufen.

hat jemand eine Idee.


danke im voraus
Gast
Lesenswert?
• ▲
▼
Umwandlung einer Hex-Zahl in eine 2-Stellige ASCII-Zahl:

Die Hex-Zahl wird in r16 erwartet, die Subroutine "data" wird dann
zweimal mit einem Ascii-Zeichen in r16 aufgerufen. Ist ein Schnipsel
aus einer Subroutine für einen Hex-Dump über die serielle
Schnittstelle. Wichtig! Die Subroutine "data" muß mit "ret"
abgeschlossen sein.

send_hex:
  push r16            ;für zweiten Durchgang sichern
  swap r16            ;Zuerst High-Nibble ausgeben
  rcall send_nibble   ;umrechnen und ausgeben
  pop r16             ;gesicherte Daten zurückholen
send_nibble:
  andi r16,$0F        ;nur untere 4 Bit verwenden
  cpi r16,$0A         ;Zahl >= 10?
  brcs send_nibble1   ;falls nein, dann Sprung
  subi r16,$F9        ;Addiert $07
send_nibble1:
  add r16,$D0         ;Addiert $30
  rjmp data           ;Ausgabe eines ASCII-Zeichens in R16
Lesenswert?
• ▲
▼
@Carsten:

Mir ist immer noch nicht klar, was du für ein Problem hast, ich denke,
es ist nur ein "Knoten im Kopf".

- Du empfängst mittels UART Bytes.
- Diese sind vermutlich ASCII-Zeichen (aber immer noch Bytes).
- Diese sollen ins EEPROM geschaufelt werden.

Dann tu es doch, gib das Byte an eedr aus und gib die Impulse zum
Schreiben.

Du schreibst, ldi r16,"A" geht nicht... Stimmt, du musst nämlich
schreiben: ldi r16,'A'. Dann geht es auch. Aber in den .db-Direktiven
bleibt es bei "text". Mag etwas doof sein, ist aber so.

Solltest du aber wirklich eine Konvertierung von/nach HEX suchen, so
melde dich nochmal.

Übrigens:
Ein Byte ist erstmal ein Byte.
Dass es von der Programmieroberfläche HEX angezeigt wird, ändert daran
nichts.
Kein Computer braucht HEX.
Bytes werden nur HEX angezeigt, damit wir Menschen sie besser auswerten
können.

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.