schreiben und lesen über serial Port

Gast #1050864
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
Angehängte Dateien:
Gast
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
(Firma: Q3)
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
Moderator (Firma: Titel) Persönliche Seite
> 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.
1
    buf[res]=0;             /* set end of string, so we can printf */
2
    :
3
    if (buf[0]=='\0') STOP=TRUE;

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

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

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.