serielle Schnittstelle sendet nicht mehr

OP #545367
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
Gast #545387
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?
OP #545674
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
Persönliche Seite #545689
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
OP #545739
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

Antwort schreiben

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.

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.