2012-05-11 12 views
5

Tengo un problema extraño con algún código que heredé de otro programador que dejó la compañía, y necesito alguna guía sobre cómo comenzar a resolverlo.Se están creando puertos serie virtuales USB duplicados. ¿Qué podría causar esto?

El problema es este: de manera semi-regular, estamos descubriendo que se están creando puertos duplicados de comunicación virtual USB. Por ejemplo, en mi PC, cuando veo los puertos en el Administrador de dispositivos y selecciono "Ver dispositivos ocultos", tengo dos entradas para el mismo dispositivo, una en COM6 y otra en COM8.

Desafortunadamente, no podemos volver a crear el problema de manera confiable. Sospechamos que puede suceder cuando alguien desconecta rápidamente y vuelve a conectar el cable USB cuando nuestro software se está ejecutando, pero eso debe confirmarse.

Por lo que puedo decir, el código se escribió suponiendo que nadie desconectara nunca un cable. No veo ninguna lógica para detectar esta condición después de que se inicia el SW. Y falla al volver a enchufar el cable, lo que genera silenciosamente errores de lectura y escritura incluso después de volver a enchufar el cable. Debe reiniciar el programa para que funcione nuevamente.

Tengo muy poca experiencia de serie y USB, y estoy un poco perdido en cuanto a cómo empezar a arreglar esto.

¿Alguien puede sugerir por qué esto podría estar pasando?


Misc. detalles, por si pudieran ser relevantes:

código de serie

USB se encuentra en un C++ DLL conductores

VS2008

FTDIBUS USB/Serie

Windows XP y Win7

Captura de pantalla de duplicar las entradas del Registro (tenga en cuenta el valor de la clave seleccionada!)

Screen shot of Registry entries

+3

posiblemente relacionado con esto? http://blogs.msdn.com/b/oldnewthing/archive/2004/11/10/255047.aspx – jcoder

+0

Sí, JohnB es correcto. Los dispositivos sin número de serie se identifican por su ubicación en el bus USB. Cuando esto cambia, se ve como un dispositivo diferente. – janm

+0

FTDI es bastante notorio por sus chiflados controladores. Póngase en contacto con ellos para obtener ayuda. –

Respuesta

2

Como se explica en el blog de Raymond Chen, el Antiguo nueva cosa, aquí, y por los comentaristas más arriba:

Para resumir:

  • Los productos que sean desenchufado y enchufados de nuevo son rastreados para que no sean tratados como un nuevo dispositivo cada vez.
  • Normalmente esto usa el número de serie del dispositivo para detectar si un dispositivo es el mismo.
  • Sin embargo, no todos los dispositivos tienen un número de serie. Estos dispositivos se tratan como el mismo dispositivo solo si tienen la misma identificación de proveedor y la misma ID de producto y están conectados al mismo puerto. Si están conectados a un puerto diferente, se tratan como un dispositivo diferente.
  • Algunos fabricantes no entienden la palabra "Serial" en "Serial Number" y dan a todos los dispositivos el mismo número en lugar de darles números en serie ... Para hacer frente a esto hay una configuración de registro que se puede usar para forzar estos dispositivos a tratar como si no tuvieran un número de serie.

Por lo tanto, si un dispositivo sin número de serie o el que se marca en el registro de Windows que tienen números de serie duplicados está conectado a un puerto serie no se ha enchufado en antes, será tratada como una nueva dispositivo en lugar de una reconexión de un dispositivo antiguo. Esto dará como resultado dispositivos "fantasmas" como usted describe.

Algunos dispositivos FTDI son llamados específicamente por tener este problema por el fabricante:

+0

Por cierto que la nota técnica de FTDI es para el problema opuesto: cuando el equipo de fabricación o prueba tiene miles de hardware idéntico (distinto del número de serie) enchufado secuencialmente, Windows asigna un nuevo número de puerto COM a cada uno y pronto se agota. Los fabricantes ingenuos "arreglan" esto al compartir los números de serie, lo que crea el problema discutido en esta pregunta. Ese truco de "IgnoreHardwareSerialNumber" es una forma de evitar que los equipos de fabricación y prueba se agoten de los puertos COM, al tiempo que proporciona números de serie únicos en los dispositivos, lo que proporciona el comportamiento correcto a los usuarios finales. –

Cuestiones relacionadas