Получение данных из USB-устройства в C или C++

Я нуждаюсь в списке всех включенных USB-устройств и сделал, чтобы пользователь выбрал, чтобы позволить консольному приложению получить любые данные, которые отправляет USB-устройство.

Я могу затем начать играть вокруг с данными в своей программе.

Я не хочу пользоваться библиотекой, только стандартные функции C++, и программа должна работать в Windows 98.

12
задан Ad N 3 February 2016 в 15:52
поделиться

4 ответа

Это очень постоянный вопрос на форумах и на сайтах программирования Q + A. Никогда не будет счастливого конца. Буква B в USB означает шину. Это термин в дизайне компьютерного оборудования для описания электрического интерфейса электронных устройств для обмена данными. Он играет ту же роль, что, скажем, шина PCI (экспресс) внутри вашего компьютера. Поскольку это в первую очередь электрические характеристики, USB поддерживает очень большое количество типов устройств. Все, что угодно, от адаптера беспроводной сети, модема, карты флэш-памяти до грелки для чайника. Практически единственные типы устройств, с которыми он плохо справляется, - это устройства, требующие очень большой полосы пропускания, например видеоадаптеры.

Спецификация USB содержит очень элегантную спецификацию протокола, описывающую, как устройства могут совместно использовать шину и как они могут обмениваться данными. Однако эта спецификация протокола вообще не описывает формат данных, она просто определяет понятие возможности доставки блоков байтов. Само устройство должно придавать значение этим байтам.

На стороне машины вам нужно программное обеспечение, чтобы интерпретировать эти байты и заставить машину делать с ними что-то интересное. Для этого требуется драйвер устройства. Точно так же, как ваша видеокарта и ваша сетевая карта требуют драйвера устройства. Очевидно, что видеодрайвер очень отличается от драйвера сетевой карты. То же самое и с драйверами USB, там мало общего.

Если вы хотите написать программное обеспечение, которое одинаково обращается с USB-устройствами, вам нужно написать это на том уровне, на котором у них все еще есть что-то общее. На уровне контроллера USB вы можете написать драйвер фильтра, который внедряет себя в стек драйверов USB и просматривает пакеты запросов ввода-вывода между контроллером и драйвером устройства. Подобно, скажем, драйверу фильтра winpcap, который шпионит за трафиком TCP / IP. Однако здесь не так много чего интересного, вы бы смотрели на капли байтов, которые проходят туда и обратно. Это гораздо более серьезная проблема, чем winpcap, по крайней мере, он видит, как летают байты, значение которых задокументировано где-то в RFC. Это не относится к USB, компания, которая производит устройства USB, также обычно является поставщиком драйверов устройств. Они хранят недокументированный внутренний формат.

Написание драйверов фильтров требует довольно продвинутых навыков, есть много болевых точек. Например, сбой операционной системы из-за простой ошибки. В последнее время также произошли значительные изменения в модели драйверов Windows, драйверы USB были перемещены в кольцо 3 (пользовательский режим), чтобы операционная система оставалась стабильной.

Для начала загрузите Windows WDK (он же «DDK») и прочтите книги Уолтера Они.Желательно все.

22
ответ дан 2 December 2019 в 05:40
поделиться

Как можно написать программу для USB, желая понять ее предысторию, не желая при этом много читать о ней, не желая использовать библиотеку, и все это одновременно? В любом случае. есть проект "libUSB Win32" от Стефана Мейера, который в настоящее время не находится в стадии интенсивной разработки, но написан на C, возможно, это может вам подойти, он также может работать под древними версиями Windows;) вы можете найти его здесь:
http://sourceforge.net/apps/trac/libusb-win32/wiki
некоторое время назад я написал это на VB6, который использует "libUSB Win32" не знаю если это может быть вам полезно:
http://www.activevb.de/cgi-bin/upload/download.pl?id=3061

3
ответ дан 2 December 2019 в 05:40
поделиться

Вот кое-что, что поможет вам начать:

И за громкие возгласы об обновлении ОС, которая не из последнего тысячелетия . Я слышал, что Linux отлично поддерживает USB.

2
ответ дан 2 December 2019 в 05:40
поделиться

Мне просто нужен список всех подключенных USB-устройств, и пользователь должен выбрать одно, чтобы консольное приложение получало любые данные, отправляемые USB-устройством.

Получить список - не большая проблема, это получение данных.

Я знаю, что вы не хотите писать драйвер, но драйверы делают следующее: получают данные от устройства.

0
ответ дан 2 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: