Problem mit Auslesen des Seriellen Ports

Sadik

Mitglied

Ok, ich habe ein Programm geschrieben, mit dem man über den Seriellen Port unter Linux kommunizieren kann. Grundlage war das Miniterm Programm.

Danach wollte ich es abändern, so daß 2 Instanzen des Programmes gleichzeitig über einen Seriellen Port kommunizieren können (ja ich weiß das hat so gut wie keine praktische Funktion, es ging um die Herausforderung).

Nun nun habe ich es soweit das es funktioniert, also das jeweils ein Prozess zuhört wenn ein anderer Daten sendet (Tasteneingabe, getchar()), und sobald der Sender wechselt, der neue Hörer lauscht (realisiert über eine Fifostruktur, in das jeweils die Process ID des schreibenden gespeichert wird).

Der Lauschen-Teil funktioniert allerdings nicht. Nur bei jedem 2. Tastenanschlag gibt das Programm wirklich was aus, aber es werden alle Zeichen gesendet (Ausgabe nach jedem 2. Anschlag trotzdem korrekt, Daten liegen im Buffer korrekt vor) Deswegen denke ich der Fehler liegt beim auslesen.

Beispiel: Ich tippe "Hallo" in Terminal "A"
in Terminal B erscheint "Hal"
ich tippe in Terminal A "Huhu"
in Terminal B erscheint "lo"
Ich tippe in Terminal B "Tach"
in Terminal A erscheint "Hu"
usw pp..
(da beide Prozesse aus demselben Buffer lesen, ist es klar das In terminal A dadurch erscheinen kann, was auch in Terminal A geschrieben wurde, aber ohne diese Nur-bei-jedem-2.-Tastendruck-Verzögerung würde das Problem nicht auftreten..)

Folgend mein Code, in dem der Lauschen-Teil realisiert ist, kommentiert, und noch ein paar Infos.

fd = Serieller Port
fdd = Fifo

Code:
while (STOP==FALSE)
{
fdd = open("fifo0001", O_RDONLY); // Fifo öffnen
read(fdd,&e,sizeof(e)); // Inhalt auslesen (Process ID des Senders)
if (e != s) { // Inhalt überprüfen (e = FremdID, s = eigene PID, und wenn der andere Process gesendet hat...
read(fd,&c,1); // ...Seriellen Port auslesen...
write(1,&c,1); // ...und ausgeben..
close(fdd); // Fifo schließen
}
}

Man beachte: Wenn ich die if-Schleife entferne funktioniet es einwandfrei, nur dann blockiert einer der Prozesse mit einem Dauer-Read den Port, so daß der Wechsel nicht mehr gegeben ist :-\
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück