c# - perifericos - partes del cpu pdf
Detección confiable de presencia de hardware externo (1)
Como puede consultar todos los dispositivos en paralelo, este método se escala entre dispositivos, pero no a través de los protocolos / velocidades de transmisión.
Cada dispositivo USB puede indicar su fabricante, descripción, número de serie, etc. Dudo mucho que esos sean de hecho idénticos, ya que a pesar de utilizar el chip FTDI, los proveedores pueden poner cadenas de Fabricante y de Descripción personalizadas, mientras mantienen el VID y PID sin cambios para evitar la necesidad de pagar el "impuesto" necesario para firmar una variante personalizada del controlador.
Para los dispositivos FTDI, hay una forma bastante cruda de obtener información del dispositivo específica del controlador . Alternativamente, puede usar la funcionalidad D2XX siempre presente, consultar los dispositivos allí , usar FT_GetComPortNumber
para obtener el número de puerto, y luego proceder a abrirlo usando las API FT_GetComPortNumber
de puerto de estilo de Windows.
Si los dispositivos realmente no son para nada diferentes (¡¡¡asegúrese de comprobarlo primero !!!), entonces lo mejor que puede hacer es almacenar en caché el protocolo que funcionó por última vez en un número de puerto de comunicación determinado, e intentarlo primero para un comando determinado. Puerto. Si falla, enumera otros protocolos.
Debo admitir una gama cada vez mayor de hardware que se considera, al menos según los estándares actuales, heredado. Lo que casi todos estos dispositivos tienen en común es un chip FTDI FT232 UART, que actúa como un convertidor Serial-to-USB. Windows lo ve como un puerto COM estándar, aunque está virtualizado.
En consecuencia, la identificación programática de estos dispositivos es problemática. Dado que todos usan el mismo chip (o similar), consultar con identificadores de hardware típicos no es de ayuda ya que siempre es el mismo. ¿Hay otras métricas disponibles para identificar un dispositivo?
Mi solución actual ha sido recorrer todos los puertos en serie activos y emitir comandos "hello" conocidos a todas las velocidades de transmisión en baudios comunes. Si recibo una respuesta en ese puerto a la velocidad en baudios probada, se supone que se encuentra el dispositivo de interés. Algunos pseudocódigo:
for each(Serial Port)
{
for each(Device Definition)
{
for each(Baud Rate)
{
WriteToPort(Device Definition.helloString, Baud Rate)
ReadPort(response)
if(response)
Serial Port = this device // break loop
else
continue;
}
}
}
Esto funciona bien, pero no es confiable y lento en el mejor de los casos, ya que tengo que esperar a que termine la lectura para cada velocidad de baudios probada, multiplicado por cada dispositivo realmente conectado al sistema (puede haber uno o muchos). Esto se vuelve más lento con cada nueva pieza de hardware que debe ser compatible.
Una de las características de este código es que "Just Works" ™, los usuarios no tienen que preocuparse por identificar su dispositivo y configurar la conexión COM. Está bastante claro que mi método no es escalable; ¿Hay algo que pueda hacer, menos que facultar al usuario y renunciar a una de las cualidades de mi software?
EDITAR: quería actualizar mi pregunta con algunas imágenes que demuestran el problema. La respuesta aceptada contenía información informativa, pero cuando decidí dar un impulso a la implementación, aún no estoy seguro de cómo proceder.
Considere las dos entradas siguientes en mi registro:
Ambos comparten la misma ID de vendedor, ID de hardware y virtualmente cualquier otra propiedad distintiva. Sin embargo, se sabe que son dispositivos diferentes; Lo único que comparten en común es la interfaz de comunicación, ala chip FTDI. Conocer PortName / COM Address no es útil en absoluto, ya que el número que reciben del sistema es arbitrario ... lo que sea siguiente en la línea.
¿Cómo se generan los números con un círculo en rojo? Por lo que puedo decir, esta es la única información útil, ya que parece que los dispositivos reciben números de serie similares anexados a su entrada.
La siguiente imagen muestra una entrada que es realmente útil:
El fabricante figura en la lista, con un proveedor y una identificación de hardware registrados, y hay una descripción del dispositivo conectado. Esto podría hacer algo con. Desafortunadamente, parece ser la excepción en lugar de la regla.
¿Hay alguna otra forma de proceder a IDing estos dispositivos? Ejecutar las comprobaciones a través de los dispositivos en paralelo proporcionará un pequeño impulso, pero el verdadero cuello de botella está probando las tasas de baudios contra los conjuntos de comandos.