mikrocontroller.net

Forum: Compiler & IDEs ASCII Empfangsstring in Int wandeln


Autor: Bernd B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eine kleine Frage.

ich enpfange 3 ASCII Bytes mit einem Mega8 über die UART.

Nun möchte ich diesen String in eine INT Zahl wandeln.
Leider verzweifele ich daran bald.

Mein Ansatz sieht wie folgt aus:
Ich schreibe drei ASCII Zahlen in einen "empfangs_sring",
will dann den "empfangs_string" in Int wandeln.
Problem, "Wert" ist immer 0.

char empfangs_string[4];
unsigned int Wert = 0;

Die Funktion zur Wandlung:

empfangs_string[0] = '\0';

while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
strcat(empfangs_string, myReceivedByte);

while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
strcat(empfangs_string, myReceivedByte);

while(RxBufferStatus()==0);
myReceivedByte = RxBufferLesen();
strcat(empfangs_string, myReceivedByte);

Wert = atoi(empfangs_string);

Bitte um etwas Hilfe.

Gruß Bernd

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

Bewertung
0 lesenswert
nicht lesenswert
strcat kann nicht dazu verwendet werden, einzelne Zeichen an einen 
String anzuhängen.

Du könntest aber folgendermaßen vorgehen:
for (i = 0; i < 3; i++)
{
  while(RxBufferStatus()==0);
  empfangs_string[i]  = RxBufferLesen();
}

empfangs_string[3] = '\0';

Wert = atoi(empfans_string);

Autor: Bernd B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die schnelle Hilfe,
womit kann man einzelne Zeichen anfügen?
Geht das überhaupt?

Dein Vorschlag hat auf Anhieb geklappt,
nur fügt die atoi leider keine Nullen bei kleinen Werten voran.

Gruß Bernd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd B. schrieb:
> Hallo,
>
> danke für die schnelle Hilfe,
> womit kann man einzelne Zeichen anfügen?

händisch

> Geht das überhaupt?

händisch gehts immer.

Aber um die str... Funktionen zu nutzen, brauchst du zuallererst 
Strings. Nur weil du ein paar Zeichen in ein Array schreibst, hast du 
deswegen noch lange keinen String. Ein String hat immer ein \0 Byte am 
Ende, das sein Ende markiert. SChreibst du selber keines rein, dann hast 
du auch keinen String.

Und strcat hängt nun mal einen String an einen anderen an.
(Aber es steht dir natürlich frei, dir eine Funktion charcat zu machen, 
die ein einzelnes Zeichen an einen String anhängt)
void charcat( char* str, char c )
{
  while( *str )
    str++;
  *str++ = c;
  *str = '\0';
}

Jetzt hast du eine Funktion, die an einen String ein einzelnes Zeichen 
anhängt.
  empfangs_string[0] = '\0';

  while(RxBufferStatus()==0);
  charcat( empfangs_string, RxBufferLesen() );

  while(RxBufferStatus()==0);
  charcat( empfangs_string, RxBufferLesen() );

  while(RxBufferStatus()==0);
  charcat( empfangs_string, RxBufferLesen() );

  Wert = atoi(empfangs_string);

> nur fügt die atoi leider keine Nullen bei kleinen Werten voran.

atoi erzeugt eine Zahl!
Was immer deren Wert ist, ist ihr Wert

Was du dann bei einer erneuten Ausgabe aus dieser Zahl machst, ob du sie 
mit führenden 0-en ausgibst oder nicht, ist eine andere Geschichte.

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Wert = atoi(empfangs_string);

wobei atoi auch nicht unbedingt der Weisheits letzterschluss, den im 
Fehler fall zum beispiel
WERT atoi("AAA"); 

prüft atoi nicht und liefert im Zweifel 0. Das Problem kann sein das 
diese auch ein Sinnvoller Wert ist und du so mit keine Möglichkeit der 
Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion 
und Programmier dir im Zweifel lieber was mit Fehler Händler  ist auch 
nicht so schwer das zu Implementieren. Ich würde das so machen

int my_atoi(char *str, void (*trap)(void) )
{
        int i=0;
        int value=0;
        int digit= 0;

        if (str == NULL ) {
                trap();
                return 0;
        }

        while ( str [i] != '\0' ) {
                switch (str[i]) {
                        case '0': digit = 0; break;
                        case '1': digit = 1; break;
                        case '2': digit = 2; break;
                        case '3': digit = 3; break;
                        case '4': digit = 4; break;
                        case '5': digit = 5; break;
                        case '6': digit = 6; break;
                        case '7': digit = 7; break;
                        case '8': digit = 8; break;
                        case '9': digit = 9; break;
                        default :
                                trap();
                                return 0;
                                break;
                };
                value = value * 10 + digit;
                i++;
        }

        return value;
}

void my_trap(void)
{
       /* Hier das Fehlerhändling Rein zum beispiel*/
        printf(" Wir werden Sterben !!! my_atoi geht schief\n");
}


Der Aufruf im Programm wäre dann.

 val = my_atoi(empfangs_string ,my_trap);

Alernativ kannst du dann in die While Schleife auch noch ein Händling 
einbauen wenn der String nach X Zeichen kein '\0' hat.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Imon schrieb:

> Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion
> und Programmier dir im Zweifel lieber was mit Fehler Händler  ist auch
> nicht so schwer das zu Implementieren. Ich würde das so machen

Schau dir mal strtol() an

Allerdings geb ich dir recht, dass es zu Übungszwecken durchaus sinnvoll 
sein kann, sich sowas mal zu implementieren.

Allerdings vernünftig. Du scheinst da ein Wahnsinns-Augenmerk auf den 
Error-Handler zu legen. Viel Aufwand für nichts. Wieder: schau dir 
strtol an, wie dort das Interface aussieht. Und über den switch-case ... 
geschenkt.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Imon schrieb:
> prüft atoi nicht und liefert im Zweifel 0. Das Problem kann sein das
> diese auch ein Sinnvoller Wert ist und du so mit keine Möglichkeit der
> Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion
> und Programmier dir im Zweifel lieber was mit Fehler Händler

Oder halt einfach strtol statt atoi nehmen.

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.