www.mikrocontroller.net

Forum: PC-Programmierung serielle Schnittstelle sendet nicht mehr


Autor: Tobias Engel (worluk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tobias Engel (worluk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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_benu... 
verglichen?

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

(1) 
http://pronix.linuxdelta.de/C/Linuxprogrammierung/...

Autor: Tobias Engel (worluk)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.