Estoy tirando de mi cabello tratando de averiguar cuándo un puerto serie termina de cerrarse para que pueda volver a abrirlo. Resulta que CloseHandle()
regresa antes de que el puerto esté realmente desbloqueado.CloseHandle() regresa antes de que el puerto serie esté realmente cerrado
Estoy abriendo un puerto serie utilizando CreateFile(FILE_FLAG_OVERLAPPED)
, asociándolo con un CompletionPort usando CreateIoCompletionPort()
, leer/escribir en él usando ReadFile()
, WriteFile()
y cerrándola usando CloseHandle()
.
Me he dado cuenta de que si cierro y vuelvo a abrir un puerto serie con la suficiente rapidez, obtengo un ERROR_ACCESS_DENIED
de vuelta desde CreateFile()
. Esto está sucediendo a pesar del hecho de que estoy esperando que regrese el CloseHandle()
, luego esperando que todas las operaciones pendientes de lectura/escritura asociadas con ese identificador vuelvan del puerto de finalización. Seguramente hay una mejor manera :)
¿Cómo cierro un puerto serie sincrónicamente? Por favor, no vuelva a intentar loops, sleep() o algunos otros hacks baratos.
EDIT: Quizás esto tiene algo que ver con mi uso de los puertos de terminación y FILE_FLAG_OVERLAPPED. Recibo una devolución de llamada cuando se completan las operaciones de lectura/escritura. ¿Hay algún tipo de devolución de llamada para el cierre del puerto?
Quizás relacionado con su controlador de puerto serie específico. ¿Has visto esto aquí en SO: http://stackoverflow.com/questions/2948428/reopening-serial-port-fails-if-not-closed-properly-with-closehandle –
Sólo para estar seguro ... que has guardado 't usado 'DuplicateHandle' en cualquier lugar? –
No estoy seguro de si el puerto de terminación está relacionado, siempre he utilizado devoluciones de llamada de APC con 'ReadFileEx' y' WriteFileEx'. Eso también es más simple, ya que las APC solo se ejecutan, entonces el hilo entra en espera alertable, por lo que no hay problemas de sincronización cruzada (solo tenga cuidado con la reentrada). –