Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Overlapped I/O (was: CreateFile doppelt anwenden)

Empfohlene Antworten

Veröffentlicht

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

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

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


// 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.

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

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).

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. :D

Gruß

Snypoo

  • 2 Wochen später...

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.