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


von Gast (Gast)


Angehängte Dateien:

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

von Gerhard (Gast)


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

von Frank E. (Firma: Q3) (qualidat)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.
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);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.