Получение данных с USB-устройства на C или C ++ - PullRequest
11 голосов
/ 05 июня 2010

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

Затем я могу начать играть с данными в моей программе.

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

Ответы [ 5 ]

22 голосов
/ 06 июня 2010

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

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

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

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

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

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

3 голосов
/ 05 июня 2010

Как можно написать программу для 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

1 голос
/ 05 июня 2010

Вот кое-что, с чего можно начать:

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

0 голосов
/ 02 августа 2013

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

Пока не падайте духом, но вам нужно намочить ноги, прежде чем прыгнуть и утонуть. USB2.0 и USB3.0 довольно сухие, но я нашел OSDev Wiki и usbmadesimple полезными ступеньками.

Если вам все еще нужно быть на ПК, вам следует попытаться получить какой-нибудь USB-код с открытым исходным кодом, возможно, для сниффера USB, если вы сможете его найти.

0 голосов
/ 07 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...