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
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.