Forum: Compiler & IDEs ASCII Empfangsstring in Int wandeln


von Bernd B. (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

Du könntest aber folgendermaßen vorgehen:
1
for (i = 0; i < 3; i++)
2
{
3
  while(RxBufferStatus()==0);
4
  empfangs_string[i]  = RxBufferLesen();
5
}
6
7
empfangs_string[3] = '\0';
8
9
Wert = atoi(empfans_string);

von Bernd B. (Gast)


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

von Karl H. (kbuchegg)


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)
1
void charcat( char* str, char c )
2
{
3
  while( *str )
4
    str++;
5
  *str++ = c;
6
  *str = '\0';
7
}

Jetzt hast du eine Funktion, die an einen String ein einzelnes Zeichen 
anhängt.
1
  empfangs_string[0] = '\0';
2
3
  while(RxBufferStatus()==0);
4
  charcat( empfangs_string, RxBufferLesen() );
5
6
  while(RxBufferStatus()==0);
7
  charcat( empfangs_string, RxBufferLesen() );
8
9
  while(RxBufferStatus()==0);
10
  charcat( empfangs_string, RxBufferLesen() );
11
12
  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.

von Imon (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wert = atoi(empfangs_string);

wobei atoi auch nicht unbedingt der Weisheits letzterschluss, den im 
Fehler fall zum beispiel
1
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
1
int my_atoi(char *str, void (*trap)(void) )
2
{
3
        int i=0;
4
        int value=0;
5
        int digit= 0;
6
7
        if (str == NULL ) {
8
                trap();
9
                return 0;
10
        }
11
12
        while ( str [i] != '\0' ) {
13
                switch (str[i]) {
14
                        case '0': digit = 0; break;
15
                        case '1': digit = 1; break;
16
                        case '2': digit = 2; break;
17
                        case '3': digit = 3; break;
18
                        case '4': digit = 4; break;
19
                        case '5': digit = 5; break;
20
                        case '6': digit = 6; break;
21
                        case '7': digit = 7; break;
22
                        case '8': digit = 8; break;
23
                        case '9': digit = 9; break;
24
                        default :
25
                                trap();
26
                                return 0;
27
                                break;
28
                };
29
                value = value * 10 + digit;
30
                i++;
31
        }
32
33
        return value;
34
}
35
36
void my_trap(void)
37
{
38
       /* Hier das Fehlerhändling Rein zum beispiel*/
39
        printf(" Wir werden Sterben !!! my_atoi geht schief\n");
40
}

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.

von Karl H. (kbuchegg)


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.

von Rolf M. (rmagnus)


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.

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.