Linux Serial Port: Blockieren des Lesens mit Timeout

Ich habe viele nützliche Themen und einige Tutorials studiert, aber ich habe immer noch einige Probleme mit etwas, das sehr einfach sein sollte. Als Referenz hier sind einige Themen, die ich durchgesehen habe:

Wie implementiere ich ein Timeout beim Funktionsaufruf Lesen?

Öffnen, Lesen und Schreiben über die serielle Schnittstelle in C

Auf jeden Fall habe ich ein kleines Problem. Mein Code funktioniert einwandfrei, wenn ich Daten erhalte. Wenn nicht, wird die Funktion read () angehalten und der einzige Weg, mein Programm zu verlassen, besteht darin, kill -9 zu verwenden (HINWEIS: Ich benutze die Signalverarbeitung, um dem Thread zu signalisieren, dass er die seriellen Daten zum Beenden liest. Dies ist nicht der Fall Der Täter, der read () - Aufruf, bleibt stehen, auch wenn ich meine Signalbehandlung entfernt habe. Ich versuche, einen Lesevorgang durchzuführen, der einen Block nach dem anderen blockiert und liest (wodurch die CPU-Auslastung gespart wird). Wenn der Lesevorgang jedoch keine Daten empfängt, kommt es nicht zu einer Zeitüberschreitung.

Hier sind die Einstellungen, die ich auf den Port anwende:

struct termios serial_struct;
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial_struct.c_iflag = IGNPAR;
serial_struct.c_oflag = 0;
serial_struct.c_lflag = 0;
serial_struct.c_cc[VTIME] = 1;  // timeout after .1s that isn't working
serial_struct.c_cc[VMIN] = 64;  // want to read a chunk of 64 bytes at a given time

Ich setze diese Einstellungen dann mit tcsetattr () und bestätige, dass der Port die Einstellungen über tcgetattr () erhalten hat. Ich denke, dass meine Einstellungen widersprüchlich sind, da meine Lesevorgänge blockiert zu sein scheinen und warten, bis 64 Bytes empfangen werden, aber hinsichtlich des Timeouts nichts unternehmen. Ich verstehe, dass ich select () verwenden kann, um mit einer Zeitüberschreitung umzugehen, aber ich hoffe, die mehrfachen Systemaufrufe zu vermeiden.

Wie immer vielen Dank im Voraus für die Hilfe.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage