www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik schreiben und lesen über serial Port


Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich brauche ihre Hilfe,
Im Internet habe ich ein "How do" für die serielle Kommunikation 
gefunden.
Im Dokument gibt es verschiedenen Beispiele um die Daten über die 
serielle Schnittstelle zu lesen. Ich habe mich für das canonical input 
entschieden.

Im meinem Programm sende ich ein string über die Tastatur mit der 
Funktion  writeport.Um die Antwort auszulesen  benutze ich die Funktion 
readport.
Ich kann ohne Problem senden,aber beim Lesen die Funktion blockiert 
sich, sie bleibt einfach in der while-Schleife, obwohl ich schon die 
Antwort gekriegt habe. Es scheint, als sie nicht die Abbruchbedingung 
findet. wie kann ich das Programm umformen, damit sie liest solange die 
Daten ankommen, wenn nicht der Fall ist, gibt sie mir die Möglichkeit 
ein neuer string zu senden.Im moment soll ich immer die Tastekomnination 
Strg+C drücken um den neuen String per Tastatur einzugeben.

Auf alle Hilfe bin ich sehr dankbar

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

nun, da wird wohl entweder die 0 als Endezeichen nicht gesendet oder der 
"Basis-Input-Routine" übermittelt diese nicht.

Lösung: Anderes Ende-Zeichen definieren. (Und wenns nur zum Testen ist, 
um den Fehler zu lokalisieren.)

Gerhard

Autor: Frank Esselbach (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde immer auch einen Timeout vorsehen, damit die Applikation nicht 
bis zum jüngsten Tag festhängt, wenn die Kommunikation mal gestört ist. 
Also z.B. nach folgender Regel:

"Wenn schon mal ein Zeichen angekommen ist, wird höchstens x Sekunden 
auf das Endekennzeichen gewartet und dann so getan, als wäre das 
Endekennzeichen angekommen."

Frank

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> res = read(fd,buf,255);
Die Ursache: res ist immer ungleich 0.
Wie ist read() implementiert?

Welche Plattform / Compiler?


Das ist aber auch irgendwie eigenartig geschrieben:
Erst wird explizit 0 eingetragen, zwei Zeilen später auf '\0' abgefragt.
    buf[res]=0;             /* set end of string, so we can printf */
    :
    if (buf[0]=='\0') STOP=TRUE;

Formal zwar richtig, aber warum nicht gleich in der selben Zahlenwelt 
bleiben:
    buf[res]='\0';         /* set end of string, so we can printf */
    :
    if (buf[0]=='\0') STOP=TRUE;
oder
    buf[res]=0;         /* set end of string, so we can printf */
    :
    if (buf[0]==0) STOP=TRUE;

Oder noch besser:
  while (1) {  
    res = read(fd,buf,255); 
    buf[res]=0;             /* set end of string, so we can printf */
    printf("%s\n", buf, res);
    if (buf[0]==0) break;
  }
oder
  while (1) {  
    res = read(fd,buf,255); 
    buf[res]=0;             /* set end of string, so we can printf */
    printf("%s\n", buf, res);
    if (buf[0]==0) return 1;
  }

Was macht eigentlich die Zeile:
 printf("%s\n", buf, res); 
Da fehlt doch mindestens noch ein %d
So etwa:
 printf("%s %d\n", buf, res); 

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.