PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit itoa()



crowdy
18.10.2012, 18:10
Hi,
bei der itoa() Funktion habe ich ein Problem, das ich auch mit Hilfe der Dokumentation nicht lösen konnte. Ich möchte nämlich ein int8_t als Binärzahl mit Hilfe von itoa über den USART ausgeben. Theoretisch bräuchte ich dafür einen 9-stelligen String, dabei tritt aber anscheinend ein Overflow auf und das Programm stürzt ab. Mit einem 17-stelligen String funktioniert es. Ich möchte allerdings, da es ja auch nur eine 8-bit breite Variable ist, diese auch nur mit 8-Stellen bzw. 9 ausgeben. In einem Beispiel der Dokumentation ist ein ganz ähnliches Beispiel angegeben. Der angehängte Code ist diesem Beispiel sehr ähnlich und funktioniert dennoch nicht.

Hier der Link zur Doku:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html
Und hier der Funktionsaufruf in meinem Program


int8_t i8 = -52;
uart_put_int8( i8, 2);
Und die Funktion selber:

void uart_put_int8( int8_t val, uint8_t rdx )
{
char str_val[9], str_rdx[3];

uart_put_str( itoa( val, str_val, rdx ) );

switch( rdx )
{
case 2: uart_put_str( "(bin)" );
break;

case 10: break;

case 16: uart_put_str( "(hex)" );
break;

default: uart_put_char('(');
uart_put_str( utoa( rdx, str_rdx, 10 ) );
uart_put_char(')');
break;
}
}

Mit freundlichen Grüßen

Torrentula
18.10.2012, 18:38
Aus der Doku:


you need to supply a buffer with a minimal length of 8 * sizeof (int) + 1 characters


Die Funktion itoa() macht aus dem integer ja einen String, d.h. in C ein Array aus chars. Ein char ist 8 bit groß, du brauchst also für jede Stelle 8 bits.

Bei Radix 10 sind das dann 3 Stellen zu je 8 bits macht 24 bits insgesamt.

Bei einer Binärzahl wären das sogar 8 Stellen (Bit 7 ist das signed bit) + 1 Stelle für das eventuelle negative Vorzeichen zu je 8 bit macht also 64 bits die über den USART rausgeschoben werden.

EDIT: Warum möchtest du die Zahl binär ausgeben? Benutzt du es für ein User Interface (deshalb wird vorher 'hex' bzw 'bin' ausgegeben?) oder ist das eher was für eine Kommunikation unter zwei Controllern?

oberallgeier
18.10.2012, 19:26
... ein int8_t als Binärzahl mit Hilfe von itoa über den USART ausgeben ...Dass ein ASCII keine Binärzahl ist (Integer to ASCII ! !) hast Du ja schon entdeckt. Etwas Ähnliches was Dir vermutlich vorschwebt hatte ich mal für (m)ein LCD gemacht - eine Integerzahl nach einer Darstellung als Binärzahl zu übersetzen. Das ist total easy - man muss nur tricky genug denken.

In unseren Computern liegt die Integerzahl praktischerweise ja schon binär vor - nur verheimlicht der Computer das vor uns, weil wir binär nicht so fit lesen können - denkt er. Du musst also nix anderes tun, als diese bereits vorhandene Integerzahl in ASCII so umwandeln, dass sie so dasteht, wie sie der Computer (unserer Meinung nach) als Folge von Nullen und Einsen sieht. Am einfachsten gehts mit einem Bit - sonst muss man eine Bytetrennung machen.

(M)ein Codebeispiel gabs vor Monaten - guck Dir das mal an (klick) (https://www.roboternetz.de/community/threads/47783-3-Achs-Beschleunigungssensor-sensationell-günstig-!?p=486071&viewfull=1#post486071) - in diesem Posting unten im Codefenster. Es sind im Prinzip nur vier Zeilen notwendig. Ich hoffe dort werden sie geholfen.