Forum: Compiler & IDEs Byto to ASCII für Usart


von Tio T. (misterten)


Lesenswert?

Hi,

ich steh hier grad aufm Schlauch.
Ich möchte per usart z.B. '\x54' ausgeben, was 'T' ergibt. Nun habe ich 
aber die Zahl 54 im Byte stehen. Wie kann ich aus diesem Byte das 
ASCII-Zeichen ausgeben? Ich habe versucht, das Byte mit sprintf() 
umzuwandeln, hat aber keinen erfolg gebracht.

grüße

von Karl H. (kbuchegg)


Lesenswert?

Tio T. schrieb:
> Hi,
>
> ich steh hier grad aufm Schlauch.
> Ich möchte per usart z.B. '\x54' ausgeben, was 'T' ergibt. Nun habe ich
> aber die Zahl 54 im Byte stehen.

Du hast vielleicht 0x54 im Byte stehen?

> Wie kann ich aus diesem Byte das
> ASCII-Zeichen ausgeben?

Einfach ausgeben.

> Ich habe versucht, das Byte mit sprintf()
> umzuwandeln,

Du brauchst nichts umzuwandeln. Speise das Byte ganz einfach in deine 
UART-Character Ausgaberoutine ein und alles wird gut.

von Tio T. (misterten)


Lesenswert?

Na, das einfach-mal-ausgeben habe ich natürlich schon ausprobiert.. ;) 
Klappt leider nicht.

von Karl H. (kbuchegg)


Lesenswert?

Tio T. schrieb:
> Na, das einfach-mal-ausgeben habe ich natürlich schon ausprobiert.. ;)
> Klappt leider nicht.

Dann zeige Code.

Wenn du in einem Byte einen Zahlenwert hast, der einem ASCII Zeichen 
entspricht, und du schickst diesen Code an ein Terminal, dann zeigt das 
Terminal das zu diesem Code gehörende Zeichen an.

Da braucht nichts umformatiert oder sonst irgendwie bearbeitet zu 
werden.

von Tio T. (misterten)


Lesenswert?

Also, folgenden Code fürs Usart habe ich:
1
void write_usart(unsigned char usart_data)
2
{  while(!U2STAbits.TRMT);        // TXREG leer ???
3
  U2TXREG  = usart_data ;
4
}
5
6
void usart_puts(const char *s)        // schreibt textstring auf usart
7
{  while(*s)  
8
  {  write_usart(*s++);
9
  }
10
}


Wenn ich usart_puts("\x54") nutze, bekomme ich "T".
Wenn ich usart_puts(0x54) nutze, bekomme ich "".

von Karl H. (kbuchegg)


Lesenswert?

Tio T. schrieb:
> Also, folgenden Code fürs Usart habe ich:
>
>
1
void write_usart(unsigned char usart_data)
2
> {  while(!U2STAbits.TRMT);        // TXREG leer ???
3
>   U2TXREG  = usart_data ;
4
> }
5
> 
6
> void usart_puts(const char *s)        // schreibt textstring auf usart
7
> {  while(*s)
8
>   {  write_usart(*s++);
9
>   }
10
> }
11
>
>
>
> Wenn ich usart_puts("\x54") nutze, bekomme ich "T".

Das wage ich zu bezweifeln :-)

> Wenn ich usart_puts(0x54) nutze, bekomme ich "".

Aber nur zufällig. Das hätte auch was ganz anderes ergeben können :-)

Und richtig wäre gewesen

  write_usart( 0x54 );


Ich sagte doch: Speise das Byte in deine Character-Ausgaberoutine ein. 
Character, nicht String!

von Tio T. (misterten)


Lesenswert?

kopfklatsch

Klar, ich dachte, dass ich das auch schon versucht hätte, aber ich hatte 
es mit write_usart(54) getestet. Ohje....

Danke!
:-)

von micha (Gast)


Lesenswert?

Hm irgrendwie ist deine Frage nicht ganz eindeutig...

Hast Du den String "\x54" (also 4 Zeichen) oder den Wert "54" (dezimal) 
oder den Hex-Wert "0x54"?

Der hex-Wert und die Datstellung "T" sind synonym, d.h. überall wo "T" 
in einer Datei steht siehst Du in einem HEx-Editor "0x54" und vis-à-vis. 
Daher sollte ein Terminal Programm ein "T" ausgeben, wenn es hex "0x54" 
empfängt. Wenn nicht ist was faul (little/big endian probelm zwischen 
sender/empfänger, baudrate?). Also einfach den Wert per Uart ausgeben. 
Nebenbei, Rs232 überträgt IMHO Big-Endian...

http://de.wikipedia.org/wiki/Ascii#ASCII-Tabelle

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.