UART- Sendung

Gast #2032204
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?
Gast #2032210
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.
Gast #2032268
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?
#2032318
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren