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 Zitieren
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? Zitieren
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 Zitieren
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. Zitieren
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 Zitieren
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. Zitieren
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 Zitieren
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). Zitieren
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 Zitieren
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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.