Ventanas.  virus  Cuadernos.  Internet.  oficina.  Utilidades.  Conductores

Empecemos por lo mínimo:
incluye 18f2455 -- biblioteca para MK usado
--
habilitar_digital_io() -- cambiar todas las entradas al modo digital
--
alias botón es pin_B7 -- ya que tenemos un botón conectado, declararlo
pin_B7_direction = entrada -- el botón nos funciona en la entrada
--
-- una línea - y tenemos todo lo que necesita para trabajar con USB CDC
incluir usb_serial -- biblioteca usb
--
usb_serial_init() -- --iniciar USB CDC
bucle para siempre-- bucle principal, funciona continuamente
usb_serial_flush() -- actualización USB. Este procedimiento hace todo lo necesario
-- acciones para mantener la conexión con la PC
bucle final

Compilando código dado Al escribir el archivo HEX resultante en el MK usando un gestor de arranque e iniciar el dispositivo, puede observar cómo se define un nuevo dispositivo en el sistema: puerto de comunicación virtual.

Ahora que el dispositivo ya está funcionando, enseñémosle a comunicarse.

Para leer el byte recibido hay una función usb_serial_read( byte ) :booleano. Si hay un byte recibido, lo almacena en la variable especificada y devuelve verdadero, de lo contrario devuelve FALSO.

Hay un procedimiento para enviar un byte. usb_serial_data. Está disfrazado de variable, por lo que para enviar un byte basta con asignarle el valor del byte que se está enviando.

Declaremos una variable con un tamaño de bytes antes del bucle principal, en el bucle principal comprobaremos la presencia de bytes recibidos y, si los hay, los devolveremos.

incluir 18f2455
--
habilitar_digital_io()
--
alias botón es pin_B7
pin_B7_direction = entrada
--
--
incluir usb_serial
--
usb_serial_init()
byte variable ch -- declarar una variable
bucle para siempre-- bucle principal
usb_serial_flush()
si(usb_serial_read(ch)) entonces-- si se recibe un byte, se escribirá en ch
usb_serial_data=ch -- devuelve el byte recibido
terminara si
bucle final

Compilamos, mantenemos presionado el botón, distorsionamos la alimentación, iniciamos el gestor de arranque, cambiamos el firmware, lo iniciamos.
El dispositivo se detectó nuevamente en el sistema, ahora necesitamos un software para probar el funcionamiento del dispositivo.

Si bien no tenemos el nuestro, usamos un terminal listo para usar: usé el programa RealTerm.
Abrimos el puerto con el número deseado y enviamos los datos.


Y recuperamos lo que enviamos. Así que todo está funcionando como debería.

Suave

Entonces, nuestro microcontrolador puede recibir bytes e inmediatamente enviarlos de vuelta. Ahora vamos a escribir nuestro propio software para comunicarnos con él (usaré Delphi).

Nosotros creamos nuevo proyecto, dispersamos los componentes necesarios en la forma:
SpinEdit1 - para especificar el número de puerto
Button1 - para establecer una conexión
Button2 - para romper la conexión
SpinEdit2 - para ingresar un byte en forma decimal
Button3 - para enviar un byte
Memo1: para mostrar la información recibida.

Como se mencionó anteriormente, debe trabajar con el puerto COM de la misma manera que con uno normal. Archivo de texto: Utilizando las funciones CreateFile, WriteFile y ReadFile.

Para no entrar en detalles, tomemos una biblioteca preparada para trabajar con un puerto com: ComPort.

Colgamos la tarea necesaria en cada botón y obtenemos el código final:

unidad Unidad1;

interfaz

usos
Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios,
Diálogos, StdCtrls, Spin, ComPort;

tipo
TForm1 = clase (TForm)
SpinEdit1: TSpinEdit;
Botón1: BotónT;
Botón2: BotónT;
SpinEdit2: TSpinEdit;
Botón 3: Botón T;
Memo1:TMemo;
procedimiento OnRead (Remitente: TObject; ReadBytes: matriz de Byte);
procedimiento Button1Click(Remitente: TObject);
procedimiento Button2Click(Remitente: TObject);
procedimiento FormDestroy(Remitente: TObject);
procedimiento Button3Click(Remitente: TObject);
privado
(Declaraciones privadas)
Puerto: TComPort;
público
(Declaraciones públicas)
fin;

variable
Formulario1: TForm1;
número: entero;
implementación

Procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
Puerto:= TComPort.Create(SpinEdit1.Value, br115200); // crea una conexión
Puerto.OnRead:= OnRead; //crear un stream para leer los datos recibidos
Botón2.Habilitado:= verdadero; //activamos el boton de cerrar conexion
fin;

Procedimiento TForm1.Button2Click(Sender: TObject);
comenzar
Libre de puerto; //cerrar la conexion
Botón2.Habilitado:=falso; //deshabilitar el boton
fin;

Procedimiento TForm1.Button3Click(Sender: TObject);
comenzar
si Button2.Enabled entonces Port.Write();
fin;

Procedimiento TForm1.FormDestroy(Remitente: TObject);
comenzar
si Button2.Enabled entonces
Libre de puerto;
fin;

Procedimiento TForm1.OnRead(Sender: TObject; ReadBytes: matriz de Byte);
variable
yo: entero;
comenzar
para i:= Bajo (ReadBytes) a Alto (ReadBytes) hacer // pasar por la matriz de bytes recibidos
comenzar
Memo1.Texto:= Memo1.Texto + "." +InttoHex(ReadBytes[i],2); //añade su valor HEX a la ventana
inc(num); //cuenta el numero de bytes recibidos
fin;
si num > 10 entonces empieza
Memo1.Líneas.Add("" ); //línea de transferencia
número:=0;
fin;
fin;

Comenzamos, establecemos una conexión, enviamos bytes:

Entonces nuestro terminal más simple está listo para funcionar con el dispositivo usb más simple.

Como puede ver, la lectura y la escritura son matrices dinámicas de bytes.

Al procesar la información recibida, es posible elaborar el protocolo de intercambio necesario adecuado para la tarea actual.

incluir 18f2455
--
habilitar_digital_io()
--
alias botón es pin_B7
pin_B7_direction = entrada
--
--
incluir usb_serial
--
usb_serial_init()
byte variable ch
byte variable i -- declara la segunda variable
bucle para siempre-- bucle principal
usb_serial_flush()
si(usb_serial_read(ch)) entonces-- si se recibe el byte, realizar las acciones necesarias
caso canal de -- iterar sobre el número de byte
0: usb_serial_data = 0xff
1: usb_serial_data = Botón -- enviar estado del botón
DE LO CONTRARIO bloquear-- si se recibe algo más
para 16 usando i bucle-- enviar 10 bytes de datos
usb_serial_data = ch +i -- ch a ch+15
bucle final
bloque final
caso final
terminara si
bucle final

Características adicionales

Si te detienes ahí, obtienes un artículo regular con Descripción detallada un ejemplo de uso de la biblioteca, de las que hay bastantes en la web. Por lo tanto, agregaré un poco más de información en profundidad.

Simplifica el envío de datos

Enviar información byte a byte no siempre es conveniente. La biblioteca puede ser muy útil. imprimir. Contiene procedimientos para enviar datos de todas las longitudes posibles en todos los formatos posibles: byte, hexadecimal, dec, bin, booleano, lo que puede simplificar la salida de datos en el programa.
>incluir impresión
...
palabra vard datos
print_dword_hex (usb_serial_data, datos)

El nombre de todos los comandos se puede encontrar en el archivo de la biblioteca.

Esperando conexión a PC

Si antes de comenzar el ciclo principal del microcontrolador es necesario establecer primero una conexión con la PC, entonces puede agregar las líneas antes
mientras(usb_cdc_line_status() == 0x00) bucle
bucle final

Asociar el número de puerto al dispositivo

Si deja todo como está, el sistema asignará el primer número de puerto libre para cada nueva conexión. Y eso significa que tienes que vigilarlo.
Para evitar que esto suceda, debe asignar un valor de número de serie único al dispositivo antes de conectar la biblioteca USB:
El número puede tener cualquier longitud y contener varios caracteres.
byte constante USB_CADENA3=
{
24 , -- longitud de la matriz
0x03 , --bDescriptorType
"0" , 0x00 ,
"1" , 0x00 ,
"2" , 0x00 ,
"3" , 0x00 ,
"4" , 0x00 ,
"5" , 0x00 ,
"6" , 0x00 ,
"7" , 0x00 ,
"8" , 0x00 ,
"9" , 0x00 ,
"X" 0x00
}

Cambia el nombre del dispositivo por el tuyo

Puede cambiar el nombre del dispositivo visible en el sistema antes de instalar los controladores declarando una matriz con el nombre, como en número de serie, esto debe hacerse antes de conectar la biblioteca USB.
byte constante USB_CADENA2=
{
28 , --
0x03 , --bDescriptorType
"D", 0x00 ,
"mi", 0x00 ,
"metro", 0x00 ,
"o", 0x00 ,
" " , 0x00 ,
"B", 0x00 ,
"o", 0x00 ,
"a", 0x00 ,
"r", 0x00 ,
"d", 0x00 ,
" " , 0x00 ,
"=" , 0x00 ,
")" 0x00
}

Pero, por desgracia, después de instalar los controladores, el dispositivo cambiará su nombre al especificado en el archivo .inf, por lo que también cambiaremos el nombre allí.


DESCRIPCIÓN="CDC de demostración"

Organizamos la conexión automática del dispositivo.

Por desgracia, no hay formas directas de ejecutar esta tarea no, porque hay que idear.

En primer lugar, debe asignar un fabricante único y un valor de producto a su dispositivo para identificarlo fácilmente entre cientos de otros firmware estándar de CDC.
VID y PID se entregan por dinero, así que sigamos el camino de los chinos: tranquilamente tomemos valores obviamente libres.

firmware:
Se deben declarar dos variables en el firmware antes de conectar la biblioteca USB

palabra constante USB_SERIAL_PRODUCT_ID = 0xFF10
palabra constante USB_SERIAL_VENDOR_ID = 0xFF10

En lugar de FF10, puede insertar dos palabras cualesquiera (2 bytes). El resultado final se encuentra en el archivo adjunto.

Conductores:
Dado que los controladores no están diseñados para nuestra combinación de VID y PID, agregaremos nuestros valores al archivo .inf manualmente:


%DESCRIPTION%=Instalación del controlador, USB\VID_FF10&PID_FF10


%DESCRIPTION%=Instalación del controlador, USB\VID_FF10&PID_FF10

Suave:
Para capturar eventos de conexión/desconexión de dispositivos, conectaremos la biblioteca ComponentUSB. No considero necesario explicar cada línea: todos los cambios se pueden ver en el proyecto adjunto.

Resultado

Es difícil de ver en la captura de pantalla, pero el botón Enviar está activo solo cuando hay un dispositivo conectado, y cada 50 ms el programa envía una solicitud para obtener el estado del botón (que, sin embargo, es incorrecto, porque la presión del botón debe procesarse en el MK).

Como puede ver, organizar el intercambio de datos entre MK y PC a través de USB no es la tarea más difícil. La conexión resultante se puede usar no solo para fines finales: también es adecuada para depurar un programa. Después de todo, enviar los resultados de los cálculos, los estados actuales de los registros y las variables a una computadora es mucho más claro que hacer parpadear un par de LED en código Morse.

Y por último, te aconsejo que investigues fuente lámparas de humor. Puedes encontrar bastantes allí. una buena opción procesamiento de los datos recibidos para organizar un protocolo de intercambio conveniente.

Buen libro, explica muchas cosas. Útil para aquellos que quieren entender cómo se transfieren los datos a través del bus USB.

Introducción 1
Para quién es este libro: 2
¿Qué encontrarás en el libro 2?
Requisitos de software 3
Requisitos de hardware 4
Sobre el código 4
Breve descripción de los capítulos 4
Notación 6
gracias 7
PARTE I. INTRODUCCIÓN A USB 9
Capítulo 1. ¿Qué es USB 11?
1.1. Historia de USB 11
1.2. Comparación de USB con otras interfaces 14
1.3. Conceptos básicos de USB 16
1.3.1. Arquitectura general de autobuses 16
1.3.2. Arquitectura de bus físico y lógico 16
1.3.3. Componentes de USB 18
1.3.4. Propiedades del dispositivo USB 18
1.3.5. Propiedades del concentrador 19
1.3.6. Propiedades de acogida 20
1.4. Ejemplos de dispositivos USB 20
1.4.1. Ratón y teclado., 21
1.4.2. Monitores 21
1.4.3. Adaptadores USB a COM y USB a LPT 22
1.4.4. Escáneres 23
1.4.5. módems 23
1.4.6. Altavoces 24
1.4.7. Unidades flash 25
1.4.8. Bujes 28
1.4.9. Tecnología de medición 28
1.4.10. Gadgets exóticos 29
1.5. conexión de red a través de USB 30
1.5.1. Convertidor USB a Ethernet 31
1.5.2. Conexión directa a través del puerto USB 31
1.6. Transferencia de datos 31
1.6.1. Principios de comunicación 32
1.6.2. Mecanismo de interrupción 32
1.6.3. Interfaces de adaptador de host 32
1.6.4. Capacidad de acceso directo a la memoria 34
1.6.5. Modos de comunicación 34
1.7. Instalación y configuración de dispositivos USB 35
1.7.1. Configuración del BIOS para USB 38
1.7.2. Resolución de problemas 41
1.8. Límites USB 45
1.9. Si compras una computadora 46
1.9.1. ¡HS y USB 2.0 no son lo mismo! 46
1.9.2. tarjeta madre 47
1.9.3. Edificio 48
1.9.4. USB para modelos de computadora “antiguos” 48
1.10. Recursos en línea para este capítulo 49
Capitulo 2 Hardware USB 51
2.1. Cables y conectores 51
2.1.1. Tipos de cables 52
2.1.2. Longitud del cable 53
2.1.3. Conectores 53
2.2. Interfaz física 55
2.2.1. Codificación de datos 57
2.2.2. Identificación del dispositivo 58
2.3. nutrición 59
2.3.1. Tipos de alimentación de dispositivos USB 59
2.3.2. Gestión energética 60
2.3.3. Entrando en el modo bajo consumo de energía 61
2.4. Recursos en línea para este capítulo 61
PARTE II. ORGANIZACIÓN INTERNA USB 63
Capítulo 3 Organización interna de los neumáticos 65
3.1. Niveles lógicos de comunicación 65
3.1.1. Software de cliente nivel 66
3.1.2. Controlador del sistema USB nivel 67
3.1.3. Controlador de host de interfaz Nivel 68
3.1.4. Autobús periférico nivel 68
3.1.5. Dispositivo lógico USB nivel 69
3.1.6. Nivel funcional del dispositivo USB 69
3.2. Transferencia de datos en capas 69
3.3. Tipos de transferencias de datos 71
3.4. Sincronización con transmisión isócrona 73
3.5. Personal 77
3.6. Puntos finales 78
3.7. Canales 79
3.8. Paquetes 81
3.8.1. Formato de paquetes de token IN, OUT, SETUP y PING 83
3.8.2. Formato de paquete SOF 83
3.8.3. Formato de paquete de datos 84
3.8.4. Formato del paquete de acuse de recibo< 84
3.8.5. Formato de paquetes SPLIT * 84
3.9. Suma de comprobación 85
3.9.1. Algoritmo de cálculo CRC 86
3.9.2. Software de cálculo de CRC 87
3.10. Transacciones 90
3.10.1. Tipos de transacciones 91
3.10.2. Confirmación de transacciones y control de flujo 92
3.10.3. Protocolos de transacción 93
Capítulo 4. Organización interna del dispositivo 96
4.1. Solicitudes a dispositivos USB 96
4.1.1. Paquete de configuración 96
4.1.2. Consultas de dispositivos estándar 99
4.1.3. Descriptores de dispositivos 105
Capítulo 5. Organización interna del host y hubs 123
5.1. Bujes 123
5.1.1. Interacción del controlador host con el concentrador 126
5.1.2. Descriptor de concentrador 127
5.1.3. Centro de solicitudes 129
5.1.4. Solicitud CLEAR_HUB_FEATURE 130
5.1.5. Solicitud CLEAR PORT_FEATURE 130
5.1.6. Solicitud GET_BUS_STA TE 131
5.1.7. Solicitud GET_HUB_DESCRfPTOR 131
5.1.8. Solicitud GET_HUB_STATUS 131
5.1.9. Solicitud GET_PORT_STA TUS 132
5.1.10. Solicitud SET_HUB_DESCRIPTOR 134
5.1.11. Solicitud SET_HUB_FEATURE 134
5.1.12. Solicitud de CONFIGURACIÓN DE CARACTERÍSTICAS DEL PUERTO. 134
5.2. Colaboración dispositivos con diferentes velocidades 135
Capítulo 6. USB sin PC 137
6.1. Conectores OTG 138
6.2. Tipos de dispositivos OTG 138
6.3. Descriptor de dispositivo OTG 139
6.4. Recursos en línea para este capítulo 140
PARTE III. PRÁCTICA DE PROGRAMACIÓN 141
Capítulo 7 Soporte USB en Windows 143
7.1. Modelo WDM 144
7.2. Interacción con el controlador USB 146
Capítulo 8 Dispositivos HID * 149
8.1. Propiedades del dispositivo HID 149
8.2. Cómo comunicarse con un dispositivo HID 151
8.3. Instalación de un dispositivo HID 152
8.4. Identificación de dispositivos HID 152
8.4.1. Identificación de dispositivos de arranque 153
8.4.2. Descriptor de configuración del dispositivo HID 153
8.4.3. Descriptor HID 154
8.4.4. Descriptor de informe 156
8.5. Estructura del descriptor del informe 156
8.5.1. Estructura de los elementos del informe 156
8.5.2. Tipos de elementos de informe 157
8.5.3. Ejemplos de descriptores 165
8.6. Solicitudes al dispositivo HID 168
8.6.1. Solicitud GET_REPORT. 169
8.6.2. Solicitud SET_REPORT 169
8.6.3. Solicitud GETJDLE. 170
8.6.4. Solicitar SETJDLE 170
8.6.5. Solicitud GET_PROTOCOL 171
8.6.6. Solicitud SET_PROTOCOL 171
8.7. Herramientas 171
8.8. Interacción con el controlador HID 172
Capítulo 9 Introducción a WDM 181
9.1. Capas de controlador 183
9.2. Nombres de dispositivos simbólicos 184
9.3. Procedimientos básicos del controlador WDM 189
9.3.1. Procedimiento DriverEntry 190
9.3.2. Procedimiento AddDevice 192
9.3.3. Procedimiento de descarga 194
9.3.4. Procedimientos operativos del conductor 196
9.3.5. Servicio de solicitudes IOCTL 203
9.4. Procedimientos para cargar el controlador y llamar al controlador 209
9.4.1. Procedimiento de operación del conductor 209
9.4.2. Registro de conductor 210
9.4.3. Refiriéndose a los procedimientos de trabajo 217
9.4.4. Almacenamiento del controlador en el interior Archivo ejecutable 218
9.5. Herramientas de creación de controladores 220
9.5.1. Estudio de controladores NuMega 220
9.5.2. Jungo WinDriver 220
9.5.3. Controlador de núcleo Jungo 220
Capítulo 10 Especificación USB PnP 221
10.1. información general sobre el sistema Plug and Play 221
10.1.1. Tareas y funciones Plug and Play 221
10.1.2. Inicio de un procedimiento PnP 222
10.1.3. Componentes de software PnP 224
10.2. Conectar y usar para USB 225
10.2.1. Configuración de dispositivos USB 226
10.2.2. Dispositivo USB numeración 226
10.2.3. ID de dispositivo USB PnP 228
10.3. Obtener una lista de dispositivos USB 229
10.4. Archivo INF 234
10.4.1. Estructura de archivos INF 234
10.4.2. Sección Versión 235
10.4.3. Fabricante sección 237
10.4.4. Destino Dirs Sección 239
10.4.5. Modelo 241 Descripción Sección
10.4.6. Sección xxx.AddReg y xxx.DelReg. 242
10.4.7. Sección xxx.LogConfig 244
10.4.8. Sección xxx.CopyFiles 244
10.4.9. Sección Cadenas 245
10.4.10. Sección enlaces 246
10.4.11. Crear y probar archivos INF 247
10.4.12. Instalación de dispositivos usando un archivo INF 248
10.5. Ramas de registro para USB 249
Capítulo 11 Características del BIOS 251
11.1. Servicio de BIOS 1AH 251
11.1.1. Función B101H: detección de la presencia de PCI BIOS 252
11.1.2. Función В102Н - buscar un dispositivo PCI por identificadores
dispositivo y fabricante 253
11.1.3. Función B103H: busque un dispositivo PCI por código de clase 254
11.1.4. Función B108H - registro de configuración de lectura (Byte) 255
11.1.5. Función ВУ9Н - registro de configuración de lectura (Palabra) 256
11.1.6. Función B10AN - registro de configuración de lectura (DWord) 256
11.1.7. Función В10ВН - registro de configuración de escritura (Byte) 257
11.1.8. Función B10CH - escribir registro de configuración (Word) 257
11.1.9. Función B10DH - Registro de configuración de escritura (DWord) 258
11.2. Ejemplo de uso 259
PARTE IV. CREAR DISPOSITIVOS USB 283
Capítulo 12 Periféricos USB 285
12.1. Fichas Atmel 286
12.1.1. Microcontroladores con arquitectura MSC-51 286
12.1.2. Controladores de concentrador 289
12.1.3. Concentradores de microprocesador con núcleo AVR 289
12.1.4. Otros circuitos integrados Atmel 290
12.2. Fichas Cygnal 291
12.2.1. Microprocesadores C8051F320 y C8051F321 291
12.2.2. Otros circuitos integrados Cygnal 293
12.3. Fichas FTDI 296
12.3.1. Fichas FT232AM y FT232BM 297
12.3.2. Fichas FT245AM y FT245BM 298
12.3.3. Microprocesador FT2232BM 299
12.3.4. Microprocesador FT8U100AX 300
12.3.5. Kits y módulos de depuración 301
12.3.6. Conductores 302
12.3.7. Servicios adicionales 303
12.3.8. Otros módulos 304
12.4. Fichas Intel 304
12.5. Fichas Microchip 308
12.6. Circuitos integrados Motorola 308
12.7. fichas Philips 309
12.7.1. Microchip USB 310
12.7.2. Bujes 311
12.7.3. Otros chips Philips 313
12.8. Microcircuitos Texas Instruments 314
12.9. Fichas Trans Dimensión 317
12.10. Circuitos integrados de protección de alimentación 318
12.11. Recursos en línea para este capítulo 319
Capítulo 13 Atmel AT89C5131 Dispositivo HID 322
13.1. Diagrama estructural de АТ89С5131 322
13.2. Registros USB AT89C5131 324
13.2.1. Registrar USBCON 324
13.2.2. Registrar USBADDR 326
13.2.3. Registrar USBINT 327
13.2.4. Registrar USBIEN 328
13.2.5. Registro UEPNUM. 329
13.2.6. Registrar UEPCONX 330
13.2.7. Registro UEPSTAX. 331
13.2.8. Registro UEPRST. 334
13.2.9. Registro UEPINT. 335
13.2.10. Registro UEPIEN 336
13.2.11. Registro UEPDATX 337
13.2.12. Registro UBYCTLX 337
13.2.13. Registro UFNUML 338
13.2.14. Registro UFNUMH. 338
13.3. Circuito AT89S5131 338
13.4. Herramientas de programación 339
13.4.1. Compilador 341
13.4.2. programador 342
13.5. Programa para microprocesador 349
13.5.1. La primera versión del programa para АТ89С5131 349
13.5.2. Adición de descriptores de cadena 369
13.5.3. Adición de puntos finales 374
13.5.4. Creación de un dispositivo HID 377
13.5.5. Comunicación con un dispositivo HID 381
13.6. Lectura de informes en Windows 388
13.7. Funciones adicionales Windows XP 396
13.8. Dispositivo con múltiples informes 397
Capítulo 14 Creación de un dispositivo USB ATMEL AT89C5131 402
14.1. Dispositivo no HID 402
14.2. Crear un controlador con Conductor Estudio 405
14.2.1. Algunas palabras sobre la biblioteca Driver Studio 407
14.2.2. Otras clases de Driver Studio 411
14.2.3. Creación de una plantilla de controlador con Driver Studio 412
14.2.4. Refinamiento de la plantilla del controlador 422
14.2.5. Métodos base de clase de dispositivo 423
14.2.6. Implementación de la lectura de datos 426
14.2.7. Instalación del controlador 428
14.2.8. Lector de datos 429
14.2.9. Lectura de datos de otros tipos de puntos finales 438
14.2.10. Limpiar controlador USB 439
Capítulo 15 Uso de chips FTDI 457
15.1. Diagrama funcional FT232BM 457
15.2. Circuito FT232BM 460
15.3. Funciones D2XX 460
15.4. Transición de COM a USB 465
15.4.1. Descripción del circuito del convertidor 465
15.4.2. Configuración de la velocidad en baudios 467
PARTE V. MANUAL 469
capitulo 16 características de Windows 471
16.1. Funciones CreateFile y CloseHandle: abrir y cerrar un objeto.471
16.1.1. Información adicional 472
16.1.2. Valor devuelto 472
16.1.3. Ejemplo de llamada 472
16.2. Función de lectura de archivo: lectura de datos 473
16.2.1. Información adicional 474
16.2.2. Valor devuelto 474
16.2.3. Ejemplo de llamada 474
16.3. Función WriteFile: transferencia de datos 475
16.3.1. Información adicional 476
16.3.2. Valor de retorno 476
16.3.3. Ejemplo de llamada 476
16.4. Función ReadFileEx. Datos de lectura de APC 477
16.4.1. Valor devuelto 479
16.4.2. Información adicional 479
16.4.3. Ejemplo de llamada 479
16.5. Función WriteFileEx: transferencia de datos de APC 480
16.5.1. Valor devuelto 481
16.5.2. Ejemplo de llamada 481
16.6. Función WaitForSingleObject esperando una señal
estado del objeto 482
16.6.1. Valor devuelto 482
16.7. Función WaitForMultipleObjects: esperando una señal
estados del objeto 483
16.7.1. Valor devuelto 484
16.8. Resultado de la función GetOverlappedResult de la operación asíncrona 484
16.8.1. Valor de retorno 485
16.9. Función DeviceIoControl: Control directo del controlador 485
16.9.1. Valor devuelto 487
16.10. Función QueryDosDevice: obtener el nombre del dispositivo
por su nombre DOS 487
16.10.1. Valor devuelto 488
16.10.2. Ejemplo de llamada 488
16.11: Definir función de dispositivo DOS: Operaciones de nombre de dispositivo DOS 489
16.11.1. Valor devuelto 490
16.11.2. Ejemplo de llamada 490
Capítulo 17 Funciones de la API de HID 492
17.1. Función HidD_Hello: comprobación de biblioteca 492
17.2. HidD_GetHidGuid Función: Obtener GUID 492
17.3. Función HidD_GetPreparsedData: creación de un descriptor de dispositivo 493
17.4. Función HidD_FreePreparsedData: Manija de dispositivo de liberación 493
17.5. Función HidD_GetFeature: obteniendo el informe FEATURE 494
17.6. Función HidD_SetFeature: Envío de informe FEATURE 494
17.7. Función HidD_GetNumInputBuffers: obtener el número de búferes 495
17.8. Función HidD_SetNumInputBuffers: establecer el número de búferes 495
17.9. Función HidD_GetAttribntes: Obtener atributos del dispositivo 495
17.10. Función HidD_GetMamifactnrerStnng. obtener cadena de fabricante 496
17.11. Función HidD_GetProductString. obtener la línea de productos 497
17.12. Función HidD_ Obtener Serial MumberString. obteniendo una cadena
número de serie 497
17.13. Función HidD_GetIndexedString. obtener fila en el índice 498
17.14. Función HidDjGetlnputReport. recibir un informe de ENTRADA 498
17.15. Función HidD_SetOutputReport. Enviar informe de SALIDA 499
17.16. Función HidP_GetCaps: Obtener propiedades del dispositivo 499
17.17. Función HidP_MaxDataListLength: obteniendo tamaños de informe 500
Capítulo 18 Controlador de host UCH 502
18.1. Registros de control del controlador de host 502
18.1.1. Registro de comandos USB (USBCMD) ..504
18.1.2. Registro de estado USB (USBSTS) 506
18.1.3. Registro de control de interrupciones (USBINTR) 506
18.1.4. Registro de número de cuadro (FRNUM) 507
18.1.5. Registro de dirección base de trama (FLBASEADD) 508
18.1.6. Registro modificador de inicio de trama (SOFMOD) 508
18.1.7. Registro de estado y control de puertos (PORTSC) 509
18.2. Estructuras de datos del controlador de host UCH 510
18.2.1. Lista de fotogramas 510
18.2.2. Descriptor de transmisión i 511
18.2.3. Encabezado de cola 514
18.3. Procesamiento de la lista de descriptores UCH 516
Capítulo 19 Herramientas 518
19.1. Herramientas de Microsoft Visual Studio 518
19.1.1. depende 518
19.1.2. Búsqueda de errores 518
19.1.3. GuidGen 518
19.2. Herramientas de Microsoft DDK 520
19.2.1. Árbol de dispositivos 520
19.2.2. DevCon.-521
19.2.3. Chklnf y Genlnf. 526
19.3. CompuWare Corporation 527 Herramientas
19.3.1. Supervisar 527
19.3.2. Enlace simbólico 527
19.3.3. EzDriverInstaller 527
19.3.4. WdmSniff 527
19.4. Sistemas 528 herramientas
19.4.1. WinObj 528
19.5. Foro USB 531 Herramientas
19.5.1. Herramienta de descripción HID 531
19.6. Herramientas de software de HDD 533
19.7. Sourceforge 533 Herramientas
APLICACIONES 535
Apéndice 1 Funciones adicionales 537
Anexo 2. Tabla de identificadores de idioma (LangID) 539
Anexo 3. Tabla de códigos de proveedores (Vendor ID, Device ID) 543
Apéndice 4 Descripción del CD 546
Literatura 548
Índice 549

Programación vía Puerto USB

Programación del dispositivo para la configuración antenas parabólicas El SF-50 a través de USB se diferencia de la programación a través de RS-232 solo en la forma en que se transfieren los datos del instrumento a la computadora y de la computadora al instrumento. Al programar a través de USB, un portátil memoria USB(Unidad flash). Esto es útil cuando, por ejemplo, su computadora o, más a menudo, una computadora portátil (netbook) no tiene un puerto serie RS-232 en su chasis.
Para programar el dispositivo con usando USB el almacenamiento necesitará:
- Unidad USB (unidad flash) formateada en sistema de archivos FAT-32;
- Programa editor AliEditor, ubicado en la carpeta Database_editor_new de la sección del software OPENBOX SF-50.

Antes de comenzar la programación, es necesario transferir la base de datos del dispositivo a una computadora. Para hacer esto, encienda el dispositivo, conéctese a Puerto USB Unidad flash. Ejecutar MENÚ - Sistema - Guardar en USB,

Salga del menú presionando el botón MENÚ hasta que aparezca el canal actual, o vaya a la imagen del menú principal si aún no hay canales y retire la unidad flash. Inserte la unidad flash en la computadora.
Ejecute el programa Editor.exe desde la carpeta Database_editor_new y abra la imagen en la unidad flash que contiene.

Cuando se le solicite que seleccione una base de datos, seleccione Base de datos de usuario.

Presiona OK. Seleccione Todos los servicios, se abrirá una lista de todos los canales de TV, radio y servicios escaneados y guardados en la base de datos.

Edite los canales como desee, por ejemplo, deje solo canales abiertos.
Presione en el teclado de la computadora Botón de cambio, presione la flecha hacia abajo y resalte los canales que desea eliminar. Pulse Eliminar para eliminar la selección.

Para editar la configuración del satélite, seleccione Todos los servicios - Información del satélite - EUTELSAT W4, W7, presione el botón ENTER.

Si es necesario, edite los valores en Antena 1.
Para eliminar un transpondedor, seleccione uno innecesario y presione el botón Eliminar en el teclado de la computadora, confirme la acción seleccionada.

Para agregar un transpondedor, párese en el nombre del satélite, presione botón derecho mouse y seleccione Agregar información (o seleccione el satélite y presione el botón Insertar en el teclado).

Ingrese los datos para el nuevo transpondedor, tomándolos, por ejemplo, del sitio lyngsat.com.

Pulse OK, asegúrese de que el transpondedor esté registrado.

Para agregar un satélite, vaya a la línea Información del satélite, presione la tecla Insertar en el teclado e ingrese los parámetros del nuevo satélite.

cierre el programa editor, retire la unidad.
Inserte la unidad en el dispositivo OPENBOX SF-50, ejecute MENÚ - Sistema - Actualizar desde USB en secuencia, seleccione el modo "Lista SAT&TP".

Seleccione Inicio. Confirma tus intenciones.

El dispositivo actualizará la base de datos y se reiniciará. Después del reinicio, en la configuración, deberá configurar el idioma del menú ruso de una manera nueva. Restablecer el dispositivo a la configuración de fábrica.
Salga del menú de configuración presionando el botón MENÚ dos veces. Presione el botón OK en el canal actual y asegúrese de que la lista de canales esté editada.

También puede asegurarse de que se haya editado la lista de transpondedores y satélites.
Programación completada.

El bus USB (Universal Serial Bus - Universal Serial Bus) apareció el 15 de enero de 1996 con la aprobación de la primera versión del estándar por parte de Intel, DEC, IBM, NEC, Northen Telecom y Compaq.

El objetivo principal del estándar establecido ante sus desarrolladores es permitir que los usuarios trabajen en modo Plug & Play con dispositivos periféricos. Esto significa que debe ser posible conectar el dispositivo a una computadora que funcione, reconocimiento automático inmediatamente después de conectar y luego instalar los controladores apropiados. Además, es deseable suministrar energía a los dispositivos de baja potencia desde el propio bus. La velocidad del bus debería ser suficiente para la gran mayoría de los periféricos. El controlador USB debe tomar solo una interrupción, independientemente de la cantidad de dispositivos conectados al bus, es decir, para resolver el problema de falta de recursos en los buses internos de una computadora compatible con IBM PC.

Casi todas las tareas se resolvieron en el estándar USB, y en la primavera de 1997 comenzaron a aparecer computadoras equipadas con conectores para Conexiones USB dispositivos. Ahora USB se ha implementado tan activamente por los fabricantes de periféricos de computadora que, por ejemplo, en la computadora iMAC de Apple Computers, solo hay USB como bus externo.

Las características de USB 1.0 son las siguientes:

1. intercambio de datos de alta velocidad (velocidad completa) - 12 Mb él/Con;

2. longitud máxima del cable para alta tasa de cambio - 5 metros;

3. baja tasa de intercambio de datos (baja velocidad) - 1,5 Mb él/Con;

4. longitud máxima del cable para tipo de cambio bajo - 3 metros;

5. el número máximo de dispositivos conectados es 127;

6. posible conexión simultánea de dispositivos con diferentes tasas de cambio;

8. consumo máximo de corriente por dispositivo - 500 mA.

Por lo tanto, es recomendable conectar casi todos los dispositivos periféricos a USB 1.0, a excepción de cámaras de video digitales y de alta velocidad. unidades de disco duro. Esta interfaz es especialmente útil para conectar dispositivos que se conectan o desconectan con frecuencia, como cámaras digitales.
La capacidad de usar solo dos velocidades de datos limita la aplicabilidad del bus, pero reduce significativamente la cantidad de líneas de interfaz y simplifica la implementación del hardware.
La alimentación directa desde USB solo es posible para dispositivos de baja potencia como teclados, ratones, joysticks, etc.

Las señales USB se transmiten a través de un cable de 4 hilos, que se muestra esquemáticamente en la siguiente figura:

Figura 2.6.1 - Cables de señal USB

Aquí GND es un circuito de cable común para alimentar dispositivos periféricos, Vbus - +5 V también para circuitos de alimentación. El bus D+ es para transmitir datos en el bus y el bus D- es para recibir datos.
El cable para soportar la velocidad máxima del bus (full-speed) está hecho como un par trenzado, protegido por un blindaje y también se puede usar para operar en el modo de velocidad mínima (low-speed). El cable para operar solo a la velocidad mínima (por ejemplo, para conectar un mouse) puede ser cualquiera y sin blindaje.
Los conectores utilizados para conectar periféricos se dividen en series: los conectores de la serie "A" (macho y hembra) son solo para conectar a una fuente, como una computadora, los conectores de la serie "B" (macho y hembra) son solo para conectar a un dispositivo periférico.

Los conectores USB tienen la siguiente numeración de pines que se muestra en la Tabla 2.6.1.

Tabla 2.6.1 - Propósito y marcado de contactos USB

En 1999, el mismo consorcio de empresas informáticas que inició el desarrollo de la primera versión del estándar de bus USB comenzó a desarrollar activamente la versión 2.0 de USB, que presenta la introducción de un modo adicional de alta velocidad (Hi-speed). El ancho de banda del bus se incrementó 40 veces, hasta 480 Mbps, lo que hizo posible la transferencia de datos de video a través de USB.
La compatibilidad de todos los periféricos lanzados anteriormente y los cables de alta velocidad se conserva por completo. El controlador del estándar 2.0 ya está integrado en el conjunto de lógica del sistema de dispositivos programables (por ejemplo, tarjeta madre computadora personal).

En 2008, Intel, Microsoft, Hewlett-Packard, Texas Instruments, NEC y NXP Semiconductors crearon la especificación USB 3.0. En la especificación USB 3.0, los conectores y cables del estándar actualizado son física y funcionalmente compatibles con USB 2.0, pero además de las cuatro líneas de comunicación, se han agregado cuatro más. Sin embargo, nuevos contactos en conectores USB 3.0 se encuentran separados de los anteriores en una fila de contactos diferente. La especificación USB 3.0 eleva la velocidad máxima de transferencia de datos a 5 Gbps, un orden de magnitud superior a los 480 Mbps que puede proporcionar USB 2.0. Además, la corriente máxima se ha aumentado de 500 mA a 900 mA por dispositivo, lo que le permite alimentar algunos dispositivos que antes requerían una fuente de alimentación separada.

Suponga que ha desarrollado un dispositivo USB con el que desea trabajar usando una computadora. Esto se puede lograr al menos de dos maneras:

1. desarrollo de un controlador completo Sistema operativo;

2. usando una interfaz USB de clase especial: dispositivos llamados dispositivos HID (dispositivo de interfaz humana).

El primer método es universal: con suficiente conocimiento en el campo de la escritura de controladores, puede programarlo para que funcione con cualquier dispositivo a cualquier velocidad compatible con USB. Pero esta es una tarea bastante difícil.

La segunda forma es la siguiente. Existe una interfaz compatible con los sistemas operativos modernos para dispositivos de interacción computadora-humano o dispositivos HID, tales como:

1. teclados, ratones, joysticks;

2. varios sensores y lectores;

3. juego de dirección y pedales;

4. botones, interruptores, reguladores.

Cualquier dispositivo de este tipo, si cumple con los requisitos para dispositivos HID, será reconocido automáticamente por el sistema y no requerirá la escritura de controladores especiales. Además, programarlos suele ser mucho más fácil que escribir un controlador de dispositivo personalizado. Desafortunadamente, el método tiene un inconveniente importante: la velocidad de intercambio de información con el dispositivo HID es muy limitada y asciende a un máximo de 64 kB/s.

En principio, con base en la tecnología HID, es posible organizar la interacción con cualquier dispositivo, incluso si no es en sentido estricto un dispositivo de interfaz entre una persona y una computadora. Esto elimina el lento desarrollo de un controlador de dispositivo único y ahorra tiempo en el desarrollo de un nuevo dispositivo USB. En el lado del host, el intercambio con el dispositivo será administrado por un controlador HID estándar incluido en la distribución del sistema operativo. Solo necesita ejecutar desde el lado del dispositivo requerimientos mínimos Protocolo USB HID.

Vale la pena señalar que muchos dispositivos USB, que a primera vista no se incluyen en la definición de dispositivos de interacción humana, son aún más lógicos de implementar como dispositivos HID. Este fenómeno ocurre a menudo en el campo de los equipos de producción, que recientemente ha experimentado una introducción masiva de tecnologías USB. Por ejemplo, considere una fuente de alimentación de laboratorio con la capacidad de configurar los parámetros de sus señales de salida desde una computadora mediante una interfaz USB. Sin duda, la fuente de poder en sí misma no es un medio de interacción con una persona. Sin embargo, en este caso Las funciones implementadas a través de la conexión USB duplican el teclado, los controles y los indicadores instalados en el propio dispositivo. Y estos controles simplemente caen bajo la definición de HID. En consecuencia, la fuente de alimentación con estas funciones USB está organizada más lógicamente como un dispositivo HID.

En el ejemplo considerado, una pequeña tasa de transferencia de datos será suficiente para el funcionamiento normal, mientras que en otros casos, los dispositivos pueden ser muy exigentes con la tasa de cambio. La baja tasa de transferencia es la principal limitación del diseño del dispositivo HID, que, en comparación con los 12 Mbps completos Velocidad USB El bus 1.0 parece una gran desventaja de la tecnología HID en términos de elegir una implementación USB específica. Sin embargo, para muchas tareas de comunicación, esta velocidad es suficiente, y la arquitectura HID, como herramienta especializada, ocupa un lugar digno entre las formas de organizar el intercambio de datos.

Hay dos tipos de dispositivos HID: participantes (arrancables) y no participantes en el arranque inicial de la computadora. El ejemplo más llamativo de un dispositivo USB-HID de arranque es el teclado, que comienza a funcionar con el inicio de la computadora.

Al desarrollar un dispositivo HID, se deben cumplir los siguientes requisitos impuestos por la especificación:

1. El dispositivo HID de velocidad completa puede transferir 64000 bytes cada segundo o 64 bytes cada 1 ms; un dispositivo HID de baja velocidad tiene la capacidad de transferir hasta 800 bytes por segundo u 8 bytes cada 10 ms.

2. El dispositivo HID puede designar su frecuencia de sondeo para determinar si tiene datos nuevos para transmitir.

3. El intercambio de datos con el dispositivo HID se lleva a cabo a través de una estructura especial llamada informe (Informe). Cada informe definido puede contener hasta 65535 bytes de datos. La estructura del informe tiene una organización muy flexible que le permite describir cualquier formato de transferencia de datos. Para que el host conozca un formato de informe específico, el microcontrolador debe contener una descripción especial: un descriptor de informe.

La comunicación USB se implementa directamente en el microcontrolador de varias maneras:

1. usando un controlador con soporte de hardware, como AT90USB*, de atmega;

2. usando la emulación de software de la interfaz usb en cualquier microcontrolador.

Para la implementación de software, actualmente existe una serie de soluciones listas para usar para varias familias de microcontroladores. Para microcontroladores AVR como Atmega8, es posible utilizar las siguientes bibliotecas C gratuitas:

Ambos son bastante fáciles de usar, brindan una emulación completa de dispositivos USB 1.1 de baja velocidad, excepto por el manejo de errores de comunicación y características eléctricas, y se ejecutan en casi todos los controladores AVR con al menos 2k flash, 128 bytes de RAM y 12 a 20 MHz.

Para escribir aplicaciones con soporte Windows USB Los dispositivos HID requieren los archivos de encabezado hid* incluidos con el WDK ( Controlador de Windows Kit), o puede utilizar la librería hidlibrary de libre redistribución u otra similar.

Por lo tanto, en el caso general, la programación de USB es una tarea bastante complicada, que requiere un microcontrolador especial con soporte de hardware y escribir un controlador de sistema operativo. Sin embargo, en la práctica, al desarrollar dispositivos, es posible utilizar una interfaz HID mucho más simple: dispositivos, cuyo soporte se implementa al nivel de un controlador de sistema estándar, y la programación se simplifica utilizando las bibliotecas de funciones existentes.

Preguntas de control

  1. ¿Cuál es la diferencia entre los cables D y GND en USB? ¿Por qué no puede usar un cable común para la alimentación y la señal?
  2. ¿Cuántos modos de velocidad USB existen actualmente (incluida la versión 3.0)?
  3. ¿Qué es un dispositivo HID? ¿Por qué no requieren escribir controladores para funcionar en los sistemas operativos modernos?
  4. ¿Es posible implementar dispositivos USB utilizando un microprocesador que no tiene soporte de interfaz incorporado?
  5. ¿Cuáles son las principales diferencias entre USB 3.0 y versiones anteriores?

Pero no es suficiente solo conectar físicamente el dispositivo a la computadora, también es necesario establecer el intercambio de datos entre ellos. ¿Cómo elegir un puerto y organizar una conexión? Hace unos pocos años solucion estandar estaba usando el puerto COM. Por cierto, varios especialistas aún instalan 8, 16 o incluso 32 puertos COM en computadoras industriales (hay toda una categoría de diferentes tarjetas de expansión PCI para puertos serie, controladores, etc.). Por lo tanto, si necesita conectar varios dispositivos externos con una interfaz RS-232, es posible que necesite adaptadores costosos y placas de expansión exóticas que, según la antigua tradición, navegan a Rusia durante semanas en barcos de vapor. Por cierto, el nombre de un adaptador ordinario "adaptador DB9m / DB25f" solo puede causar irritación al gerente de una tienda de computadoras.

¿Qué es un dispositivo HID?

Ahora casi todos los dispositivos están conectados a una computadora a través de una interfaz USB. Por lo tanto, muchas PC nuevas no tienen ningún puerto COM.

Interfaz USB: una solución típica para emparejar un nuevo dispositivo externo con una computadora, más precisamente, es una interfaz HID basada en el protocolo USB 1.1.

Aunque muchas personas piensan que la interfaz HID (dispositivo de interfaz humana) es exclusivamente para el teclado, el mouse y el joystick, es adecuado para muchas soluciones relacionadas con la interfaz de dispositivos externos y una computadora.

Si el usuario necesita realizar un intercambio de datos a baja velocidad (hasta 64 kbps) y al mismo tiempo desea reducir el tiempo del tedioso desarrollo de sus propios controladores, entonces HID es muy adecuado para ellos. El resultado será una solución simple y completamente moderna basada en una interfaz de software USB estándar con soporte garantizado en todas las plataformas de software comunes.

Propiedades del dispositivo HID

Desde el punto de vista de la organización del soporte de software para un dispositivo HID, todo parece bastante atractivo: trabajar bajo control de ventanas puede crear rápidamente un código compacto comprensible basado en algoritmos probados listos para usar. En este caso, el desarrollador tendrá mucho tiempo para implementar su propio protocolo de intercambio de datos de nivel superior, ya que el nivel de abstracción necesario ya está organizado por el protocolo HID (consulte la tabla). Además, es fácil para un programador depurar un protocolo de intercambio escrito (por supuesto, si hay un dispositivo HID en funcionamiento); debido a la relativa rigidez del protocolo en sí, es suficiente simplemente desarrollar un programa para admitir el dispositivo. por una computadora ¡Todavía lo haría! El creador del dispositivo HID ya ha realizado mucho trabajo.

Establecer el intercambio de datos entre un dispositivo HID y una computadora

Para describir la interacción de un dispositivo HID con una computadora, usaremos el término "host". En este caso, se refiere a un dispositivo de control en la arquitectura física general de comunicación sobre el protocolo USB. Entonces, todos los puertos en una computadora son hosts. Puede conectarles varios dispositivos USB (unidades flash, ratones, cámaras web, cámaras, etc.) que no tengan un host. El host proporciona descubrimiento, conexión, desconexión, configuración de dispositivos, así como recopilación de estadísticas y administración de energía.

El propio dispositivo HID puede establecer la frecuencia de sondeo, durante la cual se descubre la presencia de nuevos datos. Esto significa que incluso a un nivel tan bajo, el programador puede confiar en el sistema, ya que la tasa de sondeo y otros parámetros de comunicación deben preestablecerse en el programa del controlador del dispositivo HID. En esto, el protocolo HID difiere de la descripción general de USB 1.1 o USB 2.0, que no tiene requisitos estrictos para la organización del protocolo. Sin embargo, para tareas específicas que requieren un alto nivel de seguridad, puede ser bastante difícil deshacerse de las encuestas cíclicas, cuando casi los mismos bloques de datos se transmiten constantemente.

Características de la programación de dispositivos HID

Los dispositivos HID tienen descriptores especiales. Cuando el host determina que el dispositivo pertenece a la clase HID, transfiere su control al controlador adecuado. Se supone que bajo su liderazgo se lleva a cabo un mayor intercambio de datos.

En Windows, el servicio del sistema HidServ es responsable de acceder a los dispositivos HID. Más detalles sobre las funciones de las solicitudes a los dispositivos HID y otras características del trabajo con el controlador HID se describen en el trabajo de P. V. Agurov "Interfaz USB". La práctica de usar y programar” (San Petersburgo: BHV-Petersburg, 2005).

Programación de dispositivos HID en el "nivel superior"

La dura vida de los programadores "aplicados" que trabajan en Pascal se ve facilitada por el módulo HID probado. PAS, el caparazón de hid. dll (Hid User Library - como se especifica en las propiedades del archivo). Los comentarios al archivo dicen que está basado en los módulos hidsdi.h y hidpi.h de Microsoft Corporation. Y el propio archivo HID. PAS es parte del paquete JEDI().

Para trabajar con un dispositivo HID en Entorno Delfos para win32, se utiliza el componente TJvHidDeviceController, que es un administrador global conveniente para acceder a dispositivos HID. Y ya sobre esta base, puede obtener una instancia de objeto para trabajar con un dispositivo específico.

Principales propiedades y eventos del componente TJvHidDeviceController

Consideremos el componente TJvHidDeviceController con más detalle. El evento OnArrival se activa cuando un dispositivo HID llega (se conecta) al sistema; el controlador de este evento proporciona acceso al dispositivo a través de una instancia de la clase TJvHidDevice. El evento simple OnDeviceChange reacciona a un cambio en el estado del dispositivo, solo señala cambios en el sistema. El evento OnDeviceData se activa cuando llegan datos de uno de los dispositivos HID y pasa lo siguiente al controlador: HidDev: TJvHidDevice; - el dispositivo desde el que se recibieron los datos;

El evento OnDeviceDataError notifica un error de transferencia de datos pasando parámetros HidDev al procedimiento de procesamiento: TJvHidDevice; - Dispositivo HID y Error: DWORD; - código de error. El evento OnDeviceUnplug le notifica que se eliminó un dispositivo de la lista de dispositivos instalados en el sistema. Los tipos de controladores de eventos en Plug y Unplug son los mismos (en el texto fuente: TJvHidUnplugEvent = TJvHidPlugEvent). Un objeto de la clase TJvHidDevice correspondiente al dispositivo HID se pasa al controlador.

Para enumerar secuencialmente los dispositivos HID disponibles en el sistema llamando al método Enumerate, el evento OnEnumerate está diseñado, es decir, en el controlador de eventos, los dispositivos encontrados se transmiten secuencialmente como objetos. Este evento se activa a la fuerza mediante el método Enumerate, que se utiliza para "pasar" los dispositivos HID existentes a través del controlador, por ejemplo, al auditar el estado de los dispositivos HID iniciados por el host (computadora).

El evento OnRemoval se activa cuando el dispositivo se elimina físicamente del sistema y tiene el mismo tipo de controlador TJvHidUnplugEvent que OnDeviceUnplug. La función CountByProductName devuelve la cantidad de dispositivos que coinciden con el nombre del producto especificado en el argumento y CountByVendorName devuelve la cantidad de nombres de proveedores especificados en el argumento.

Principales propiedades y eventos de la clase TJvHidDevice

La clase TJvHidDevice es una representación virtual de un solo dispositivo HID. Un nuevo objeto de esta clase se puede obtener, como ya se mencionó, del evento OnArrival o OnEnumerate. La funcionalidad de las clases TJvHidDeviceController y TJvHidDevice está parcialmente duplicada, ya que la primera de ellas integra un toolkit común para trabajar con un conjunto de dispositivos HID disponibles en el sistema y un mecanismo para acceder a uno de ellos. Un dispositivo se puede identificar de forma única por sus propiedades SerialNumber, ProductName y VendorName. Puede usar el evento OnData para obtener información sobre la llegada de datos usando dicho objeto. Los datos se envían a través del método WriteFile (en sentido estricto, a través de una función). WriteFile es un contenedor de la función del sistema WriteFile (kernel32).

Para controlar el hecho de que se elimine el dispositivo, debe asignar su propio controlador al evento OnUnplug. Antes de iniciar el intercambio de datos con un dispositivo HID, debe asegurarse de que dicho intercambio sea posible mediante HasReadWriteAccess. Esta clase incluso tiene un evento OnDataError separado para la ocurrencia de un error de intercambio de datos.

Y ahora veamos fragmentos de código de un proyecto "en vivo" que implementa una aplicación cliente de prueba para organizar el intercambio de datos con un dispositivo no estándar: tarjetas con chip de plástico basadas en HID. En la lucha por el realismo, el autor se tomó la libertad de no descartar enlaces de código tecnológico "extra" de los listados.

El método ScanDevices (Listado 1) está diseñado para iniciar el proceso de búsqueda en el sistema del dispositivo HID requerido. La mayor parte del código, con la excepción de la llamada al método Enumerate, es opcional y brinda flexibilidad a la aplicación, por ejemplo, para que pueda agregar la capacidad de trabajar en una interfaz que no sea HID al mismo programa de prueba. El método AddError imprime información de depuración en la ventana mientras se ejecuta el programa.

El Listado 2 muestra el controlador de eventos OnEnumerate para encontrar el dispositivo externo requerido. Para simplificar, supondremos que el programa puede funcionar con un solo dispositivo del tipo que necesita.

Antes de considerar la implementación adicional del proyecto, debemos hablar un poco sobre el formato de intercambio de datos de alto nivel aceptado, es decir, sobre la estructura diseñada para ser un intermediario entre los métodos de recepción y transmisión de datos y la tarea específica aplicada que se resuelve. . El hecho es que aquí el desarrollador tiene la oportunidad de realizar sus habilidades creativas. O mejor dicho, desarrolladores, porque el proceso de creación de un nuevo protocolo es muy a menudo bidireccional, y el primer violín lo toca el que tiene más dificultades para implementar el algoritmo de intercambio. En general, sea cual sea el protocolo de intercambio, siempre es bueno hacer que cada entidad de software sea lo más visual y autosuficiente posible, incluso en detrimento de algunas tradiciones generalmente aceptadas. Para la mejor decisión- uno que se implementará en poco tiempo con una referencia mínima a entorno de software y con gran potencial de desarrollo. Basado en estos principios, se creó un protocolo de intercambio de alto nivel, donde el concepto principal es "comando". El Listado 3 muestra cuánto ama el autor los datos de cadenas, lo que lo salvó más de una vez al depurar módulos de programa. ¡Qué maravilloso que incluso tengamos un tipo String! Todos los comandos de protocolo se dividen en categorías (clases), dentro de las cuales hay un código de comando que caracteriza de manera única su propósito. El parámetro edParam se utiliza para enviar datos al dispositivo y el parámetro edAnswerData contiene los datos recibidos del dispositivo. El tipo de cadena de los miembros de registro descritos le permite manipular libremente y visualmente los datos en el formato de cadena HEX. Y lo que es más agradable, el formato del registro descrito está ideológicamente en algún punto intermedio entre su propósito directo y varias formas de su presentación (INI, HEX, XML, etc.)

La ejecución de comandos, es decir, el envío de datos al dispositivo, se implementa mediante el envío de paquetes de datos con una longitud de 8 bytes (Listado 4). Esta longitud no es la única decisión, esta elección está dictada por los requisitos del protocolo de la capa superior y puede ser diferente en cada caso específico. Esto es lo que se llama una cuestión de gusto. El indicador extraño IsUSBMode en el método ExecuteCommand (Listado 5 en PC Disk World) se deja como un recordatorio de que en lugar de trabajar con USB, es posible que necesitemos usar un puerto COM o alguna otra interfaz. Al comienzo del grupo de datos enviado, se transmite al dispositivo una secuencia de sincronización de un formato elegido arbitrariamente (por ejemplo, 3E3E3E2B), informando al dispositivo que tiene datos completamente legales en la entrada. Déjame recordarte que en este caso estamos hablando no tanto sobre HID, sino sobre un protocolo específico de alto nivel, divorciado ideológicamente del hardware y diseñado para resolver problemas específicos aplicados.

En el controlador GetDataExecutor de los datos recibidos del dispositivo (paquete de 8 bytes), se utilizó un evento OnNewInputData especialmente creado para transferir los datos procesados ​​inicialmente para su posterior procesamiento, indicando sus valores antiguos y nuevos (Listado 6 en el "World del disco de la PC"). Por lo tanto, los eventos de llegada de datos sin procesar y una indicación de procesamiento adicional se desacoplan, lo que permite agregar algún algoritmo de advertencia específico en una etapa temprana para información de entrada errónea, repetida o innecesaria.

Los ejemplos de trabajo con un dispositivo HID que se presentan aquí ilustran la idea general del artículo: la relativa simplicidad de programar dispositivos HID no estándar utilizando herramientas Delphi.

Si nota un error, seleccione un fragmento de texto y presione Ctrl + Enter
COMPARTIR: