mikrocontroller.net

Forum: Compiler & IDEs int in ASCII Zeichen umwandeln


Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es eine andere Möglichkeit außer mit
sprintf(string,"%i",int)
einen interger-Wert in einen ASCII-Char umzuwandeln
(bräuchte dies für die UART-Kommunikation von Rechner zu µC)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, gibt es. Schau doch einfach mal in die stdlib.h. Da stehen 
Funktionen wie itoa, ltoa...

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
itoa hab ich schon probiert, da bekomm ich nur wirre Zeichen zurück
bräucht im Prinzip irgend eine Fkt. welche mir aus uint8_t ein char 
macht
z.B. aus 65-->A

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, meinte natürlich
sprintf(string,"%c",int)

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in geordneter reihenfolge?

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da
sprintf(string,"%c",65)
 zu speicherintensiv sein soll, wollt ich ne Fkt. welche das evtl. 
besser erledigt
bei dem Beispiel sollte "A" in string stehen

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Das kann ich nicht glauben.

(Fassung bewahren)

Probiere doch mal folgendes aus:
char string[8];

strcpy(string, "blabla");

// hier im Debugger den Inhalt von "string" ansehen

string[0] = 65;

// hier im Debugger den Inhalt von "string" ansehen

Und?

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast recht, es funktioniert
habs jetzt so gemacht:
int main (void)
{  char s[2];
  uint8_t c;
  
    uart_EnableRX();
    c=uart_getc();
    s[0]=c;
    s[1]=NULL;
    
   uart_init();
   while (!(UCSRA & (1<<UDRE)))  
    {
    }
   //sprintf(s,"%c",c);
   uart_puts( s )
hatte "s" vorher als normalen char deklariert, wenn ich aber den ASCII 
zahlenwert übergebe und die "Ende-NULL" anfüge klapt alles wunderbar
Dank!!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so umständlich? Wenn Du nur ein Zeichen speichern willst, musst Du 
keinen String verwenden:

int main (void)
{  
  uint8_t c;
  
  uart_EnableRX();
  c = uart_getc();

  uart_init();

  while (!(UCSRA & (1<<UDRE)));  

  uart_putchar(c); // oder _putc()
}

  

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
is schon klar, aber ich will sowieso nicht nur ein zeichen vom rechner 
empfangen, sondern mach da noch ne schleife bis /n kommt, halt bis ENTER 
gedrückt wird
da muss ich die einzelnen char doch auch in einem buffer string erst mal 
zusammenfassen (mein problem lag eigentlich in der uart_puts, die sendet 
den übergebenen string bis /n und bei nem char sucht die sich halt tot)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine uart_puts mag bis \n senden, eigentlich aber sollte sie bis 
zum Stringende senden, so wie es jede andere puts-Implementierung auch 
tut.

Und das Stringende wird durch \0 gekennzeichnet.

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast recht, hab jetzt
void uart_puts (char *s)
{
    while (*s!=NULL)
    {   uart_putc(*s);
        s++;
    }
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir mal das #define von NULL an ... das ist nicht ganz sauber, NULL 
als Stringterminator anzunehmen.

Knapper:
void uart_puts(char *s)
{
  while (*s)
    uart_putc(*s++);
}

  

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moment, ich hatte es ganz am anfang so ähnlich
void uart_puts (char *s)
{
    while (*s)
    {   uart_putc(*s);
        s++;
    }
}
also lags doch nicht daran???
jetzt fange ich langsam an zu zweifeln

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, jetzt sollte ich wohl mal den ganzen code posten:
#include <avr/io.h>
#include <inttypes.h> 

#define UART_BAUD_RATE 19200UL //Baudrate 


void uart_init(void)
{
    // USART-Init 19200 Baud bei 16MHz für Mega32
    UCSRB |= ( 1 << TXEN );      // UART TX einschalten
    UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
    UBRRH  = 0;                                 // Highbyte ist 0
    UBRRL  = 51;                                // Lowbyte ist 51
} 

void uart_EnableRX(void)
{
    UCSRB |= ( 1 << RXEN );
}

void uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE))) {}  // warten bis Senden möglich 
    UDR = c;                         // Zeichen senden   
}

void uart_puts (char *s)
{
    while (*s)
    {   uart_putc(*s);
        s++;
    }
}

uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC))) {} // warten bis Zeichen verfügbar
    return UDR;                    // Zeichen aus UDR zurueckgeben
}

int main (void)
{  char s[2];
  uint8_t c;
  
    uart_EnableRX();
    c=uart_getc();
    //s[0]=c;
    //s[1]=NULL;

    uart_init();

    while (!(UCSRA & (1<<UDRE))) {} // warten bis Senden möglich                   
  
    //uart_putc( c );  // funktioniert!!!!
    uart_putc( c );  //mit s anstatt c funktioniert alles wunderbar???
    uart_puts( "\r\n" );

    return 0; 
}


  

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum klappt uart_putc( c );
aber uart_puts( c ); nicht?????

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil c nur ein Zeichen ist und kein string (d.h. ein _array_von chars) 
ist.

just for fun: mach mal "uart_puts(&c)" ;-)
dann siehst du, dass Arrays als Pointer übergeben werden und dass 
strings in C "\0" terminiert sind

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil c ein einzelner Character ist und uart_puts einen Zeiger auf einen 
String mit Nullterminator erwartet! Wenn Du die Funktionen doch selbst 
geschrieben hast, dann solltest Du auch wissen, welche Parameter sie 
haben. Steht doch wirklich alles in Deinem geposteten Code!

Autor: cien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin trotzdem von ausgegangen, dass er damit klar kommt obwohl das "ende 
zeichen" beim char fehlt
hätt ja sein könn, dass der compiler merkt, dass das nur ein char is, 
wenns denn schon so definiert wurde (es kommt ja nicht mal ne warnung) 
und dass er weiss, dass die länge halt nur 1 ist
beim feld is es ja klar, da wird halt immer auf NULL (bzw. \0)geprüft

Autor: Goascii (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal auf
https://goascii.de nach

Autor: Goascii (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.