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 #3750002
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 #3750124
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 #3750126
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 #3750447
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 #3750453
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 #3750722
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 #3750743
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren