Forum: Compiler & IDEs int in ASCII Zeichen umwandeln


von cien (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von cien (Gast)


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

von cien (Gast)


Lesenswert?

sorry, meinte natürlich
1
sprintf(string,"%c",int)

von pumpkin (Gast)


Lesenswert?

in geordneter reihenfolge?

von cien (Gast)


Lesenswert?

da
1
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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein. Das kann ich nicht glauben.

(Fassung bewahren)

Probiere doch mal folgendes aus:
1
char string[8];
2
3
strcpy(string, "blabla");
4
5
// hier im Debugger den Inhalt von "string" ansehen
6
7
string[0] = 65;
8
9
// hier im Debugger den Inhalt von "string" ansehen

Und?

von cien (Gast)


Lesenswert?

hast recht, es funktioniert
habs jetzt so gemacht:
1
int main (void)
2
{  char s[2];
3
  uint8_t c;
4
  
5
    uart_EnableRX();
6
    c=uart_getc();
7
    s[0]=c;
8
    s[1]=NULL;
9
    
10
   uart_init();
11
   while (!(UCSRA & (1<<UDRE)))  
12
    {
13
    }
14
   //sprintf(s,"%c",c);
15
   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!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

1
int main (void)
2
{  
3
  uint8_t c;
4
  
5
  uart_EnableRX();
6
  c = uart_getc();
7
8
  uart_init();
9
10
  while (!(UCSRA & (1<<UDRE)));  
11
12
  uart_putchar(c); // oder _putc()
13
}

  

von cien (Gast)


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)

von Rufus Τ. F. (rufus) Benutzerseite


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.

von cien (Gast)


Lesenswert?

hast recht, hab jetzt
1
void uart_puts (char *s)
2
{
3
    while (*s!=NULL)
4
    {   uart_putc(*s);
5
        s++;
6
    }
7
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

Knapper:
1
void uart_puts(char *s)
2
{
3
  while (*s)
4
    uart_putc(*s++);
5
}

  

von cien (Gast)


Lesenswert?

moment, ich hatte es ganz am anfang so ähnlich
1
void uart_puts (char *s)
2
{
3
    while (*s)
4
    {   uart_putc(*s);
5
        s++;
6
    }
7
}
also lags doch nicht daran???
jetzt fange ich langsam an zu zweifeln

von cien (Gast)


Lesenswert?

ok, jetzt sollte ich wohl mal den ganzen code posten:
1
#include <avr/io.h>
2
#include <inttypes.h> 
3
4
#define UART_BAUD_RATE 19200UL //Baudrate 
5
6
7
void uart_init(void)
8
{
9
    // USART-Init 19200 Baud bei 16MHz für Mega32
10
    UCSRB |= ( 1 << TXEN );      // UART TX einschalten
11
    UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
12
    UBRRH  = 0;                                 // Highbyte ist 0
13
    UBRRL  = 51;                                // Lowbyte ist 51
14
} 
15
16
void uart_EnableRX(void)
17
{
18
    UCSRB |= ( 1 << RXEN );
19
}
20
21
void uart_putc(unsigned char c)
22
{
23
    while (!(UCSRA & (1<<UDRE))) {}  // warten bis Senden möglich 
24
    UDR = c;                         // Zeichen senden   
25
}
26
27
void uart_puts (char *s)
28
{
29
    while (*s)
30
    {   uart_putc(*s);
31
        s++;
32
    }
33
}
34
35
uint8_t uart_getc(void)
36
{
37
    while (!(UCSRA & (1<<RXC))) {} // warten bis Zeichen verfügbar
38
    return UDR;                    // Zeichen aus UDR zurueckgeben
39
}
40
41
int main (void)
42
{  char s[2];
43
  uint8_t c;
44
  
45
    uart_EnableRX();
46
    c=uart_getc();
47
    //s[0]=c;
48
    //s[1]=NULL;
49
50
    uart_init();
51
52
    while (!(UCSRA & (1<<UDRE))) {} // warten bis Senden möglich                   
53
  
54
    //uart_putc( c );  // funktioniert!!!!
55
    uart_putc( c );  //mit s anstatt c funktioniert alles wunderbar???
56
    uart_puts( "\r\n" );
57
58
    return 0; 
59
}

  

von cien (Gast)


Lesenswert?

warum klappt uart_putc( c );
aber uart_puts( c ); nicht?????

von Joerg X. (Gast)


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

von johnny.m (Gast)


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!

von cien (Gast)


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

von Goascii (Gast)


Lesenswert?

Schau mal auf
https://goascii.de nach

von Goascii (Gast)


Lesenswert?


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.