libusb1.0 Windows

Всем привет.

Пытаюсь тут научиться работать с USB. Но что-то я не то делаю. libusb-1.0.20 (c SF брал).
Вот код:

#include <stdio.h>
#include <libusb-1.0/libusb.h>

int main(int argc, char *argv[])
{
	struct libusb_device **devs;
	struct libusb_device_descriptor info;
	unsigned count,i;

	int rv=0;
	if (libusb_init(NULL)<0)
	{
		printf("Can't open libusb\n");
		return 1;
	}
	libusb_set_debug(NULL, libusb_log_level::LIBUSB_LOG_LEVEL_INFO);

	count=libusb_get_device_list(NULL,&devs);
	if (count<=0)
	{
		printf("Error enumerating devices\n");
		return 2;
	}

	for (i=0;i<count;i++)
	{
		libusb_get_device_descriptor(devs[i],&info);
		printf("VID=%04x PID=%04x\n",info.idVendor,info.idProduct);
		if (info.idVendor==0x1915 && info.idProduct ==0x7777)
		{
			libusb_device_handle* hndl;
			libusb_open(devs[i], &hndl);
			if (hndl != NULL)
			{
				printf("Opened\n");
				rv = libusb_set_configuration(hndl, 1);
				if (rv != LIBUSB_SUCCESS)
					printf("Error libusb_set_configuration: %s\n", libusb_strerror(libusb_error(rv)));
				else
				{
					rv = libusb_claim_interface(hndl, 0);
					if (rv != LIBUSB_SUCCESS)
						printf("Error libusb_claim_interface: %s\n", libusb_strerror(libusb_error(rv)));
					else
					{
						printf("Claimed\n");
						libusb_release_interface(hndl, 0);
					}
				}
				libusb_close(hndl);
			}
		}
	}

	libusb_free_device_list(devs,1);
	libusb_exit(NULL);
	return rv;

}

И при попытке установить конфигурацию получаю следующее:

libusb: error [winusbx_claim_interface] could not access interface 0: [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 1 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 2 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 3 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 4 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 5 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 6 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 7 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 8 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 9 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 10 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 11 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 12 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 13 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 14 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 15 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 16 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 17 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 18 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 19 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 20 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 21 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 22 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 23 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 24 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 25 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 26 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 27 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 28 with WinUSB): [87VID=1002 PID=4397
VID=1002 PID=4399
VID=1002 PID=4397
VID=1002 PID=4397
VID=1002 PID=4396
VID=1002 PID=4396
VID=1002 PID=4396
VID=1106 PID=3483
VID=046d PID=c03e
VID=046d PID=c517
VID=0483 PID=5740
VID=05e3 PID=0608
VID=05e3 PID=0736
VID=08bb PID=2902
VID=0a12 PID=0001
VID=1915 PID=7777
Opened
Error libusb_set_configuration: Entity not found
VID=1d5c PID=2000
] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 29 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 30 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 31 with WinUSB): [87] The parameter is incorrect.
libusb: error [auto_claim] could not auto-claim any interface

Причем иногда код выше работает, а часто после какого-то момента перестает.

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не знаю, актуально ли еще, но у меня была точно такая же проблема (не могу сделать interface claim — код ошибки был 87). Решилось после установки libusbK, как описано вот здесь: github.com/…​ibusb/libusb/wiki/Windows

Libusb для виндовса по сути своей слегка не естественнен. На сколько я помню, в libusb1 есть слой совместимости с libusb0. По ошибкам в оригинальном посте такое ощущение что выбирается неверная конфигурация устройства. В pyusb если мне не изменяет память поддержка 3х бекендов.

Проблема была в том, что драйвер libusb-win32 (это libusb 0.1). Так вот libusb1.0 не работает корректно с этим драйвером, для него обязательно нужно использовать libusb-win32 (это libusb 0.1).
На это на сайте libusb два взаимоисключающих высказывания. Ниже приводил.

А вот для юзания libusb1.0 нужен другой драйвер.

При юзании pyusb ты сам указываешь что юзать: версию 0.1 или 1.0 или там какой-то третий openusb.

слой совместимости
Никак не поможет. Это обертка, чтобы просто предоставить старый интерфейс.

Вопрос закрыт. Вот ответ:
Да всё правильно выше написано, только libusb1.0 не умеет толком работать с драйвером, основанном на libusb0.1. Юзай libusb0.1.
Вот такой ответ я ожидал получить, но не дождался, быстрее сам разобрался.

Большинство ответов в стиле, «у меня работает, но я не знаю как» и «я вообще мимо проходил и решил посраться», и «смени твою гуано ось на другую гуано ось».

Если хотите разобраться, то пишите в какой-то libusb-devel.

Ага и не раз.

Recommended: Use the most recent version of Zadig, an Automated Driver Installer GUI application for WinUSB, libusb-win32 and libusbK...

Но вот в другом месте они же:

Device driver support: WinUSB, HID, libusb-win32 (libusb0.sys, not recommended), libusbK, usbdk.

И оказалось, что не просто не рекомендуется, а просто не работает.

Так а что за железка у вас?

и что этот квадрик по задумке должен делать?

Всё. К нему даже камеру можно присобачить. Главное в нем, что он комнатный и маленький и его можно програмить, как хочется.
Типичные же или хрень коммерческая, к которой хрен подступишься кроме вариантов определенных производителем. Либо дура для улицы только. Я долго подобное искал и СrazyFlie меня удовлетворил.
Это совсем не игрушка, чтобы тупо полетать.

Сначала научю его самого летать по гироскопу (то бишь задал маршрут в декартовых координатах и он по нему летит по инерциалке), затем камеру присобачу (она уже помещение отрабатывать будет), добавлю ума (понятно на компе всё обсчитываться будет). Инерциалку отработаю, заодно разберусь в подводных камнях там. Как-то нужна была, взяли с гитхаба — на откалиброванном железе под которое та писалась, хорошо работала (по видео на сайте тех разрабов), а вот с другим железом или не откалиброванном так, как нужно для того кода, чушь была. Т.е. в теории алгоритм инерциалки простой, но с безумной кучей нюансов, зависящих от конкретного железа.
В общем чего с ним делать придумать можно море. Главное, что он комнатный и программируемый полностью. Прошивки у него опенсурсные, то есть правь под себя в удовольствие.

А вот на стандартном пиксхавке уже дура по размерам будет — подними тот пиксхавк только.
А на этом отрабатывать алгоритмы разные удобно.

А тут еще ребенку 3Д принтер купил, будет мне крепления нужные делать, корпуса и т.п.

Ну а как что получится на гитхаб выложу, может кому пригодиться.

У меня на винде работал python-libusb1 (github.com/...vpelletier/python-libusb1) с драйвером libusbK. На C с libusb1 только хеллоуворды пробовал, но вроде тоже работало.

Я уже расковырял pyusb. При его применении нужно указывать 0.1 или 1.0 юзать.
Производители СrazyFlie рекомендуют драйвер libusb-win32, который как раз libusb0.sys получается.

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

Ну а вопрос, возможно ли использовать другой драйвер для того железа уже и спрашивать здесь не буду. Все одно никто здесь не знает.

Вы просто не представляете, что было до того как появился libusb. Надо было на любой нестандартный девайс свои драйвера писать, так что не жалуйтесь. А по-поводу того, что никто не дает вам прямого ответа, так я не представляю даже как все это помнить. Я разбирался с libusb пару лет назад, уже все давно забылось.

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

www.bitcraze.io/...02/the-crazyradio-dongle

А как просто получить для этого устройства виртуальный COM в Винде я так пока и не разобрался. Но это уже не сильно важно, просто интересно, возможно-ли.

Посмотрел их вики. Там свой интерфейс реализован — две конечные точки control и bulk. Виртуальный ком порт тут не вариант. Самый простой способ, все таки использовать libusb, от WinDDK вы будете плеваться еще сильней.

Спасибо за совет.
Только оказалось, что libusb1.0 и 0.1 в корне разные. Я не мог и предположить такого, предполагал, что это расширение интерфейса (пусть и с переименованием) версии 0.1, оказалось не так.
С версий 0.1 заработало.

ну хоть кто-то начал технические топики создавать:)

После 3 попыток я думаю прекратить это дурное тут занятие.
Буду на SO спрашивать.

Можете взяти за приклад цей проект:
github.com/...DiscoveryBidirectionalHID

девайс STM32F4Discovery, на PC Python скрипт який працює з libusb, я використовував цей проект під Windows 7, він був робочим.

„As a demonstration of the capabilities of this project, I have implemented two simple command/response sequences.

Sending the string ’test’ to the STM32F4Discovery from the included python program, you will get a response from the STM32F4Discovery stating ’Testing 1 2 3 . . .’

Sending the string ’led’ plus a number ’3′, ’4′, ’5′, or ’6′, the corresponding LED3/4/5/6 on the STM32F4Discovery will toggle and the STM32F4Discovery will also respond with text indicating such.

In addition, I have included a simple function to allow sending text via the HID protocol: void SendStrToUSB(uint8_t* str);”

Да всё правильно выше написано, только libusb1.0 не умеет толком работать с драйвером, основанном на libusb0.1. Юзай libusb0.1.
Вот такой ответ я ожидал получить, но не дождался, быстрее сам разобрался.

Большинство ответов в стиле, «у меня работает, но я не знаю как» и «я вообще мимо проходил и решил посраться», и «смени твою гуано ось на другую гуано ось».

Кстати. Для этого устройства Zadig показывает, что драйвер libusb0 (v1.2.6.0)
Может и либу для работы с ним обязательно использовать libusb0.1?
Т.е. либа libusb1.0 с ним работать корректно не будет?

В то же время на гитхабе libusb написано
Device driver support: WinUSB, HID, libusb-win32 (libusb0.sys, not recommended), libusbK, usbdk.
Но на сайте CrazyFlie пишут ставить драйвер libusb-win32 и Zadig показывает, что драйвер libusb0 (v1.2.6.0).
Получается, что libusb-1.0 будет криво работать с libusb-win32 (libusb0.sys, not recommended) драйвером.
Вопросы:
1. Если я сменю драйвер на WinUSB то устройство работать не будет? Или вообще говоря железу пофиг — это прерогатива ОСи?
2. С драйвером драйвер libusb0 (v1.2.6.0) обязательно использовать именно libusb-win32 сборку, это libusb-0.1?

З.Ы. Блин, запутался уже в этом зоопарке либ и драйверов для USB.
Интересно, как в Питоне (в pyusb) разруливают этот зоопарк и используют правильную либу?
Как-то спрашивают у системы какой драйвер обслуживает конкретное железо? А как?
Честно, очень не хочется лезть в исходники pyusb. Может кто подскажет здесь. Или я слишком многого хочу от местных программистов?

Честно, очень не хочется лезть в исходники pyusb. Может кто подскажет здесь. Или я слишком многого хочу от местных программистов?
Я не смотрел новые версии libusb, но старые представляют программеру блокирующий интерфейс для записи и чтения без нормальной поддержки мультипайпового доступа, поэтому лично я поковырял немного её и отбросил, как поделку для простейших HID устройств, на большее она тянет. Добиться нормальной скорости на балк пайпах с ней увы у меня не получилось, пришлось затачиваться под нативные интерфейсы каждой ОС, где USB реализован по event-driven модели и мы имеем минимальное latency между посылками. Также libusb не поддерживает нормальный scatter-gather DMA для USB для организации chained packets, она слишком далеко от железа для серьёзного применения.

О, спасибо за ответ.
И еще один вопрос, какой нативный API для USB в линухе?

И еще один вопрос, какой нативный API для USB в линухе?
Более-менее простой. www.kernel.org/doc/htmldocs/usb

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

Пока я разобрался в в том, что libusb1.0 не будет работать с драйвером, который основан на libusb0.1
Глубже лезть не планирую пока. А за ссылку спасибо. Она будет полезна, если придется от порта большего чего хотеть, чем libusb предлагает.

Глубже лезть не планирую пока. А за ссылку спасибо. Она будет полезна, если придется от порта большего чего хотеть, чем libusb предлагает.
Для твоего свистка врядли понадобится больше, это как раз ниша libusb. А вот если делать поддержку USB дисплеев или USB-Ethernet, то там придётся не так раскорячиться...

Не спорю. Но я в эти ниши лезть не собираюсь.
Мне нужно на С (С++) стукаться к квадрику через этот свисток и написать враппер для матлаба (в нем уже математику делать).
Варианты через pyusb и zmq мне сильно не нравились. Монстрик такой с морем лишних прослоек и зависимостей получается.
Это же большей частью хобби и в хобби хочется всё делать корректно, а не так как принято в индустрии — плодить говнокод.

Кстати, если хотите делать не говнокод, то зря вы решили использовать libusb 0.1. libusb.org говорит

Please use libusb-1.0 for all new development.
Только драйвер берите libusbk вместо libusb-win32.

Ну я по примеру pyusb уже набросал (еще не полностью) плюсовый враппер к обеим этим либам. С плюсами по крайней мере не забудешь освобождать ресурсы по выходу из области видимости.
Но сможет-ли libusbk работать с этим «свистком»?

вроде получается, что для windows и libusb-1.0 API других вариантов нет

Но сможет-ли libusbk работать с этим «свистком»?

выше (или ниже :) добавил

Вики для этого девайса говорит использовать libusbk в случе проблем wiki.bitcraze.io/...dio:install_windows_zadig

Это я не дочитал. Просто у меня стал libusb-win32 и дальше я уже не прочитал.

Ну и когда ставил, еще даже и предположить об этих проблемах не мог.

Да действительно нужно использовать не libusb1.0, а libusb0.1 в Винде. Вероятно это связано вот с этим моментом

Device driver support: WinUSB, HID, libusb-win32 (libusb0.sys, not recommended), libusbK, usbdk.
Ну неужели так сложно было им написать, что с libusb-win32 (libusb0.sys, not recommended) не «не рекомендуется», а не просто работает (не поддерживается). Используйте libusb0.1 исключительно в сборке libusb-win32.

З.Ы. Но ДОУ похоже уже помирает, как и кывт когда-то. Я помню еще те времена, когда там приличные програмеры обитали, теперь только политота и куча непонять кого (только не программисты), здесь похоже всё идет в том же направлении.
Пора сваливать на SO, а здесь только развлекаться в различных срачах типа где найти бабу и как вайтивайти. :(((

Мне одному слух режет сочетание embedded и виндовс ? Венде — вендово, там же winsdk есть — старый добрый жопо-образный API и как-то работает. Оставь libusb для linux — СПО при портировании в это гавно всегда непредсказуемо. И дело тут в большинстве случаев не в самом СПО...

Ну была надежда, что раз эту либу портировали и уже 20 версий налепили, то она рабочая. Не хотелось MS API юзать и закатывать солнце ручками. Надеялся, что заюзаю одну либу и расслаблюсь.
Вот есть такая libsndfile — один чел саппортит и работает прекрасно, что в винде, что в линухе.
OpenCV вот прекрасно и в линухе и в винде работает.

Я работал с libusb по семеркой — тогда она кажись была 1.2 версии. Походу у тебя или 10 или ты лоханулся с версией, потому что не читал доки/changelog’и. OpenCV — сравнение не равноценное — там девайсов кроме камеры нет нифига, а это на уровень выше. libsndfile — это вообще мимо кассы, она к девайсам отношения никогда не имела.

Win7×64. libusb отсюда libusb.info
Компилирую mingw49_32, что с Qt идет.

дык, так версия либы какая ? в посте заявлена 1.0, я так понимаю с семеркой работает >= 1.2.

libusb.info
На этом сайте, насколько я понимаю это и есть суппортеры этой либы версия 1.0.20.

Или ты про версию libusb-0.1 — там другой API в отличие от libusb-1.0.
Хочешь сказать, что под винду нормально спортирована только libusb-0.1?

В линухе в репах уже давно идет libusb-1.0 ветка. И только для чего-то древнего еще осталась где-то libusb-0.1, возможно.

Хмм, заходим:

www.libusb.org/wiki/libusb-win32

Читаем:

...
Vista/7 64 bit are supported from version 1.2.0.0 since a Microsoft KMCS accepted digital signature is embedded in the kernel driver libusb0.sys.
...

???

Hint: нет смысла читать changelog от libusb, пытаясь юзать libusb-win32

libusb.info
What happened to the old site?
The old site (.org) is now obsolete, please use libusb.info.
All of the current libusb development team has moved to libusb.info.
Врут?

Ну и libusb.org: ​libusb-1.0.9 (2012-04-20)
Логично, что я брал с сайта libusb.info

libusb-win32
Это порт libusb-0.1, а не libusb-1.0.

P.S. И эта: embedded — это не авианосец кузя, не паровоз, не intel и даже не nvidia. это то что помещается на руку, носится как минимум сутки, столько же работает и не греется. Чета тупорылый маркетинг, про#бавших embedded струю компаний (интел привет), моск людям конкретно поплющил... Да, и стоит < $100 в прыжке

P.S. И эта: embedded — это не авианосец кузя, не паровоз, не intel и даже не nvidia. это то что помещается на руку, носится как минимум сутки, столько же работает и не греется.
Слава богу у всего цивилизованного мира другое мнение.

ты опять путаешь великого себя и цивилизованный мир, понимаешь ли — цивилизованный мир таких свистунов на общие темы не сильно величает, за многие столетия как-то привык отсеивать зерна от плевел ;) так доложи нам конкретно про успехи, скажем, интел на embedded поприще, если конечно есть что сказать. Вот уважаемая пресса пишет что обосрался твой интел в очередной раз : www.ixbt.com/...-jetogo-napravlenija.html

Че так ? Откаты не прошли, как в первый раз с AMD ? Ччерт, вот незадача, а ?...

ты опять путаешь великого себя и цивилизованный мир, понимаешь ли — цивилизованный мир таких свистунов на общие темы не сильно величает, за многие столетия как-то привык отсеивать зерна от плевел ;)
Ну тебе из погреба, конечно же видней, чем дышит цивилизованный мир.
Вот уважаемая пресса пишет что обосрался твой интел в очередной раз : www.ixbt.com/...-jetogo-napravlenija.html
Хех, уважаемая пресса. Я уже год работаю на Apollo Lake, а уважаемая пресса даже не знает, что в апреле уже были пробные сэмплы на рынке.

www.intel.com/...apollo-lake/overview.html

Для справки: embedded — это и авианосец кузя тоже, и паровоз, и Intel и даже Nvidia, в том числе и то что на руку не помещается, вообще не носится, без внешнего питания не работает и греется как электрочайник.
Чего только «бортовые суперкомпьютеры» в новомодных автопилотных автоведрах стоят — чем не embedded?

Я вот свой системник в стол встроил, тоже в некотором смысле embedded получается.

А какую функцию он выполняет, кроме обогрева?

Выполняет программы в графической оболочке.

Как человек периодически вступающий в кучу под названием «драйвера для Виндовс» скажу — брось каку, на этом поскальзываются и закаленные бойцы.

Так я и не хочу в дрова лезть. Мне всего-лишь с USB пообщаться бы.
Открыть его, закрыть, послать туда, принять данные. Всё. Причем на С (С++) это сделать.

В сам USB лезть не надо. Драйвер предоставит интерфейс конечного устройства — серийного, блочного, мультимедийного итп.
Если очень чешется помудохаться — утилиты SysInternals облегачт жизнь, насколько єто возможно.

Т.е. предлагаешь использовать WinAPI, ибо libusb кривая под виндой?
Мне всего-лишь хочется узнать это libusb кривая или я не правильно с ней работаю или под виндой только WinAPI (для USB) работает.

Я вобще не понимаю, зачем она нужна. Возьми свой виртуальный ком-порт или имидж-девайс и пиши-читай в него обычным рид-райтом.

Объясни как это? Почему виртуальный?
Это вполне железный девайс. Он принимает команды с USB порта и шлет их по радиоканалу в CrazeFlie и обратно.
А как связать железный USB с виртуальным COM портом в винде? Как-то искал подобное, рабочими были только коммерческие решения (по написанному на их сайтах, как в реальности фиг знает) или решения для конкретной железяки.

В некоторых программах, которые используют usb, usb-порт называют com-порт. Mscomm может читать id подключенных к usb устройств. Как примере на Visual Basic.

Иногда ёпеннсурсных писателей хочется бить больно и сильно:

		if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) {
			handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE;
			err = GetLastError();
			switch(err) {
			case ERROR_BAD_COMMAND:
				// The device was disconnected
				usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0));
				return LIBUSB_ERROR_NO_DEVICE;
Давай, страдай програмер в попытках понять, что и не работает. Нам было просто лень передать код ошибки в уже реализованную функцию. Копипаста рулит.
Причем WinUsb_Initialize не возвращает ERROR_BAD_COMMAND. Она возвращает
ERROR_INVALID_HANDLE, ERROR_NOT_ENOUGH_MEMORY, ERROR_BAD_DEVICE.

Похоже придется ставить DDK и фиксить и libusb.

Ау, ембедеры?
С USB в винде из С работать можно?
libusb1.0 работает?

С USB в винде из С работать можно?
Да, пиши драйвер %)
libusb1.0 работает?
Работает, вот только ты уверен, что не пытаешься работать с устройством, для которого уже стоят драйвера?

В смысле? Пофиксить libusb? Похоже придется.
Или я где-то не правильно использую эту либу?
С этим устройством прекрасно работает прога на Питоне через из пакет pyusb.
А код на С выше иногда работает, но не всегда.

Или я где-то не правильно использую эту либу?
USB очень разнороден, тяжело сказать правильно ты используешь или нет не видя устройства.
С этим устройством прекрасно работает прога на Питоне через из пакет pyusb.
Так посмотри как они работают — это враппер поверх libusb. И портируй код на С/C++.

Вот питоновский код, что прекрасно работает в винде

class CfUsb:
    """ Used for communication with the Crazyradio USB dongle """

    def __init__(self, device=None, devid=0):
        """ Create object and scan for USB dongle if no device is supplied """
        self.dev = None
        self.handle = None
        self._last_write = 0
        self._last_read = 0

        if device is None:
            devices = _find_devices()
            try:
                self.dev = devices[devid]
            except Exception:
                self.dev = None

        if self.dev:
            if (pyusb1 is True):
                self.dev.set_configuration(1)
                self.handle = self.dev
                self.version = float(
                    '{0:x}.{1:x}'.format(self.dev.bcdDevice >> 8,
                                         self.dev.bcdDevice & 0x0FF))
            else:
                self.handle = self.dev.open()
                self.handle.setConfiguration(1)
                self.handle.claimInterface(0)
                self.version = float(self.dev.deviceVersion)
А аналогичный в С не хочет. В теории питон тоже использует libusb10, но я не уверен и не уверен, что в pyusb не пофиксили чего в libusb10, чтобы она работала.
И более того, код на С на котором я основывался на который посылают с сайта CrazyFlie также глючит под виндой. Разраб того кода мне ответил, что винды не знает и хер знает почему не работает.

Более того, когда я отлаживался (вверху просто вырезанный кусок для теста) я мог не закрыть порт. Но почему pyusb работает без проблем, а аналогичный код на С, что юзает libusb1.0 не работает. Вот это не понятно.
Помню, когда давно еще звуковую карту не отпустил и упал, то к ней уже никто достучаться не мог. В этом случае было бы понятно, что только перезагрузка винды поможет.

Вот и пытаюсь понять, либо я неправильно libusb юзаю, либо она кривая.

Вот и пытаюсь понять, либо я неправильно libusb юзаю, либо она кривая.
Возможно у тебя виндовый dll hell: ru.wikipedia.org/wiki/DLL_hell Питон юзает одну версию, ты другую.

Как я понял они с проектом в виде pyc файла тянут.
Я же заюзал последнюю, что libusb.info предлагает. Причем юзаю статическую либу.

А в коде там случайно сама структура

&info
не равна null иногда? Тогда в проверке условия
info.idVendor
будет возникать ошибка.

Нет. libusb_get_device_descriptor зачитывается всегда на ура без проблем.
Проблема именно в libusb_set_configuration. Если это пропустить, то

VID=1002 PID=4397
VID=1002 PID=4399
VID=1002 PID=4397
VID=1002 PID=4397
VID=1002 PID=4396
VID=1002 PID=4396
VID=1002 PID=4396
VID=1106 PID=3483
VID=046d PID=c03e
VID=046d PID=c517
VID=0483 PID=5740
VID=05e3 PID=0608
VID=05e3 PID=0736
VID=08bb PID=2902
VID=0a12 PID=0001
VID=1915 PID=7777
Opened
Error libusb_claim_interface: Access denied (insufficient permissions)
VID=1d5c PID=2000
libusb: error [winusbx_claim_interface] could not access interface 0: [87] The parameter is incorrect.
Но до какого-то момента код выше работает.

Т.е. такое впечатление, что в винде где-то порт оказывается захвачен и не освобожден.
Но, что удивляет, что Питоновская прога CrazyFlie работает без проблем (но там уже столько наворочено на Питоне, что я уже не тяну понять, что там делается и как). Т..е. получается, что порт на уровне винды не захвачен.

Может тогда дело в подключаемом устройстве? stackoverflow.com/...interface-already-claimed

Попробовал
libusb_detach_kernel_driver(hndl, 0);
rv = libusb_claim_interface(hndl, 0);
Всё тоже самое. Причем из доки по libusb_detach_kernel_driver:
Detach a kernel driver from an interface.
If successful, you will then be able to claim the interface and perform I/O.
This functionality is not available on Darwin or Windows.

Т.е. под виндой эта функция ничего не делает по доке.

ubuntuforums.org/showthread.php?t=1646565

Здесь в примере детач в самом начале программы

#ifdef LINUX
libusb_detach_kernel_driver(devh, 0);
#endif

Это для Линуха, а для Винды как?

Ну что бы в такой последовательности, вначале детач, потом set_configuration

libusb_detach_kernel_driver(hndl, 0);
libusb_set_configuration(hndl, 1);
libusb_claim_interface(hndl, 0);

или еще выше над этими строками попробовать, в обще сразу после получения списка устройств сразу детач с нужным id


libusb_detach_kernel_driver(hndl, 0);
libusb_device_handle* hndl;
libusb_open(devs[i], &hndl);

Ни одна из этих функций
libusb_detach_kernel_driver(hndl, 0);
libusb_set_auto_detach_kernel_driver(hndl, 1);
не дает никакого эффекта.
А hndl получается только после libusb_open.

Я основывался на коде вот отсюда:
github.com/fairlight1337/libcflie
На этот код посылают и на сайте CrazyFlie, но этот код под Виндой дает ту же ошибку. Писал разрабу тому, он сказал, что винды не знает и х/з в чем проблема.

После open сразу детач с нужным id. Если и это не работает то сделать либу с пайтона, если это возможно.

Да мне тогда проще просто питон к матлабу подключить. Но, неужели в винде с USB на плюсах работать не возможно?
Или надо исключительно виндовые функции юзать, а кросплатформенность libusb фиктивна?
Мне кажется что, что-то я неправильно делаю при юзании этой либы.

Ну по Delphi не особо много было инфы. В основном на компонент Tvcl ссылки. Для C++ libusb. В винде есть hid.dll все эти либы ее наверное и юзают.

Через mscomm компонент еще можно. Он в C++ должен быть.

Есть вообще такое msdn.microsoft.com/...0046(v=vs.85).aspx#winusb
Просто надеялся, что libusb1.0 рабочий.

Может попробовать после детач проверить libusb_kernel_driver_active? Вот еще примеры www.dreamincode.net/...ction-to-using-libusb-10

Error libusb_kernel_driver_active: Operation not supported or unimplemented on this platform
:))) смех да и только.

Может не та libusb dll? Может их несколько вариаций?

Вот удобное описание функций

www.cs.unm.edu/...d6eac7519bb94795659d2c971

Вот и вся реализация в этой либе:
static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)
{
return LIBUSB_ERROR_NOT_SUPPORTED;
}

Может для конкретной версии винды свои особенности?

Особенности для win7
stackoverflow.com/...g-libusb-1-0-on-windows-7

Пример C++ и avr
www.grigaitis.eu/?p=15

Можно попробовать на пайтоне под винду написать программу с окном — слушателя usb, в заголовке написать что нибудь типа initusb, на С++ написать прогу получающую список окон , по caption окна initusb запомнить его handle, затем в окне пайтона включить получение с usb , выводить данные в строку и записывать ее в caption окна, а на c++ считывать и парсить этот caption.

Особенности для win7
stackoverflow.com/...g-libusb-1-0-on-windows-7
Это libusb 0.1.
Да, с этими либами такой зоопарк и 0.1 по API в корне отлична от 1.0. Вот такие фантазеры те, кто писали эти либы.

Может ошибка где-то в permission access девайса, т.е. может код на C c детач рабочий а само устройство не открывает доступ?

Вопрос, как это поправить, как дать права.
Причем иногда работает код выше. Но в какой-то момент какой-то ресурс не освобожу и всё из С через libusb достукаться не могу.
Может libusb висит в памяти и держит жестко этот ресурс, пока ее принудительно не выгрузишь? Перезагрузка, понятно выгрузит ее.
На драйвер гнать не могу, ибо из питона к порту стукается без проблем.

Может как здесь описывается, после каждого обращения драйвер устанавливать заново? Может драйвер отключается после каждого обращения?


stackoverflow.com/...-to-connected-usb-devices

The process that you can follow is:

Get the VID, PID for the device that you want to communicate using lsusb

Try to open the device and read the device descriptor

If you want name of the device use string descriptor to get that

Check if any kernel driver is attached. If it is, then detach it and do some raw data transfer

After getting the response again re-attach the driver.

Только detach... и attach... функции реализованы только для линуха.
Под виндой они не работают вообще.

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

В сборке для CrazyFlie bltn libusb1.pyc, lubusb0.pyc и openusb.pyc (это то, что инсталируется).
Ну а питоновский код, что в CrazyFlie, один к одному совпадает с кодом на С. Уже дважды ниже выложил.

В сборке для CrazyFlie bltn libusb1.pyc, lubusb0.pyc и openusb.pyc (это то, что инсталируется).
а самих исходников (тех, что с расширением *.py, а не *.pyc) нет? хотя думаю существуют всякие декомпиляторы для питоновского байткода. Декомпилировать, посмотреть, как оно там все реализовано на питоне

З.Ы. хотя ниже смотрю — вроде дан кусок питоновского кода, который за это отвечает. И вопрос: в чем проблема знающему с/с++ переписать этот питоновский код под плюсы?

-----

UPD:
ну и это — может все дело не конкретно в CrazyFlie, а в том. что этот CrazyFlie основывается на какой-то штуке, которая встроена в виндовую реализацию самого питона (без которой питоновский CrazyFlie нормально не фурычил бы).

А просто не хотел сам собирать. Там ребята наворочено сделали.
Причем из под стандартного линухового дистрибутива всё очень геморно — пробовал и зарылся в зависимостях пакетов и либ. Они всё делают в виртуалке, там они положили все им нужные версии пакетов и либ.
Под виндой там тоже еще тот зоопарк. Инструкция по сборке на страницу. Причем я им один баг нашел в винде. Они пофиксили и сделали сборку для меня, не знаю, есть-ли этот фикс в их очередной релизной версии уже или нет. Так что юзаю эту специальную сборку.
А собственно код, что pyusb юзает я выложил здесь.

З.Ы. Просто я Питон не знаю настолько хорошо, чтобы в том проекте полностью разобраться, там конкретно наворочено многое, что мне нафиг не надо.
Есть вариант еще через ZeroMQ стукаться к их проге (она как сервер выступает), но мне казалось, что напрямую через USB будет проще.

Под виндой там тоже еще тот зоопарк. Инструкция по сборке на страницу. Причем я им один баг нашел в винде.
Просто я Питон не знаю настолько хорошо, чтобы в том проекте полностью разобраться, там конкретно наворочено многое, что мне нафиг не надо.
ясно. Ну тогда не знаю, как лучше поступать...
Может пробовать еще такое — micropython.org (есть туториал, как на винду установить micropython.org/...-Python-Windows-setup.pdf ) прикручивать туда, куда надо (он типа заточен под встраиваемость). Есть даже дперевод доки на русский — micropython-ru.readthedocs.io/ru/latest .
Правда не знаю — пойдет ли он на обычном компе или он под всякие распбери пай заточен...

Возможно на пайтоне это уже реализовано, если он используется для разработки разного рода usb девайсов, робототехники.

Там компонент pyusb или подобный. Ковырять его исходники пока не хочется.

Вот так юзают USB в Питоне:

class CfUsb:
    """ Used for communication with the Crazyradio USB dongle """

    def __init__(self, device=None, devid=0):
        """ Create object and scan for USB dongle if no device is supplied """
        self.dev = None
        self.handle = None
        self._last_write = 0
        self._last_read = 0

        if device is None:
            devices = _find_devices()
            try:
                self.dev = devices[devid]
            except Exception:
                self.dev = None

        if self.dev:
            if (pyusb1 is True):
                self.dev.set_configuration(1)
                self.handle = self.dev
                self.version = float(
                    '{0:x}.{1:x}'.format(self.dev.bcdDevice >> 8,
                                         self.dev.bcdDevice & 0x0FF))
            else:
                self.handle = self.dev.open()
                self.handle.setConfiguration(1)
                self.handle.claimInterface(0)
                self.version = float(self.dev.deviceVersion)
И всё работает. Но мне сильно хотелось бы на С сделать.

Ага, вот только приклеивать питон к матлабу (возможность-то есть такая у матлаба) мне очень не хочется, особенно в плане работы с USB.
Но, это немного странно такого монстра склеивать.

Там предлагают вот так
libusb_init (NULL);
//libusb_set_debug ( 0, 3);
handle = libusb_open_device_with_vid_pid (NULL, 0xc251, 0×1301);
<-------- usb_detach_kernel_driver_np()
libusb_set_configuration (handle, 1);
libusb_claim_interface (handle, 0);

Но в libusb1.0 функции usb_detach_kernel_driver_np() нет.

Попробовал
libusb_set_auto_detach_kernel_driver(hndl, 1);
rv = libusb_claim_interface(hndl, 0);
Та же ошибка.

Здесь в примерах
sourceforge.net/.../libusb/files/libusb-1.0
есть detach в fxload.c, xusb.c, но сразу так разобраться сложно что там к чему.

Вариант с пайтоном выглядит удобнее, более интуитивный интерфейс.

Так вот здесь и обламывается:
libusb_set_auto_detach_kernel_driver(hndl, 1);
rv = libusb_claim_interface(hndl, 0);
if (rv != LIBUSB_SUCCESS)
printf("Error libusb_claim_interface: %s\n", libusb_strerror(libusb_error(rv)));

с Error libusb_claim_interface: Access denied (insufficient permissions)

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

Там еще есть какой-то static libusb-1.0.a, может он еще где-то прописываться должен.

Есть. И что? Его и юзаю. Неохота было dll тянуть.

Может через вебсервер связать пайтон с C++?

Еще usb можно юзать как com порт, через mscomm компонент. И заюзать на Visual Basic том же.

Хочется иметь кросплатформенный инструмент, поэтому и решил с libusb1.0.

Искал рабочий пример для delphi с libusb, но не нашел ни либы ни примера. Jvcl компонент с примером usb работает нормально. Можно попробовать поискать примеры на ассемблере windows, скомпилить dll и использовать в C++.

Мне вообще нужно из матлаба, но для него я ничего не нашел. Вот и начал писать сам враппер на С (плюсах).
Причем код выше работает до какого-то момента. А потом затыкается и всё. Такое впечатление, что под отладкой я какой-то захваченный ресурс иногда не освобождаю и он блокируется.
Причем прога на Питоне к этому порту стукается без проблем.

Теоретически у пайтона может быть другой механизм контроля ошибок и возможно он может не выдавать ошибку если проверять объект null с каким-то свойством которое тоже null и в результате проверки условия будет возвращено без ошибки null или false, не знаю, это так, гипотетически, а C может быть более чувствительным.

Подписаться на комментарии