www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART- Sendung


Autor: Großes Fragezeichen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: form (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Großes Fragezeichen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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

Bewertung
0 lesenswert
nicht 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

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.