Snypoo Geschrieben 25. März 2002 Geschrieben 25. März 2002 Hallo, gibt es eine Möglichkeit, die Serielle Schnittstelle RS232 mit zwei Handles gleichzeitig anzu sprechen? Ich versuche sie über: CommHandle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); Meinen Handle zu öffnen und Dachte, das ich durch die SHARE Argumente erneut für die Schnittstelle ein Handle erstelen kann. Giebt es eine Möglichkeit zwei Handles auf eine Schnittstelle zu öffnen???? Gruß Snypoo
Klotzkopp Geschrieben 25. März 2002 Geschrieben 25. März 2002 Laut MSDN ist sharing von Kommunikationsressourcen nicht möglich. Wofür brauchst Du denn zwei Handles auf denselben Com-Port?
Snypoo Geschrieben 25. März 2002 Autor Geschrieben 25. März 2002 Hallo Klotzkopp, ich möchte in einem Parallel Laufenden Thread eine ReadFile Funktion laufen lassen, damit ich ein TimeOut Programmieren kann, wen keine Gegen Seite zum Senden Angeschlosen ist. Die TimeOut Funktionen laufen nur nach erhalten des Ersten Zeichens an, damit hänge ich immer noch in der ReadFile Funktion, wenn keine Signale rein kommen. Das möchte ich verhindern! Zitat aus der Hilfe: "During a ReadFile operation, the time period begins when the first character is received." Gruß Snypoo
Klotzkopp Geschrieben 25. März 2002 Geschrieben 25. März 2002 Nimm doch Overlapped I/O. Da kannst Du ein Event-Handle mitgeben, das gesetzt wird, wenn die Anweisung abgeschlossen wurde. Auf das Event kannst Du prima mit Timeout warten.
Snypoo Geschrieben 25. März 2002 Autor Geschrieben 25. März 2002 Hi Klotzkopp Kannst Du mir das vileicht genauer erläutern, Wie Du das mit dem Overlapped und dem Timeout meinst? Kannst Du da vileicht ein Beispiel Posten?? Danke Snypoo
Klotzkopp Geschrieben 25. März 2002 Geschrieben 25. März 2002 // nicht getestet HANDLE hSerial = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); OVERLAPPED ol = {0}; ol.hEvent = hEvent; unsigned char pBuf[10]; DWORD dwBytesRead = 0; if( ReadFile( hSerial, pBuf, 10, &dwBytesRead, &ol ) ) { // alles klar } else { if( ERROR_IO_PENDING == GetLastError() ) { // warten if( WAIT_OBJECT_0 == WaitForSingleObject( hEvent, 200 ) ) { // Daten sind da } else { // timeout } } else { // Fehler } } [/PHP] Entscheident ist FILE_FLAG_OVERLAPPED beim CreateFile. Danach muss jeder Zugriff mit ReadFile oder WriteFile mit der Adresse einer OVERLAPPED-Struktur gemacht werden. Der einzige Teil der Struktur, der bei Kommunikationsressourcen gebraucht wird, ist der Event-Handle. Das Overlapped bewirkt, dass ReadFile sofort zurückkommt, egal ob Daten da sind oder nicht. Wenn dann Daten da sind, wird das Event gesetzt, dessen Handle in der OVERLAPPED-Struktur angegeben wurde. Auf das Event kann man mit WaitForSingleObject mit Timeout, hier 200 Millisekunden, warten.
Snypoo Geschrieben 27. März 2002 Autor Geschrieben 27. März 2002 Hallo Klotzkopp, hallo zusammen, ich habe das mit OVERLAPPED ausprobiert und habe dabei festgestelt, daß keine Daten gesendet werden. :confused: Ich sende wie folgt: CheckVar = WriteFile (hSerial, &Buffer, Length, &WrittenBytes, &overlapped_var); als Rückgabewert erhalte ich false in CheckVar. Mache ich irgend was Falsch??? Ich muß doch immer eine Overlapped Struktur angeben (bei WriteFile & ReadFile), wenn ich bei CreateFile FILE_FLAG_OVERLAPPED angebe? Gruß Snypoo
Klotzkopp Geschrieben 27. März 2002 Geschrieben 27. März 2002 Bei Overlapped I/O bedeutet FALSE als Rückgabewert von ReadFile/WriteFile nicht zwangsläufig, dass etwas schiefgelaufen ist (siehe Beispiel), weil ReadFile/WriteFile unter Umständen zurückkommt, bevor die Operation abgeschlossen ist. Wenn GetLastError ERROR_IO_PENDING zurückgibt (siehe Beispiel), dann musst Du halt auf das Event warten (siehe Beispiel).
Snypoo Geschrieben 27. März 2002 Autor Geschrieben 27. März 2002 Hallo Klotzkopp, danke, es hat wunderbar geklappt, ich hebe bei WriteFile nicht daran gedacht, das es auch zurückkommen kann bevor die Daten gesendet wurden. Nach Deinem Hinweis hat es jetzt wunderbar geklappt. Gruß Snypoo
Snypoo Geschrieben 9. April 2002 Autor Geschrieben 9. April 2002 Hallo Klotzkopp, ich habe, wie vorher erwähnt, das ganze mal so ausprobiert, wie Du es gesagt hast. Bis eben hatt es wunderbar geklappt. Aber wieso bekomme ich jetzt nurnoch einen Sende fehler, es wird nichts mehr gesendet, ich habe es mit dem Osziloscope gemessen. Worann kann das liegen??? Ich habe es genauso Programmiert wie Oben. Gruß Thorsten
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden