2009-08-20 5 views
1

Ich versuche "Pre-Flight-Checks" zu machen, indem ich die "Erreichbarkeit" eines COM-Ports teste, bevor ich ein Dialogfenster öffne, das dem Benutzer erlaubt, com-porty-Sachen zu machen.Schließen und sofortiges erneutes Öffnen eines COM-Ports schlägt fehl: Warum?

Hier ist die Code-Sequenz, in groben Zügen:

handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); 

if (handle != INVALID_HANDLE_VALUE) 
{ 
    CloseHandle(handle); 
    DoTheWork("\\\\.\\COM4:"); 
} 
else 
{ 
    ShowMessage("I'm sorry Dave, I can't do that"); 
} 

... 

void DoTheWork(char * port) 
{ 
    handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); 
    /// do lots of stuff 
    CloseHandle(port); 
} 

Hier ist das Problem: „DoTheWork“ ist eine bewährte Funktion und führt richtig auf seine eigenen. Es schlägt nur fehl, wenn es unmittelbar nach den früheren CreateFile/CloseHandle-Aufrufen aufgerufen wird, wenn das zweite CreateFile E_ACCESSDENIED zurückgibt.

Schlimmer noch, wenn ich langsam durch den Code im Debugger Schritt, Es funktioniert ganz gut.

Es scheint, als ob ich nach dem ersten closeHandle einen Sleep() brauche, aber das fühlt sich an wie ein Hack - und ich weiß nicht, wie lange es sein muss.

+1

Warum nicht den Griff offen halten und an DoTheWork weitergeben? – David

+0

@David, ich wollte keinen funktionierenden Teil des Systems anfassen - aber ich habe jetzt keine Wahl ;-) – Roddy

Antwort

2

Das System braucht etwas Zeit, um die Ressource zu schließen. Es gibt wahrscheinlich einen obskuren Weg zu testen, ob es freigegeben wurde, aber ich weiß nicht, was das ist. Was ich weiß ist, dass, wenn Sie den Registrierungsschlüssel überprüfen:

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 

Sie werden ohne die seriellen Ports zur Verfügung sehen, die sie zu öffnen, das Ihr Problem lösen soll.

+1

Das zeigt mir, welche Ports * installiert * sind, aber es zeigt mir nicht welche welche sind zu öffnende (dh, nicht bereits von einem anderen Code geöffnet) – Roddy

0

Nun, nach mehr Trawl, I found this, die Windows CE eher als Win32 betrifft.

Es gibt eine Zwei-Sekunden-Verzögerung nach Closehandle aufgerufen wird, bevor der Port geschlossen ist, und Ressource freigegeben werden.

ich denke, das gleiche zu Win32 gilt, aber ich habe keinen dokumentierten Beweis gefunden.

+1

Seine wahrscheinlich verwandt - aber Teil des Grundes für die Verzögerung unter CE war die fehlende Verfügbarkeit von FlushFileBuffers() auf einigen Plattformen. – sylvanaar

1

Versuchen Sie, PurgeComm() oder FlushFileBuffers() auf dem Handle aufzurufen, bevor Sie es schließen.

Verwandte Themen