Forum: PC-Programmierung serielle Schnittstelle sendet nicht mehr


von Tobias E. (worluk)


Lesenswert?

Hallo zusammen,

ich stehe im Moment vor folgendem Problem:
Meine PC Anwendung sendet Vorgabewerte über die serielle Schnittstelle 
(/dev/ttyS0 57600 Baud) an meinen Atmega 128. Der Atmega sendet 
kontinuierlich Daten an den PC.

Durch Eingabe im Programm am PC können die Vorgabewerte verändert 
werden, sprich sie werden erneut an den µc geschickt.

Dies geht einige Male gut, nach einiger Zeit wird allerdings nichts mehr 
gesendet. perror gibt mir als Meldung "Die Ressource ist zur Zeit nicht 
verfügbar" aus.

Das Problem ist leider nur insoweit reproduzierbar als dass ich sagen 
kann es tritt irgendwann auf, wie oft ich Vorgabewerte senden kann ist 
allerdings unterschiedlich. Die oben genannte Fehlermeldung die ich mir 
selbst ausgeben lasse ist so ziemlich alles was ich an Fehlermeldungen 
beim Durchforsten der Logfiles des Systems finden konnte.

Hilfe oder auch nur mögliche Lösungsansätze wären sehr hilfreich :)

Tobi

von Stefan (Gast)


Lesenswert?

"The routine  perror() produces a message on the standard error output, 
describing the last error encountered during a call to a system or 
library function."

D.h. die Frage ist welche Systemfunktion oder Libraryfunktion hast du 
als letztes vor perror() aufgerufen. Die bzw. deren Fehlercode in errno 
ist der unmittelbare Bezugspunkt für die Meldung.

Kann es z.B. sein, dass du in deiner Anwendung jedes Mal die serielle 
Schnittstelle öffnest aber nie schliesst und dir die Dateihandles 
ausgehen?

von Tobias E. (worluk)


Lesenswert?

Hi,

perror ruf ich direkt nach write auf. Also sollte der Fehler sich auf 
diese Funktion beziehen.

Noch bisschen in meinem Code rumgewurschtelt.
Ich habe ein Array welches mir als Puffer dient.
In diesem stehen sobald gesendet werden soll 108 bytes.
write gibt, wie ich jetz festgestellt habe zu Beginn noch 108 zurück, 
was ja richtig wäre, nur leider kommt davon nichts an meinem Chip an.

Ich habe noch mal zum Testen einen Breakpoint zu Beginn der seriellen 
ISR gesetzt der nie aktiv wird.
Würde vom Chip was empfangen würde dieser das mit einem Byte bestätigen.
Solange das nicht erfolgt wird versucht die Daten weiterzusenden. write 
quittiert mir das einige Male mit 108, dann auf einmal mit -1 und oben 
beschriebener Meldung.

Die Filedesktiptoren habe ich mir mal ausgeben lassen, auch hab ich eine 
Variable eingebaut die zählt wie oft die Schnittstelle geöffnet wird 
ohne sie zu schliessen. Dort kann ich leider kein Problem finden.

Tobi

von Stefan B. (stefan) Benutzerseite


Lesenswert?

write() schreibt wahrscheinlich in einen Puffer und dieser Puffer ist 
irgendwann voll, weil davon nichts über die serielle Schnittstelle raus 
geht.

Das hört sich für mich nach einem Initialisierungsproblem der 
Schnittstelle an. Gibt es auffällige Fehlercodes beim open() oder 
tcsetattr()? Welche Konfiguration (1) setzt du beim tcsetattr() - RAW 
Modus?

Hast du bereits dein Programm mit dem Artikel 
http://www.mikrocontroller.net/articles/Ports_benutzen_%28GCC%29 
verglichen?

Bzw. kannst du einen auf das notwendigste abgespeckten Sourcecode 
(eigenständiges Komplettprogramm, Fehler reproduzierbar) angeben?

(1) 
http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel6.shtml#6_1

von Tobias E. (worluk)


Lesenswert?

danke für die hinweise :)

hab jetz nochmal mein ganzes Flag gesetze rausgenommen und mit cfmakeraw 
die Flags generiert. Jetz hauts hin. Anscheinend wirklich ein Problem 
beim manuellen setzen.

Werd mir das nochmal anschauen, aber es funktioniert soweit denk ich 
(macht zumindest den Anschein)

Danke

Tobi

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.