- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: Problem mit itoa()

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.02.2005
    Beiträge
    76

    Pfeil Problem mit itoa()

    Anzeige

    E-Bike
    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-...r__stdlib.html
    Und hier der Funktionsaufruf in meinem Program
    Code:
    int8_t i8 = -52;
    uart_put_int8( i8, 2);
    Und die Funktion selber:
    Code:
    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
    mfg crowdy

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    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?
    Geändert von Torrentula (18.10.2012 um 18:52 Uhr)
    MfG Torrentula

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von crowdy Beitrag anzeigen
    ... 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) - in diesem Posting unten im Codefenster. Es sind im Prinzip nur vier Zeilen notwendig. Ich hoffe dort werden sie geholfen.
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. itoa nimmt höchstens int16_t mit nem AVR??
    Von yaro im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 29.05.2009, 19:32
  2. itoa???
    Von chientech im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.05.2007, 02:31
  3. itoa
    Von chientech im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 06.12.2006, 15:52
  4. Problem mit itoa()
    Von Spurius im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 11.10.2005, 17:51
  5. itoa,sprintf,ultoa, etc. - Routinen stoppen Programm!!!
    Von surfer im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 07.01.2005, 15:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen