2010-06-05 38 views
9

Necesito una lista de todos los dispositivos USB conectados y hacer que el usuario seleccione uno para que la aplicación de consola reciba los datos que envía el dispositivo USB.Recibir datos de un dispositivo USB en C o C++

Puedo comenzar a jugar con los datos en mi programa.

no quiero utilizar, sólo estándar funciones de la biblioteca C++, y el programa debería funcionar en Windows 98.

+0

No hay funciones estándar de C++ para hacer esto. –

+0

No estoy seguro ... ¿Pueden decirme cómo se puede hacer entonces? – Midas

+0

¿por qué no quieres usar las bibliotecas? – OlimilOops

Respuesta

1

Aquí hay algo para empezar:

Y por el amor de actualización en voz alta a un sistema operativo que no es de el último milenio. Escuché que Linux tiene un gran soporte para USB.

+1

+1 para la actualización - Windows 98 es antiguo. (+1 para la recomendación implícita de Linux.) Si las personas se actualizaran, obtendríamos cosas interesantes más rápido. – Thanatos

+0

Hoy leo mucho sin obtener ningún resultado y no tengo ganas de leer todo un libro sobre especificaciones de USB. ¿Puede darme un ejemplo de código de lo que quiero hacer? Puede ser muy básico. – Midas

+0

@Midas: las cosas de bajo nivel no son simples.Yo, por mi parte, he pasado mucho tiempo simplemente leyendo las especificaciones para tener una mejor idea sobre cómo funciona el USB. Si estás buscando aprender cosas, a veces es mejor leer los documentos en lugar de saltar al código de ejemplo. –

3

¿Cómo se puede escribir un programa para USB, queriendo entender el fondo del mismo, sin querer leer mucho sobre él, sin querer usar una biblioteca, todo al mismo tiempo? De todos modos. hay un proyecto "libUSB Win32" de Stefan Meyer no muy desarrollado en este momento, pero escrito en C tal vez esto podría ser algo para ti, también tiene la capacidad de funcionar bajo versiones antiguas de Windows;) lo puedes encontrar aquí :
http://sourceforge.net/apps/trac/libusb-win32/wiki
hace un tiempo he escrito esto en VB6 que hace uso de "libUSB Win32" no sabe si puede ser útil para usted:
http://www.activevb.de/cgi-bin/upload/download.pl?id=3061

+0

libUSB se basa en el código estándar de C++, ¿no? Podría escribir esto yo mismo, adaptado a mi programa. Tal vez podría echar un vistazo a la fuente. – Midas

+0

La URL parece haber cambiado. Tuyo ya no funciona. Pero al usar Google encontré que este enlace funcionaba: https://sourceforge.net/projects/libusb-win32/ – Scindix

+0

También las menciones wiki de lo siguiente: "libusb-win32 ahora está en el modo de mantenimiento Bug-Fix-Only. Se recomienda que los nuevos proyectos migren a la API libusb-1.0 y que usen libusb Windows (http://libusb.info) ". – Scindix

19

esta es una muy pregunta persistente en foros y programación de sitios Q + A. Nunca con un final feliz B en USB significa bus. Ese es un término en el diseño de hardware de computadora para describir una interfaz eléctrica para que los dispositivos electrónicos intercambien datos. Juega exactamente el mismo papel que, por ejemplo, el bus PCI (expreso) dentro de su máquina. Dado que es una especificación eléctrica en primer lugar, USB es compatible con una gran cantidad de tipos de dispositivos. Cualquier cosa desde un adaptador de red inalámbrico, un módem, una tarjeta de memoria flash hasta una tetera más caliente. Casi los únicos tipos de dispositivos que no maneja bien son los que requieren un ancho de banda muy grande, como un adaptador de video.

La especificación USB tiene una especificación de protocolo muy elegante que describe cómo los dispositivos pueden compartir el bus y cómo pueden intercambiar datos. Sin embargo, esa especificación de protocolo no describe en absoluto el formato de los datos, simplemente define la noción de poder entregar trozos de bytes. Depende del dispositivo dar significado a esos bytes.

En el extremo de la máquina, necesita un software para interpretar esos bytes y hacer que la máquina haga algo interesante con ellos. Eso requiere un controlador de dispositivo. Al igual que su tarjeta de video y su tarjeta de interfaz de red requieren un controlador de dispositivo. Obviamente, un controlador de video es muy diferente de un controlador NIC. Lo mismo es cierto para los controladores USB, hay poco en común.

Si desea escribir un software que trate dispositivos USB similares, entonces necesita escribir eso al nivel en el que todavía tienen algo en común. Eso es a nivel del controlador USB, podría escribir un controlador de filtro que se inyecta en la pila del controlador USB y eche un vistazo a los paquetes de solicitud de E/S entre el controlador y el controlador del dispositivo. Similar a, por ejemplo, el controlador de filtro winpcap que espía el tráfico TCP/IP.Aunque no hay mucho interesante que ver, estarías mirando los bloques de bytes que pasan de un lado a otro. Es un problema mucho más grande que winpcap, al menos ve bytes pasar de largo cuyo significado está documentado en algún lugar de un RFC. Ese no es el caso para USB, la compañía que fabrica el dispositivo USB también suele ser el proveedor del controlador del dispositivo. Mantienen el formato interno sin documentar.

Escribir controladores de filtro requiere habilidades bastante avanzadas, hay muchos puntos débiles. Como estrellar el sistema operativo cuando cometes un simple error. También ha habido un flujo considerable en el Modelo de controlador de Windows últimamente, los controladores USB se han movido al anillo 3 (modo de usuario) para mantener el sistema operativo estable.

Para comenzar, descargue Windows WDK (también conocido como "DDK") y lea los libros de Walter Oney. Preferiblemente todos ellos.

+0

Gracias, pero realmente no quiero hacer un controlador. ¿Es eso un problema? ¿Y estás seguro de que el libro es bueno para mí? Vivo en Bélgica y no puedo comprarlo aquí. – Midas

+1

Sí, eso sería un problema. Amazon.com entrega a Bélgica afaik. Probablemente no quieras gastar demasiado dinero en ello, final feliz y todo eso. Sé que tienes buenas bibliotecas disponibles en las ciudades universitarias. –

+0

+1 muy buena respuesta – OlimilOops

0

Simplemente necesito una lista de todos los dispositivos USB conectados y le pido al usuario que seleccione uno para que la aplicación de consola reciba los datos que envía el dispositivo USB.

Obtener la lista no es el gran problema, es recibir los datos.

Sé que no desea escribir un controlador, pero esto es lo que hacen los conductores: recibir datos de un dispositivo.

0

Para agregar a algunas buenas respuestas ...

de programación USB no es '' menudencias

En primer lugar hay que aprender cómo funcionan los sistemas operativos y por qué tienen los conductores.

A menos que desee programar un puerto RS-232 en el DOS, no se puede comunicar directamente con los puertos USB, usted tiene que comunicarse con el sistema operativo y el controlador para el dispositivo con el que está interesado.

0

El consejo que recibes aquí está en la marca; USB no es fácil, créanme ... Estoy trabajando en un proyecto USB pero desde el back-end. Me parece que también debes mirar al back-end, ahí es donde realmente no tienes que lidiar con bibliotecas y todo eso, pero no podrás evitar la lectura de lo que sea que hagas.

No se desanime todavía, pero sí necesita mojarse los pies antes de saltar y ahogarse. USB2.0 y USB3.0 son bastante secos, pero encontré OSDev Wiki y usbmadesimple como escalones útiles.

Si aún necesita estar en la PC, entonces debería considerar intentar obtener un código USB de código abierto para tal vez un sniffer USB si puede encontrarlo.

+0

No agregue firmas a sus publicaciones. (Según la sección "No usar firma, cadenas o saludos" de [el contenido de ayuda] (http://stackoverflow.com/help/behavior).) –

Cuestiones relacionadas