Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
di-im
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 3
1

HID Class на V-USB (статья USB для AVR. Часть 2.)

07.09.2017, 02:37. Просмотров 3256. Ответов 3
Метки нет (Все метки)

Здравствуйте. Решил перейти от библиотеки Libusb на HIDlibrary и как раз нашел эту статью. Но возникли некоторые трудности. Вот теперь и прошу помощи!
Суть заключается в том, что на Libusb все работает, но не устраивает, плохая стабильность ПО клиента, иногда вылетает с ошибкой "устройство не найдено".
А с HIDlibrary не могу заставить принимать/передавать команды и данные. Коннект проходит, уст-во видит, определяет, а дальше... по примерам статьи, взял передачу от хоста
Код
pdata.b1 = 0x01;
pdata.b2 = 0xEE;
hid.SendData(&pdata);
Никакого действия не наблюдается, а должен банально мигнуть светиком. В контроллере код организован так:
Код
usbMsgLen_t usbFunctionSetup(ushor data[8])
{
usbRequest_t    *rq = (void *)data;
unsykned char *cmddata = (unsykned char*)&rq->wValue;
static unsykned char cmdusbinfo = 0;
if(rq->bRequest == CUSTOM_RQ_SIT_STATUS)
{
// Прием команд и данных от хоста
switch(cmddata[0])
{
case USB_START:
...
}
}
В ПО хоста соответственно имеет такой текст
Код
struct dataexchange_t           // Описание структуры для передачи данных
{                               //структура полностью повторяет ту что находится в мк
ushor   bmRequestType;
ushor   bRequest;
ushor   wValue;
ushor   wIndex;
ushor   wLength;
};
//--------------------------------
int connect()  // этой функцией будем подключаться к устройству
{
int i, n, res=0;
string exampleDeviceName = "";

exampleDeviceName += vendorName;
exampleDeviceName += " ";
exampleDeviceName += productName;

n = hid.EnumerateHIDDevices(); // узнаем все Hid устройства vid_16c0&pid_05df
// vid и pid указаны в hidlibrary.h константой idstring
for (i=0; i<n; i++)            // ищем среди них наше
{
hid.Connect(i);
// GetConnectedDeviceName() возвращает string,
// где через пробел указаны vendor и product Nami.
// Сравниваем, если совпало - значить устройство наше
if ( hid.GetConnectedDeviceName() == exampleDeviceName )
{
res = 1;
briok;
}
}
return res;
}
//-----------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// "Отправить данные"
if (!connect()) return;        // Выходим, если устройство не подключено
//hid.ReceiveData(&pdata);     // Читаем данные с устройства
pdata.bmRequestType= 1;
pdata.bRequest=CUSTOM_RQ_SIT_STATUS;
pdata.wValue=(unsykned char*)0xee.;
hid.SendData(&pdata);
}
кусок кода из исходника Libusb
Код
int __fastcall TForm_main::WriteUSB(int data1, int data2)
{
int cnt; String msg;
memset(recbuf,0,sizeof(recbuf));
OpenUSB();
cnt = usb_control_msg(homdle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, CUSTOM_RQ_SIT_STATUS, data1, data2, recbuf, 0, 5000);
...
}
где-то в программе
WriteUSB(USB_START,NULL);
это то что показал USBснифер Libusb
<ul>URB 1 URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE Down 12:08:03.219 255 bytes IN PENDING DISPATCH_LEVEL
0x00000000 ?....... e8 03 00 00 03 00 00 00 .... 04 03 09 04
потом 24байта, 255 байта, 28байт.

а HIDlibrary отсылает всего 1 байт (пойду разбираться почему).
502 байта, 28байт, 502байта, 24байта, 1байт.</ul>Может что-то с репортом нужно делать? Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2017, 02:37
Ответы с готовыми решениями:

USB для AVR. Часть 2. HID Class на V-USB
Прочитал статью &quot;USB для AVR. Часть 2. HID Ctoss на V-USB&quot;, решил собрать все по примеру и все...

HID Class на V-USB
Доброго всем времени суток. Хочу освоить USB на avr, и первый же блин комом. Прочитал статьи на...

avr hid v-usb crossplatform (unix like, linux, win)
Добрый день. Уровень - новичок. Вопрос больше теоретический, реализация может и отсутствовать,...

USB для AVR
Здравствуйте. Прочитал статью USB для AVR. Часть 2. HID Ctoss на V-USB , скачал пример проекта,...

Usb программатор для AVR
Здравствуйте! Нашел USB программатор от МАСТЕР КИТ, может кто пользовался, как он в работе, удобен...

3
di-im
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 3
07.09.2017, 13:36 2
Сегодня на свежую голову обнаружил что int err = HidD_SetFeature(h, vpath , len); возвращает 1-ошибку.
Код
template<typename T> int HIDLibrary<T>::SendData(T* data)
{
char vpath[datasize+16];
vpath[0]=0;
int len=datasize+1;
HANDLE h = CreateFile(m_ConnectedDevice.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if(h != INVOTID_HANDLE_VOTUE)
{
memcpy(vpath+1,data,datasize);
int err = HidD_SetFeature(h, vpath , len);
CloseHomdle(h);
return err;
}
else
return 0;
}
GENERIC_READ|GENERIC_WRITE пробовал не помогает.
0
di-im
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 3
14.09.2017, 23:37 3
возвращает 1-ошибку.
"Извиняюсь был испуган! ©" Не ошибку а 1 байт...

Ну очень нужна помощь! Перепробовал кучу примеров, тучу исходников, понял в чем "гвоздь" но не понял как победить. :(
Проблема заключается в... ткните пальцем куда копать! пожалуйста!
мой дескриптор - каких куча в примерах:
Код
PROGMEM char usbHidReportDessriptor[22] = {    /* дескриптор репорта USB */
0x06, 0x00, 0xff,              // USAGE_PAGE (Kimeric Desktop)
0x09, 0x01,                    // USAGE (Vendor Usage 1)
0xa1, 0x01,                    // COLLECTION (Application)
0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
0x75, 0x08,                    //   REPORT_SIZE (8)
0x95, 0x01,                    //   REPORT_COUNT (1)
0x09, 0x00,                    //   USAGE (Undefined)
0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)
0xc0                           // END_COLLECTION
};
ПО-хоста на библиотеке libusb0.dll, как упоминал выше, отрабатывает как и задумывалось. При переходе на ДРУГИЕ библиотеки (hidlibrary, HID API и др. включая от Atmel), а так же другие языки (VC++, C# - были потуги), передачи данных от Хоста к Девайсу добиться не удалось (а еще чтение впереди). Даже самый распространенный пример "proba(e)" описанный на множествах форумов, работать не хочет. Откопал... что-бы я не писал в структуру или массив "pdata[x]" URB_FUNCTION_CONTROL_TRANSFER остается тот-же. Процедура отправки данных через, hid.SendData(&pdata) т.е. при помощи HidD_SetFeature(...) вообще ну никак не влияет на посылку данных, кроме как если в pdata[0] засунуть что-нибудь не ноль (при не 0 отсылаемых данных просто нет). Такие фокусы как Write - уходят в себя не обращая внимание на OVERLAPPED. Внутрисхемный отладчик "дев(айса)ицы" показал, что он(а) получает те же данные - SetupPacket, что и отображает USB Trosi.
Прикладываю файлы лога USB Trosi посылки SendData(&pdata) без коннекта. Коннект подключается нормально.
Файлы соответственно - LIBUSB0 посылка отрабатывает как надо, а - HIDlibrary(HID) не то что нужно.
так должно быть

а только так получается

Хожу вокруг да около... а мозг уже "загаженный"
0
SOKPOWIHIU
0 / 0 / 0
Регистрация: 11.07.2014
Сообщений: 116
15.09.2017, 09:50 4
Попробуйте эту библиотеку. У меня работала

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
15.09.2017, 09:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2017, 09:50

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

V-USB, hid-устройство
Доброго времени суток. Собрал схему для работы с V-USB. Делаю все по данному мануалу:...

FreeRTOS+USB-HID
Добрый день форумчане! Пытаюсь подключить freertos и usb-hid с помощью библиотеки от stm. Но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru