Forum: Mikrocontroller und Digitale Elektronik Hex in Char casten und ab aufs Display


von Borsty B. (mantabernd)


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ß

von Easylife (Gast)


Lesenswert?

Die Leerzeichen werden schon in deinem uart_string[] enthalten sein.
groß->klein: tolower()

von Easylife (Gast)


Lesenswert?

Borsty Bürste schrieb:

ausserdem: würde

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

nicht das gleiche machen wie deine for-schleife?

von DirkB (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.

von Borsty B. (mantabernd)


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 :)

von Moby (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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Moby schrieb:
> Nö. Das Problem ist, daß Du auf unflexible C-Funktionen angewiesen bist.

Das ist kompletter Unfug. Versuchst Du hier, in die Troll-Fußstapfen von 
"c-hater" zu steigen?

von Easylife (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);

von Easylife (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
}

von Moby (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist kompletter Unfug.

Nein ist es nicht. Asm ist da einfach viel flexibler!

Easylife schrieb:
> @Moby: jaja, blabla.

Nix blabla;-)

von Pawel (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> in die Troll-Fußstapfen von
> "c-hater" zu steigen?

Machen wir es uns damit nicht etwas zu einfach, Herr Moderator???
Pawel R.

von Easylife (Gast)


Lesenswert?

Untermauere deine Behauptung mit einem einzigen Beispiel.
Ansonsten ist und bleibt es kompletter Unfug und Blablabla.

von Moby (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 ;-)

von Moby (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.

von Easylife (Gast)


Lesenswert?

Comedy pur.

von Moby (Gast)


Lesenswert?

Noch irgendwas unklar, easylife?
Ich erkläre geduldig ;-)

von Easylife (Gast)


Lesenswert?

Ne, alles beantwortet. Dankesehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.