Forum: Mikrocontroller und Digitale Elektronik UART- Sendung


von Großes Fragezeichen (Gast)


Lesenswert?

Hallöchen,

folgendes Problem:

Mein Programm besteht aus diesen Zeilen:


volatile char intval= 0;
volatile char val= 0;
...

val = usart_receive();
intval= atoi(val);

if(intval==1)
{
   usart_puts("intval==1");
}
else
usart_puts("intval!=1\r\n");

usart_puts("intval = ");

utoa(intval,s,10);
usart_puts(s);

...

Nachdem ich mit HTERM einen ASCII Wert von 1 gesendet habe, sieht die 
Ausgabe dann wie folgt aus:
intval!=1
intval=0


wie bediene ich die Funktion(en) atoi richtig? Derzeit habe Ich den 
Fehler, passing argument 1 of 'atoi' makes pointer from integer without 
a cast
...muss man noch ein Endezeichen hinten dran senden? wenn welches?

von form (Gast)


Lesenswert?

atoi braucht einen string als input, du hast aber nur ein einzelnes 
zeichen (ohne 0-terminator am ende).

Wenn Du eh nur einzelne Zahlen empfängst, geht es noch einfacher:
intval = usart_receive() - '0';

Das "- '0'" bewirkt das der ASCII-Offset abgezogen wird.

von Großes Fragezeichen (Gast)


Lesenswert?

hm...ok... damit kann ich erstmal weiterarbeiten... kann aber somit nun 
nur 256 unteschiedliche Steuersignale rausgeben, daher freue ich mich 
über zusätzliche Erklärungen zu folgenden Fragen:

Wie müsste ich einen String denn aufnehmen?

mitels for-Schleife ein Array füllen? Wie groß müsste so ein Array sein? 
für jeden Buchstaben des längstmöglich zu erwartenen Strings ein Fach?

Muss ich beim Senden mit HTERM dann explizit einen Nullterminator am 
Ende einfügen, also meinen gewünschten String eintippen und dann "\0" am 
Ende?

von Karl H. (kbuchegg)


Lesenswert?

Großes Fragezeichen schrieb:

> Wie müsste ich einen String denn aufnehmen?

Zeichen für Zeichen

> mitels for-Schleife ein Array füllen?

um eine for-Schleife einsetzen zu können, müsstest du wissen, wie lang 
der zu empfangende Text ist. Das weißt du aber nicht.

> Wie groß müsste so ein Array sein?
> für jeden Buchstaben des längstmöglich zu erwartenen Strings ein Fach?

mindestens.

> Muss ich beim Senden mit HTERM dann explizit einen Nullterminator am
> Ende einfügen, also meinen gewünschten String eintippen und dann "\0" am
> Ende?

Irgendein Zeichen, welches dem Empfänger sagt: Jetzt ist der Text zu 
Ende.

Üblich ist es zb, das Return zu benutzen (\n)
Denn daran sind Benutzer gewöhnt, dass sie bei einer Texteingabe diese 
mit einem Druck auf Return abschliessen.

D.h. Deine Empfangsroutine empfängt Zeichen für Zeichen, bis es ein 
Return bekommt. Die Zeichen hat es alle in einem char-Array 
zwischengespeichert und wenn der Return kommt, hängt die Empfangsroutine 
da noch einen \0 drann um daraus einen gültigen C-String zu machen und 
übergibt dann diesen String der weiteren Auswertung.

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.