PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zugriff auf Comport: Overlapped oder Nonoverlapped I/O?


Imperator Katarn
2006-01-06, 16:05:32
Hallo,

ich muß in einem Programm (unter VC++ 6) mit einem externen Gerät über den Comport (RS232) kommunizieren, und den Comport dazu ansprechen.
Nach einiger Suche nach einer dazu verwendbaren API bin ich auf diese Seite (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp) gestoßen, wo Funktionen aus der Win32-API beschrieben werden, die für meine Zwecke brauchbar sind.

Nun werden auf der Seite zwei Arten des Comport-Zugriffes genannt: Overlapped I/O und Nonoverlapped I/O. Soweit ich das verstanden habe hat Overlapped einen Multithreading-ähnlichen Effekt: der Thread, der auf einen Comport zugreift, z.B. um von diesem zu lesen, kann, während der Lesevorgang läuft, noch etwas anderes machen, so als hätte man zwei Threads. Für mich ist dieser Aspekt von Overlapped eigentlich nicht so interessant, da ich ohnehin Multithreading verwende und der auf den Comport zugreifende Thread während des Zugriffs sowieso sonst nichts tun könnte.

Deswegen würde ich eigentlich eher zu Nonoverlapped tendieren, allerdings bereitet mit da eine Sache Kopfzerbrechen. Und zwar steht auf besagter Seite:Nonoverlapped I/O is very straightforward, though it has limitations. An operation takes place while the calling thread is blocked. Once the operation is complete, the function returns and the thread can continue its work. This type of I/O is useful for multithreaded applications because while one thread is blocked on an I/O operation, other threads can still perform work. It is the responsibility of the application to serialize access to the port correctly. If one thread is blocked waiting for its I/O operation to complete, all other threads that subsequently call a communications API will be blocked until the original operation completes. For instance, if one thread were waiting for a ReadFile function to return, any other thread that issued a WriteFile function would be blocked. Es geht daraus nicht hervor, ob sich das nur darauf bezieht, wenn mehrere Thread auf den gleichen Comport zugreifen, oder auch dann gilt, wenn es um Zugriffe auf verschiedene Comports geht. D.h. wenn ein Thread eine Leseoperation auf COM1 ausführt, ob dann ein zweiter Thread, der eine Schreiboperation auf COM2 durchführen will, dadurch blockiert wird.

Das ist sehr wichtig für mich, weil das Programm an dem ich arbeite mehrere externe Geräte über unterschiedliche Comports ansteuert.

Kennt sich da jemand mit aus?

Thx for any help.