Pregunta

He escrito algún código C # que comprueba si un dispositivo está presente en algún SerialPort emitiendo un comando en el puerto y escuchando una respuesta. Cuando acabo de configurar la velocidad del puerto, abro el puerto, obtengo la secuencia en serie y comienzo a procesar, funciona el 100% del tiempo. Sin embargo, algunos de nuestros dispositivos funcionan a diferentes velocidades y estoy tratando de buscar un dispositivo a varias velocidades para negociar automáticamente una conexión y detectar la presencia del dispositivo.

Cuando hago todo esto en un solo hilo no hay problemas. Sin embargo, el tiempo de espera de 3 segundos a diez velocidades es de 30 segundos por puerto serie, y puede haber varios. De ahí el deseo de probar todos los puertos al mismo tiempo.

A veces esto funciona. A veces los bluescreens de vista. Cuando uso hilos para sondear todos los puertos simultáneamente, casi siempre aparece en pantalla azul. Cuando fuerzo a que todo se ejecute en un hilo, nunca sucede.

Se está utilizando un adaptador Prolific PL-2303 serie USB con controladores x64.


@Vinko - Gracias por la sugerencia sobre la lectura de minidumps.

Por lo que puedo decir, el quid del problema es que al iniciar una nueva operación de E / S asíncrona desde un subproceso diferente es posible dar un significado completamente nuevo a la I / O superpuesta. O, induciendo una condición de carrera dentro del conductor. Dado que el controlador se ejecuta en modo kernel, BLAM!

Epílogo

Excepto por el inicio, no use BeginXxx fuera del controlador de devolución de llamada y no llame a BeginXxx hasta que haya llamado a EndXxx, porque provocará una condición de carrera en el código del controlador que se ejecuta en modo kernel.

Postscript

Descubrí que esto también se aplica a las secuencias de socket.

¿Fue útil?

Solución

Habiendo escrito los controladores de Windows para uno de estos dispositivos una vez, mi consejo es que no pierdas el tiempo con WinDbg intentando probar lo que ya sabes, es decir, que el controlador que estás usando tiene errores.

Si puede encontrar un controlador más actualizado en el PL2302, inténtelo, pero mi recomendación es que si tiene que usar adaptadores USB y de serie, los basados ??en FTDI son los mejores. (Son no la que escribí los controladores para, tampoco ...)

Otros consejos

También puede desactivar " Reinicio automático " en Propiedades del sistema \ Avanzado \ Inicio y recuperación \ Configuración. Una vez que lo deshabilites, puedes ver el BSOD y buscar el mensaje de error, por ejemplo. IRQL_LESS_OR_EQUAL, al buscar ese nombre de error, por lo general, puede reducir la fuente del problema.

Por cierto, no hay muchas notebooks con puertos serie hoy en día, ¿entonces debes usar el convertidor USB-Serial? Si ese es el caso, el controlador podría haber sido un problema para comenzar, ya que la mayoría de los fabricantes escribieron el controlador del puerto serie como controlador virtual.

BSOD generalmente significa controladores con errores.

¿Qué tipo de puertos HW usas? He tenido BSOD con controladores de convertidores SiLabs CP21xx USB a serie.

Hay controladores FTDI que son estables bajo x64 vista y win7. Apoyo a la persona que dijo que usara solo chipsets FTDI.

La mayoría de los dongles de serie a usb baratos en las tiendas cercanas a mí (Toronto, Canadá) parecen ser chips FTDI. Nunca está en la caja, así que compro uno, y si es bueno, voy a comprar una caja llena de ellos.

W

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