2011-01-06 4 views
0

Ich versuche, binäre Daten von einem seriellen Gerät in c auf Linux zu lesen. Das Problem ist, dass manchmal Zeichen im internen Puffer des Treibers vorhanden sind, aber das Abrufen (mit select (2)) meldet, dass das Gerät nicht zum Lesen bereit ist.Uart Puffer wird nicht gelesen

Ich habe gelesen und las den Mann von termios und alle verwandten Mann und suchte über das Internet. Ich glaube, ich habe alle Flags korrekt gesetzt (nämlich VTIME, VMIN) und ICANON unset. Ich habe versucht, auch die Funktion "tcmakeraw", aber es hat das Problem nicht gelöst.

Haben Sie irgendwelche Ideen, was ich tun soll?

Mit freundlichen Grüßen & Vielen Dank im Voraus Yannay

+3

Den Code anhängen ... – BlueDog

+1

Erinnern Sie sich daran, 'readfds' vor * jedem * Aufruf von' select() 'zu füllen? – caf

+0

Welche Art von serieller Schnittstelle? (d. h. ein echter 16550, ein 16550 Klon, ein USB Konverter, Bluetooth, Irda, ...) –

Antwort

0

Was passiert, wenn man direkt (nicht durch C) lesen /dev/ttyS0 (oder Äquivalent), nachdem Sie setserial Ihre Parameter. Können Sie die benötigten Daten außerhalb der select() bekommen?

+0

Die einzigen gesetzten Flags sind: CREAD, CLOACL, CS8, NL0, CR0, TAB0, BS0, VT0, FF0. Die Baudrate ist richtig eingestellt. VMIN = 1, VTIME = 0. Das Problem ist jedoch nicht gelöst/Ich versuche, ohne die Auswahl zu lesen. Einfach lesen und es wird kein Byte zurückgegeben. – yannay

1

Sie sollten uns den Code zeigen. Ich würde mit cfmakeraw auf dem seriellen Port beginnen. Sobald Sie im Rohmodus arbeiten, können Sie Änderungen vornehmen und sehen, wie es funktioniert. Hier ist eine Liste von Fragen und Dinge könnten Sie überprüfen:

  • nach dem Attribut ändern, zum Beispiel unter Verwendung cfmakeraw, rufen Sie tcsetattr (...) zu Ihre Änderung zu übernehmen?

  • Wie beweisen Sie, dass noch Daten im Treiberempfangspuffer vorhanden sind?

  • überprüfen Sie Ihren Systemaufruf auf Fehler?

  • Was ist das Ergebnis von stracing Ihr Programm?

bearbeiten basierend auf Ihre Kommentare: Ihr Protokoll "Garantie" .... => prüfen Sie Ihre Annahme! Unüberprüft, kristallklar Garantie sind eine gute coandidate für "unmöglichen Fehler"

Grundsätzlich: entweder select is broken, oder Ihr serieller Treiber. Der Grund für den Bruch eines seriellen Treibers ist, dass ein Hardware-Fifo nicht voll genug ist, um einen Interrupt auszulösen oder einen Interrupt zu verlieren.

+0

1. ja. 2. Es ist kompliziert. Das verwendete Protokoll garantiert nach jeder Nachricht ein ACK. Manchmal bekomme ich die Bestätigung nicht, wenn nicht mehr Daten vom Gerät gesendet werden. Ich bin 100% es ist nicht das Problem. 3. Natürlich. 4. Ich werde es versuchen, wenn alles scheitert ... – yannay