Zum Inhalt springen

Overlapped I/O (was: CreateFile doppelt anwenden)


Snypoo

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...