Hex in Char casten und ab aufs Display

OP #3749846
Lesenswert?
• ▲
▼
N'abend...

ich bräuchte kurz eine kleine Hilfestellung.

Es geht um ein über den UART empfangenes Array aus HEX werten die man zu 
einem Text zusammensetzen muss, quasi zu CHAR casten.

Mein Uart String liegt im Array uart_string[].

Für die Display Ausgabe verwende ich folgende Routine:
1
uint8_t size = sizeof(uart_string)/sizeof(uart_string[0]);
2
uint8_t i;
3
      
4
for (i=0; i < size; i++)
5
{
6
        
7
 sprintf(ausgabe,"%c",uart_string[i]);
8
 lcd_setcursor(i, 2);
9
 lcd_string(ausgabe);
10
        
11
}

Das funktioniert leider nur bedingt, da ich nach jedem Zeichen auf dem 
Display einen Leerschritt mitbekomme und jedes Zeichen groß geschrieben 
wird (letzteres wäre aktuell zu vernachlässigen).

An und für sich bekomme ich aber den korrekten Text, nur eben leider mit 
Leerschritten nach jedem Zeichen.

Was mache ich falsch?
Danke, Gruß
Gast
Lesenswert?
• ▲
▼
Geht ein
1
lcd_string(uart_string);
 nicht?
Gibt es kein lcd_char ?

Und wenn das gar nicht geht, dann kann man zumindest auf das sprintf 
verzichten
1
char temp[2] = {0};
2

3
for (i=0; i < size; i++)
4
{       
5
 temp[0] = uart_string[i];
6
 lcd_setcursor(i, 2);
7
 lcd_string(temp);
8
        
9
}
Das wird nicht das Leerstellenproblem beheben.
OP
Lesenswert?
• ▲
▼
> Die Leerzeichen werden schon in deinem uart_string[] enthalten sein.
> groß->klein: tolower()

Danke :)

> ausserdem: würde

> lcd_setcursor(0, 2);
> lcd_string(uart_string);

> nicht das gleiche machen wie deine for-schleife?

Nein da bleibt das Display leer.
1
char temp[2] = {0};
2

3
for (i=0; i < size; i++)
4
{       
5
 temp[0] = uart_string[i];
6
 lcd_setcursor(i, 2);
7
 lcd_string(temp);
8
        
9
}

Dadurch fang ich mir die ganzen Steuerzeichen vom UART mit ein. Wirres 
Zeug zwischen den Buchstaben... Da sind die Leerzeichen noch richtig 
schön dagegen :)

Wie ihr aber schon vermutet habt liegt das Problem mit den Leerzeichen 
am Datensatz selbst. Ich werde das wohl anderweitig filtern müssen.

Danke aber auf jeden Fall schon mal :)
Gast
Lesenswert?
• ▲
▼
Borsty Bürste schrieb im Beitrag
> Wie ihr aber schon vermutet habt liegt das Problem mit den Leerzeichen
> am Datensatz selbst. Ich werde das wohl anderweitig filtern müssen.

Nö. Das Problem ist, daß Du auf unflexible C-Funktionen angewiesen bist. 
Machs in Asm, dann lösen sich solche künstlichen Probleme in Luft auf 
und Du bist auf jede denkbare Situation bestens vorbrreitet.
Gast
Lesenswert?
• ▲
▼
Versuchs mal damit, macht auch gleich die "tolower" conversion:

@Moby: jaja, blabla.

1
void extract_hex(char *s)
2
{
3
        char *p0, *p1;
4
        p0 = s;
5
        p1 = s;
6
        while (*p0++)
7
        {
8
                if ((*p0 >= '0' && *p0 <= '9') || (*p0 >= 'a' && *p0 <= 'f'))
9
                        *p1++ = *p0;
10
                else if (*p0 >= 'A' && *p0 <= 'F')
11
                        *p1++ = *p0 +'a' - 'A';
12
        }
13
        *p1 = 0;
14
}
15

16

17
(...)
18

19
extract_hex(uart_string);
Gast
Lesenswert?
• ▲
▼
Andererseits:
evtl. enthält dein "uart_string" ja binärdaten.
Wenn du die hexadezimal anzeigen willst, dann geht das anders:
1
uint8_t size = sizeof(uart_string)/sizeof(uart_string[0]);
2
uint8_t i;
3
   
4
char ausgabe[3];
5
   
6
for (i=0; i < size; i++)
7
{
8
        
9
 sprintf(ausgabe,"%02x",uart_string[i]);
10
 lcd_setcursor(i*2, 2);
11
 lcd_string(ausgabe);
12
}
Gast
Lesenswert?
• ▲
▼
ld r16,counter
ld Y,Quellpointer
ld Z,Zielpointer
loop: ld r17,Y+
call bin2hex  ;wandelt r17 in Ascii-Hex r17:r18,ignoriert Leerzeichen
st Z+,r17
st Z+,r18
dec r16
brne loop

... um mal das Prinzip einer einfachen Umkopieraktion in simply Asm zu 
umreißen. Und wer jetzt nach dem Code von bin2hex schreit- sowas 
einfaches hat der erfahrene Asm Programmierer längst in seiner Sammlung! 
Alles Klartext ohne Umschweife und unverständliche Syntax Klimmzüge. Ist 
doch tausendmal mehr easy als kryptischer easylife C Code ;-)
Gast
Lesenswert?
• ▲
▼
Ok, und damit Bin2hex gar nicht erst mit Leerzeichen zu tun bekommt, 
einfach nach der Loop: Zeile noch ein cpi r17,$20, breq loop2, welches 
vorm dec 16 steht. So der Counter nicht genau angegeben werden kann 
testet man einfach aufs erste ungültige Zeichen im Quellpuffer.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 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.