Pregunta

Tengo una aplicación en la que serial I / O se lleva a cabo con un dispositivo USB unido a través de un puerto COM virtual. Cuando se detecta supresión imprevista del dispositivo, lo que sería la mejor manera de detener la serie de E / S. Debería simplemente cerrar el puerto? O, ¿debería haber una variable global, que se mantiene para indicar la presencia del dispositivo, que se debe comprobar en cada función serial I / O antes de intentar de transmisión / recepción de datos? O, en caso de que sea una combinación de los dos, o algo más? Gracias.

¿Fue útil?

Solución

Asumo que está ejecutando Windows. Esto depende de cómo se haya diseñado su flujo de comunicación.

Tengo un objeto puertobase donde he derivado un objeto Puerto COM (y muchos otros objetos de comunicación). El objeto Puerto COM crea una clase TXThread y RXThread. Estos hilos están esperando el "Overlap" para indicar que la operación de lectura o escritura terminó con WaitForMultipleObjects().

Los TXThreads va a dormir si no hay nada que hacer y se despierta por la función TXWrite (los datos entre el proceso principal y el hilo pasa por un trhead búfer FIFO seguro).

En este caso también tienen que esperar a una señal de evento de que el puerto ha cerrado, por lo que en realidad puede cancelar cualquier operación pendiente y la salida (las bandas de rodadura salidas y se elimina).

Para detectar si el puerto USB es connectd / disconneted escucho para la DEVICE_CHANGE mensaje de Windows. Si se desconecta el puerto fijo el evento y espera a que los hilos a la salida antes de las eliminaciones de clase de puerto y cierra el puerto.

He encontrado este enfoque muy fiable y seguro. Es el núcleo de una plataforma de comunicación I, diseñado para hace más de 8 años y todavía patadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top