USB HID интерфейс
- Сообщения: 3791
- Зарегистрирован: Ср дек 24, 2008 09:58:58
Попробуйте какой-нибудь software анализатор USB траффика. Например, USBTrace (найдите в Гугле).
- Реклама
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Попробуйте найти этим кодом (скомпилированная программа во вложении).AaNnDdRrEeYy писал(а):программа на хосте которая работает не видит его нифига
Код: Выделить всё
x=HID_Lib_OpenDevice($5DF, $16C0)
If x
MessageRequester("", "Девайс найден.")
HID_Lib_CloseDevice(x)
Else
MessageRequester("", "Девайса нет.", #MB_OK|#MB_ICONINFORMATION)
EndIf
EndЕсли не найдет, то залейте в AVR (ATmega8) прошивку из вложения, должно найти.
D+ подключаете к выводу 4, а D-, к выводу 5 МК.
- Вложения
-
- USB_ATmega8.rar
- (5.73 КБ) 617 скачиваний
Разобрался с программой все работает. проблема была в получении имени устройства там есть код
все время возвращал пустую строку и условие не срабатывало, почему понятия не имею. Я откомпилировал исходники (только hidlibrary.h) в VS 2010, отключив поддержку clr.
для консольного приложения на VS получилось так
сейчас буду пробовать прикрутить все это дело к .NET с помощью cli без использования DllImport
C# знаю намного больше чем нативный С++
Код: Выделить всё
if ( hid.GetConnectedDeviceName() == exampleDeviceName )
{
res = 1;
break;
}
для консольного приложения на VS получилось так
Код: Выделить всё
#include <stdio.h>
#include "hidlibrary.h"
#include "usbconfig.h"
char vendorName[] = {USB_CFG_VENDOR_NAME, 0};
char productName[] = {USB_CFG_DEVICE_NAME, 0};
struct dataexchange_t
{
unsigned char b1;
unsigned char b2;
unsigned char b3;
};
struct dataexchange_t pdata = {0, 0, 0};
HIDLibrary <dataexchange_t> hid;
int connect()
{
int i, n, res=0;
string exampleDeviceName = "";
exampleDeviceName += vendorName;
exampleDeviceName += " ";
exampleDeviceName += productName;
n = hid.EnumerateHIDDevices();
for (i=0; i<n; i++)
{
hid.Connect(i);
string nd ="";
nd = hid.GetConnectedDeviceName();
if ( nd == exampleDeviceName )
{
res = 1;
break;
}
}
return res;
}
void ResieveData()
{
hid.ReceiveData(&pdata);
if (pdata.b1)
{printf("led 1 - on\n");}
else
{printf("led 1 - off\n");}
if (pdata.b2)
{printf("led 2 - on\n");}
else
{printf("led 2 - off\n");}
if (pdata.b3)
{printf("led 3 - on\n");}
else
{printf("led 3 - off\n");}
}
int main ()
{
printf ("\n connecting...\n");
int conn =0;
conn = connect();
if(conn==1)
{
printf ("Send data\n");
//зажигаем два крайних светодиода
pdata.b1 = 1;
pdata.b2 = 0;
pdata.b3 = 1;
hid.SendData(&pdata);
ResieveData();
}
else
{
printf ("not found :(\n");
}
return 0;
}
}
C# знаю намного больше чем нативный С++
Ура! получилось управлять тремя светодиодами через USB.
вот только с C++/CLI разобраться не смог. Сделал одну DLL на C++ не управляемый код и одну враппер на C#. и еще демо програмку
если кому понадобиться вот исходники
http://files.mail.ru/65KAR4
вот только с C++/CLI разобраться не смог. Сделал одну DLL на C++ не управляемый код и одну враппер на C#. и еще демо програмку
если кому понадобиться вот исходники
http://files.mail.ru/65KAR4
- Сообщения: 564
- Зарегистрирован: Чт июл 21, 2011 19:56:10
AaNnDdRrEeYy, расскажи поподробнее как решил проблему? У меня такаяже проблема в том проэкте. Не видит устройство...
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
- Реклама
- Сообщения: 564
- Зарегистрирован: Чт июл 21, 2011 19:56:10
Уже разобрался. Нужно было апдейт на билдер скачать
Шуруп забитый молотком держится намного лучше чем гвоздь закрученный отверткой!
- Сообщения: 3
- Зарегистрирован: Сб апр 20, 2013 15:31:20
Поясните про апдейт, пожалуйстаЗукс писал(а):Уже разобрался. Нужно было апдейт на билдер скачать
Столкнулся с такой же проблемой на билдере.
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
разбираюсь со стандартным хид
решил пока помигать светодиодом нум лока на отдельной клавиатуре, где только цифровые кнопки (брал для станка)
там один светодиод
усб сниффер показал, что при нажатии на нумлок ничего не происходит, но светодиод гаснет
когда я нажимаю нумлок на обычной делл клавиатуре, то сниффер ловит нажатие и светодиод тоже реагирует
только я нихера не пойму во всех этих штука
слишком абстгактно все и непонятно, где там данные
http://www.usb.org/developers/hidpage/HID1_11.pdf
вот тут пдф есть с определениями по стандартным устройствам
там есть клавиатура на странице 59
там что-то написано про светодиоды
8 байт это про кнопки in
и 1 байт про светодиоды out
т.е. мне надо сделать некий пакет, только я не знаю его тип и что вообще туда пихать кроме как out
я вот это читал http://habrahabr.ru/post/210736/
библиотеку использую ту для виндовса
UsbSetupPacket это конструктор
public UsbSetupPacket(
byte requestType,
byte request,
short value,
short index,
short length
)
UsbCtrlFlags.RequestType_Vendor это флаги и это нестандартный флаг, который определяет формат данных самим производителем девайса
а что пихать для стандартной клавиатуры и как разобрать другие типы устройств
например кнопки мыши
или может я в пдф не туда смотрю?
везде пишут, как сделать свое устройство и нигде нет инфы, как сделать стандартное устройство или управлять уже готовым
решил пока помигать светодиодом нум лока на отдельной клавиатуре, где только цифровые кнопки (брал для станка)
там один светодиод
усб сниффер показал, что при нажатии на нумлок ничего не происходит, но светодиод гаснет
когда я нажимаю нумлок на обычной делл клавиатуре, то сниффер ловит нажатие и светодиод тоже реагирует
только я нихера не пойму во всех этих штука
слишком абстгактно все и непонятно, где там данные
http://www.usb.org/developers/hidpage/HID1_11.pdf
вот тут пдф есть с определениями по стандартным устройствам
там есть клавиатура на странице 59
там что-то написано про светодиоды
8 байт это про кнопки in
и 1 байт про светодиоды out
т.е. мне надо сделать некий пакет, только я не знаю его тип и что вообще туда пихать кроме как out
я вот это читал http://habrahabr.ru/post/210736/
библиотеку использую ту для виндовса
Код: Выделить всё
private void button1_Click(object sender, EventArgs e)
{
// Передать пакет, который включает светодиод на макетной плате AVR-USB-MEGA16.
UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor |
UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)1, 0, 0);
int countIn;
byte[] data = new byte[1];
MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn);
}public UsbSetupPacket(
byte requestType,
byte request,
short value,
short index,
short length
)
UsbCtrlFlags.RequestType_Vendor это флаги и это нестандартный флаг, который определяет формат данных самим производителем девайса
а что пихать для стандартной клавиатуры и как разобрать другие типы устройств
например кнопки мыши
или может я в пдф не туда смотрю?
везде пишут, как сделать свое устройство и нигде нет инфы, как сделать стандартное устройство или управлять уже готовым
тематические ответы только в форуме, в приват не пишите
Доброго времени суток!
Вот занялся связью AVR с компом по USB и как раз попались мне статьи с использованием HID и соответственно hidlibrary.h.
Сделал устройство, описанное в статье http://cxem.net/comp/comp129.php, а оно, в свою очередь основывается на http://we.easyelectronics.ru/electro-an ... v-usb.html.
Прошитый контроллер нормально определяется системой, показывает VID и PID, и даже готовый софт (в первой статье) нормально с ним взаимодействует.
А вот написать свой софт не выходит...
Как уже писали выше, функция
почему-то не хочет коннектиться.
Обнаружилось, что код
нормально не отрабатывает, то есть hid.GetConnectedDeviceName() всегда возвращает пустую строку.
Проверка подтвердила, что счетчик устройств не равен нулю, а в моем случае находит два устройства - мышку и контроллер.
Кто-то разобрался почему функция не хочет работать адекватно? Как заставить ее вывести названия подключенных устройств?
Писал софт на С++ Builder 2007.
Встречал заметки, что на билдер ставили какой-то апдейт, но я так понял что говорили о версии 6 и соответственно update 4. Пробовал установить эту версию, однако результат компиляции софта был таким же.
Система - Windows 7 SP1 x64
Вот занялся связью AVR с компом по USB и как раз попались мне статьи с использованием HID и соответственно hidlibrary.h.
Сделал устройство, описанное в статье http://cxem.net/comp/comp129.php, а оно, в свою очередь основывается на http://we.easyelectronics.ru/electro-an ... v-usb.html.
Прошитый контроллер нормально определяется системой, показывает VID и PID, и даже готовый софт (в первой статье) нормально с ним взаимодействует.
А вот написать свой софт не выходит...
Как уже писали выше, функция
Код: Выделить всё
int connect() // этой функцией будем подключаться к устройству
{
int i, n, res = 0;
string exampleDeviceName = "";
exampleDeviceName += vendorName;
exampleDeviceName += " ";
exampleDeviceName += productName;
n = hid.EnumerateHIDDevices();
for (i = 0; i < n; i++){
hid.Connect(i);
if ( hid.GetConnectedDeviceName() == exampleDeviceName ){
res = 1;
break;
}
}
return res;
}Обнаружилось, что код
Код: Выделить всё
if ( hid.GetConnectedDeviceName() == exampleDeviceName ){
res = 1;
break;
}Проверка подтвердила, что счетчик устройств не равен нулю, а в моем случае находит два устройства - мышку и контроллер.
Кто-то разобрался почему функция не хочет работать адекватно? Как заставить ее вывести названия подключенных устройств?
Писал софт на С++ Builder 2007.
Встречал заметки, что на билдер ставили какой-то апдейт, но я так понял что говорили о версии 6 и соответственно update 4. Пробовал установить эту версию, однако результат компиляции софта был таким же.
Система - Windows 7 SP1 x64
- Сообщения: 2
- Зарегистрирован: Чт авг 10, 2017 20:34:54
Всем привет,
Поставил RADStudio 10.2 и хочу реализовать этот проэкт.
Столкнулся с проблемой, что вижу количество устройств HID, но не могу увидеть свое.
Проверил функции GetConnectedDeviceName и Connect. Не возвращает ничего. Место пути на утсройства и значений Product и Vendor.
Помогите пожалуйста, неделю уже мучаюсь, не могу понять причину.
Использую СBuilder.
Поставил RADStudio 10.2 и хочу реализовать этот проэкт.
Столкнулся с проблемой, что вижу количество устройств HID, но не могу увидеть свое.
Проверил функции GetConnectedDeviceName и Connect. Не возвращает ничего. Место пути на утсройства и значений Product и Vendor.
Помогите пожалуйста, неделю уже мучаюсь, не могу понять причину.
Использую СBuilder.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
- Сообщения: 2
- Зарегистрирован: Чт авг 10, 2017 20:34:54
Здравствуй.
>Комп устройство определяет как HID? Ошибок в работе нет?
HID определяет, программа на контроллере написана правильно, проблема появилась когда начал делать хост, начал выбирать варианты,
результат написал выше.
не знаю на что грешить, на ломаный RAD Studio или на сам метод, или на hidlibrary.h
>Комп устройство определяет как HID? Ошибок в работе нет?
HID определяет, программа на контроллере написана правильно, проблема появилась когда начал делать хост, начал выбирать варианты,
результат написал выше.
не знаю на что грешить, на ломаный RAD Studio или на сам метод, или на hidlibrary.h
[uquote="Beluy",url="/forum/viewtopic.php?p=3159954#p3159954"]HID определяет[/uquote]
Разобрались с проблемоЙ? Я заметил, елси не ставить драйвер например от LiBUSB, то устройство програмно видит (vid\pid) но по какой-то причине игнорирует. Если установить драйвер, тогда все нормально, connect() возвращает номер уст-ва.
И вот тут у меня вопрос, неужели для HID.DLL (hidlibrary) все равно нужно устанавливать доплнительный драйвер? Хотя девайс определяется как HID-совместимое устройство. Стоит только удалить LiBUSB и начинаются пляски типа - "да вот же оно! а в ответ - где!? где!?"
К стати на win XP нормально, а под win 7 вчера весь день долбался, ставил-удалял-ставил, что бы убедиться.
Разобрались с проблемоЙ? Я заметил, елси не ставить драйвер например от LiBUSB, то устройство програмно видит (vid\pid) но по какой-то причине игнорирует. Если установить драйвер, тогда все нормально, connect() возвращает номер уст-ва.
И вот тут у меня вопрос, неужели для HID.DLL (hidlibrary) все равно нужно устанавливать доплнительный драйвер? Хотя девайс определяется как HID-совместимое устройство. Стоит только удалить LiBUSB и начинаются пляски типа - "да вот же оно! а в ответ - где!? где!?"
К стати на win XP нормально, а под win 7 вчера весь день долбался, ставил-удалял-ставил, что бы убедиться.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Нет не нужно. Если посмотрите эту конструкцию, или этот код все работает без дополнительных драйверов.deemchik писал(а):неужели для HID.DLL (hidlibrary) все равно нужно устанавливать доплнительный драйвер?
Это все из-за криворуких программистов решивших что лучше юзать LiBUSB вместо HID.DLL.
[uquote="Мурик",url="/forum/viewtopic.php?p=3177197#p3177197"]Это все из-за криворуких программистов решивших что лучше юзать LiBUSB вместо HID.DLL.
[/uquote]
Вот в этом то и дело, что пока не пощупаешь не поймешь. И таки понял насколько LiBUSB не стабильная. Перешел на HIDlibrary, а тут загвоздка. Ну не получается у меня прием и передача данных. На LiBUSB работало, проверено.
Извиняюсь что влез в чужую тему...
МК использует V-USB, в принципе все то же.
в софте
и вот никак не могу понять как привести все это к виду что-то типа этого
потому как с HIDlibrary только начал знакомство.
Как правильно оформить прием/передачу V-Usb & Hidlibrery? Может кто подскажет?
Добавлено after 25 minutes 26 seconds:
Не помню где нашел, но в тему, может кому пригодится. Пошел изучать.
Вот в этом то и дело, что пока не пощупаешь не поймешь. И таки понял насколько LiBUSB не стабильная. Перешел на HIDlibrary, а тут загвоздка. Ну не получается у меня прием и передача данных. На LiBUSB работало, проверено.
Извиняюсь что влез в чужую тему...
МК использует V-USB, в принципе все то же.
Код: Выделить всё
sbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
unsigned char *cmddata = (unsigned char*)&rq->wValue;
//u16 temp;
static unsigned char cmdusbinfo = 0;
if(rq->bRequest == CUSTOM_RQ_SET_STATUS)
{
// Прием команд и данных от хоста
switch(cmddata[0])
{
case USB_SET_WEIT_LOAD:
...
}
}
else if(rq->bRequest == CUSTOM_RQ_GET_STATUS)
{//комнды ответа
...
}
}
Код: Выделить всё
// "Отправить данные"
if ( 1 == connect() )
{
pdata.b1 = 1;
pdata.b2 = 0xee;
pdata.b3 = 0;
hid.SendData(&pdata); // Отправляем данные устройству в
}Код: Выделить всё
usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_GET_STATUS, 0, 0, buffer, sizeof(buffer), 5000);Как правильно оформить прием/передачу V-Usb & Hidlibrery? Может кто подскажет?
Добавлено after 25 minutes 26 seconds:
Не помню где нашел, но в тему, может кому пригодится. Пошел изучать.
- Сообщения: 1
- Зарегистрирован: Пн фев 12, 2018 20:13:09
то есть hid.GetConnectedDeviceName() всегда возвращает пустую строку.
Проверьте каким-нибудь Everestom, что хост принял ваши дескрипторы названий производителя и устройства. У меня была такая проблема, что хост запрашивал дескрипторы размеров 0xff, устройство отвечало более 8 байт, затем хост давал запрос на дескрипторы размером 0х1ff, устройство отвечало, но хосту не нравился ответ. После того, как я сократил размер строк до 4 символов, т.е. 8 байт, хост воспринял и устройство "приконнектилось".
Проверьте каким-нибудь Everestom, что хост принял ваши дескрипторы названий производителя и устройства. У меня была такая проблема, что хост запрашивал дескрипторы размеров 0xff, устройство отвечало более 8 байт, затем хост давал запрос на дескрипторы размером 0х1ff, устройство отвечало, но хосту не нравился ответ. После того, как я сократил размер строк до 4 символов, т.е. 8 байт, хост воспринял и устройство "приконнектилось".
Я тоже мучаюсь с USB используя в качестве приемопередатчика USBN9604 - пока на этапе установления соединения столкнулся с тем что хосту как-то не нравятся передаваемые мной дескрипторы и устройство "не опознано" - как узнать (под WinXP) причины ошибки. Монитор от HDD Softvare не видит "не приконнекченных" устройств - а проблема именно выяснить - что не нравиться драйверу нижнего уровня ?
Грубо говоря запрашивает дескриптор устройства, на пол пути передачи обрывает и устанавливает адрес, затем повторно запрашивает дескриптор устройства, после него дескриптор интерфейса, потом дескриптор языка, после снова дескриптор интерфейса потом дает команду RESET и все заново х3 = "Устройство не опознано".
Грубо говоря запрашивает дескриптор устройства, на пол пути передачи обрывает и устанавливает адрес, затем повторно запрашивает дескриптор устройства, после него дескриптор интерфейса, потом дескриптор языка, после снова дескриптор интерфейса потом дает команду RESET и все заново х3 = "Устройство не опознано".
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Почему не взять вместо USBN9604, МК с аппаратным USB (или программным для AVR)? Это должно упростить задачу.
Программный дюже ресурсов жрет, да и с ним утонуть еще проще если еще собирать побитно пакеты, считать CRC, тут хоть это помогает и то на пределе возможностей - в процессе обмена по USB не могу сливать в UART отладочную информацию сразу ошибка таймаута и от хоста летит команда на отключение от шины. Приходится писать в память, а потом по прошествию времени (счетчик байт) отключаться от обслуживания USB и сливать данные в UART.
Второе - железо оно уже есть - надо его оживить. Просто делалось оно много лет назад. Да и там те-же проблемы будут - висит-ли контролер на внешней шине или доступен по IN/OUT - какая разница ?
ЗЫЖ вроде-бы как удалось успешно скормить довольно много дескрипторов - вплоть до дескрипторов конечных точек, но появляется запрос класса
80 Хочу
06 Дескриптор
02 Второй
03 Строковый
09 WTF1 ???
04 WTF2 ???
FF 256 байт
00
Если ему отправить второй строковый дескриптор он дважды запросит дескриптор языка, затем снова этот, потом снова языка потом резет.
Языковым считаю
80
06
00
03
00
00
FF
00
Ответ
04
03
09
04
Явно что-то не то с дескриптором конфигурации - так как девайс нашелся но он нем имеется информация только из дескриптора устройства. Странный запрос - это выходит перезапрос на самом деле.
Второе - железо оно уже есть - надо его оживить. Просто делалось оно много лет назад. Да и там те-же проблемы будут - висит-ли контролер на внешней шине или доступен по IN/OUT - какая разница ?
ЗЫЖ вроде-бы как удалось успешно скормить довольно много дескрипторов - вплоть до дескрипторов конечных точек, но появляется запрос класса
80 Хочу
06 Дескриптор
02 Второй
03 Строковый
09 WTF1 ???
04 WTF2 ???
FF 256 байт
00
Если ему отправить второй строковый дескриптор он дважды запросит дескриптор языка, затем снова этот, потом снова языка потом резет.
Языковым считаю
80
06
00
03
00
00
FF
00
Ответ
04
03
09
04
Явно что-то не то с дескриптором конфигурации - так как девайс нашелся но он нем имеется информация только из дескриптора устройства. Странный запрос - это выходит перезапрос на самом деле.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Тогда возьмите МК с аппаратным USB.
Разница в том что для МК обычно можно найти готовый код для USB, который после небольшой корректировки выполняет поставленную задачу без необходимости детально разбираться с работой USB.Wladimir_TS писал(а):Да и там те-же проблемы будут - висит-ли контролер на внешней шине или доступен по IN/OUT - какая разница ?


