C++ RS232 Linux - Signal/Thread in Klasse

auron2008

Well-known member
ID: 314827
L
15 Juli 2008
803
49
Hi,

Also ich habe ein Messgerät das über die RS232 Schnittstelle kommuniziert. Es soll an den Raspberry Pi angeschlossen werden und es soll eine Konsolenanwendung in C++ (g++) enstehen.

Dafür habe ich eine SerialPort Klasse geschrieben und hier hängt's.

Um nicht ständig die RS232 Schnittstelle abzufragen möchte ich die Signale vom OS nutzen.

Und zwar muss eine Methode als static deklariert werden die aufgerufen wird wenn Daten an der Schnittstelle ankommen (mittels sigaction). Die Frage ist, wie geh's jetzt weiter ? Einen Aufruf einer Methode ist nicht möglich.

Hat dazu jemand eine elegante Lösung ?
 
Ganz dämlich: Kannst du nicht einfach von /dev/ttyS0 lesen?
Hab keine direkte Erfahrung damit, aber von der Theorie her: Ein read()-Systemcall müsste solange blockieren, d.h. den Thread wird suspended, bis dein Messgerät wieder Daten schickt. Der Kern wird dich daraufhin aufwecken und du liest die Daten.
 
Ganz dämlich: Kannst du nicht einfach von /dev/ttyS0 lesen?

Ja kann ich aber das bringt mich gerad nicht zum Ziel. Meine Aufgabe besteht darin ein Programm zu schreiben um die Kommunikation zu ermöglichen. Später soll aus den von mir erstellten Klassen ein neues geschrieben werden um die Steuerung des Gerätes zu vollziehen (bestimmt Werte müssen nachgeregelt werden).

Hab keine direkte Erfahrung damit, aber von der Theorie her: Ein read()-Systemcall müsste solange blockieren, d.h. den Thread wird suspended, bis dein Messgerät wieder Daten schickt. Der Kern wird dich daraufhin aufwecken und du liest die Daten.
Diese Idee hatte ich auch schon aber bringt das gleiche Problem mit sich. Ich kann zwar einen Thread in einer Klasse erzeugen aber halt nur auf static member die wiederum keinen Zugriff auf die Methoden haben z.B. die read Methode für den seriellen Port. Ablauf wäre : Thread gestoppt -> Signal kommt -> starte Thread und lese die Daten -> Thread stopp -> rufe methode um Daten anzuzeigen/übergeben. <- funktioniert nicht da signalhandler und thread als static stehen müssen.

Hab jetzt aber eine Lösung gefunden ohne Thread sondern mit den Signalen von Linux (SIGIO) vergleichbar mit Interrupts beim µC. Wenn Interesse besteht kann ich das Morgen posten, krieg das jetzt nicht mehr hin ^^