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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.