Я ничего не понимаю в Бейсике, но хочу сказать, что vusb НЕ ЯВЛЯЕТСЯ стандатным HID . Да, контроллер появляется в винде как хид - и на этом точка. И дело не в структуре репорта - без этой длл-ки libusb0.dll не инициализируется в принципе. Это медленный и неправильный обмен. Советую сосредоточить усилия, раз так нравяться АВР, на тех, которые поддерживают USB. К тому же внимательное чтение лицензии говорит, что с каждого изделия сколько-то центов должно идти автору программного обеспечения.
позволю себе выделить эту ссылку отдельным постом Итак есть проект бэйсик 6.0 на этой библиотеке http://www.circuitsonline.net/forum/view/42808 там на 4 странице проект а на 1 все декларации всех функций Ура с мертвой точки сдвинулись!
теперь задача найти наше устройство, там чета поменяли немного в отличае от си. смотрим исходники.
Вложения:
Комментарий к файлу: BASIC NET v-usb.zip [92.31 KiB]
Скачиваний: 361
_________________ в спорах рождается ИСТИНА [AND] flud.
Это далеко не все функции (их всего 14). Полное описание функций есть в архиве.
DLLка имеет не большой размер, всего 10КБ и при этом вообще не использует никаких внешних файлов или библиотек, типа runtime или .NET Используются только системные библиотеки с API функциями, типа "hid.dll", "setupapi.dll" и др. Так что будет работать на любой винде, имеющей поддержку USB HID, т. е. начиная с Win 98.
Вложения:
Комментарий к файлу: Динамическая библиотека (DLL) для работы с USB HID устройствами HID_Lib_PB.rar [11.55 KiB]
Скачиваний: 556
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Однозначно будет полезной ее и сделаем основе. только не получается подключить. код такой
Код:
Public Declare Function HID_OpenDevice Lib "HID_Lib_PB.dll" _ (ByVal PID As Integer, ByVal VID As Integer, ByVal VersionNumber As Integer, _ ByVal Index As Integer) As Integer
Код:
Dim vid As Integer = 5824 Dim pid As Integer = 1503
Dim ver As Integer = -1 Dim ind As Integer = 0 Dim Handle As Integer Dim res
Handle = HID_OpenDevice(vid, pid, ver, ind)
Цитата:
Не удается загрузить DLL "HID_Lib_PB.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)
Лезет странная ошибка. Что бы это могло быть?
_________________ в спорах рождается ИСТИНА [AND] flud.
Заголовок сообщения: Re: Простейший код HID. Везде только слова, мыши и джойстики
Добавлено: Сб апр 17, 2010 22:02:00
Потрогал лапой паяльник
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
demson писал(а):
Цитата:
Не удается загрузить DLL "HID_Lib_PB.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)
Лезет странная ошибка. Что бы это могло быть?
Сложно сказать. Никогда с подобной ошибкой не сталкивался. Может причина в том, что функции возвращают данные в переменных, типа Long.
Вот сделал небольшой пример использования этой DLLки. Слеюущий код, работает с девайсом PicKit 2 (программатор для PICков). После запуска проги, на секунду будет подано питание на программируемый PIC (загорится светодиод Target в PicKit 2, а затем погаснет). После чего, прога завершает свою работу.
Проверил на всякий случай с long. результат тот же. Мне кажется несовместимость самой длл со студией 2008. Может попробовать пере собрать dll прямо на ней? Хотя там только просто вижуал бейсик. Не уверен что получится а если получится то поможет ли, но все таки возможно ли выложить исходники?
_________________ в спорах рождается ИСТИНА [AND] flud.
Под .NET там просто все функции автоматом импортируются. Это не должно влиять, они прописаны вручную. Сейчас еще на всякий на висте попробую, может винда(хп) косячит
Цитата:
Не удается загрузить DLL "HID_Lib_PB.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)
нет, систематический глюк какой то.
_________________ в спорах рождается ИСТИНА [AND] flud.
Заголовок сообщения: Re: Простейший код HID. Везде только слова, мыши и джойстики
Добавлено: Вс апр 18, 2010 00:04:29
Потрогал лапой паяльник
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
demson писал(а):
Проблема разрешилась. ура в общем скопировал длл в систем32 и все. О как. так, продолжаю с устройством.
У меня прекрасно работает когда DLLка находиться в одной папке с программой. Правда я использую динамическую загрузку с помощью API LoadLibrary либо встроенной функции OpenLibrary. Статическую линковку как правило не использую.
В общем устройство отлично открывается. это радует дальше пытаюсь считать данные и на HID_ReadDevice и на функции прога виснет. проект hid-data считываю 128 символов с устройства. пример кода хоста
Код:
usbDevice_t *dev; char buffer[129]; /* room for dummy report ID */ 128 с нулем int err;
/* usbFunctionRead() is called when the host requests a chunk of data from * the device. For more information see the documentation in usbdrv/usbdrv.h. */ uchar usbFunctionRead(uchar *data, uchar len) { if(len > bytesRemaining) len = bytesRemaining; eeprom_read_block(data, (uchar *)0 + currentAddress, len); currentAddress += len; bytesRemaining -= len; return len; }
/* usbFunctionWrite() is called when the host sends a chunk of data to the * device. For more information see the documentation in usbdrv/usbdrv.h. */ uchar usbFunctionWrite(uchar *data, uchar len) { if(bytesRemaining == 0) return 1; /* end of transfer */ if(len > bytesRemaining) len = bytesRemaining; eeprom_write_block(data, (uchar *)0 + currentAddress, len); currentAddress += len; bytesRemaining -= len; return bytesRemaining == 0; /* return 1 if this was the last chunk */ }
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* HID class request */ if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ /* since we have only one report type, we can ignore the report-ID */ bytesRemaining = 128; currentAddress = 0; return USB_NO_MSG; /* use usbFunctionRead() to obtain data */ }else if(rq->bRequest == USBRQ_HID_SET_REPORT){ /* since we have only one report type, we can ignore the report-ID */ bytesRemaining = 128; currentAddress = 0; return USB_NO_MSG; /* use usbFunctionWrite() to receive data from host */ } }else{ /* ignore vendor type requests, we don't use any */ } return 0; }
_________________ в спорах рождается ИСТИНА [AND] flud.
А разве Вы теоретически можете прочитать 128 байт ? По-моему, это максимальная длина, включая служебную инфу - там байт 20. Покажите репорт дескриптор. У меня, например, под обмен шло 8 байт.
#if USB_CFG_DESCR_PROPS_DEVICE == 0 #undef USB_CFG_DESCR_PROPS_DEVICE #define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice) PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */ 18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */ USBDESCR_DEVICE, /* descriptor type */ 0x10, 0x01, /* USB version supported */ USB_CFG_DEVICE_CLASS, USB_CFG_DEVICE_SUBCLASS, 0, /* protocol */ 8, /* max packet size */ ------и здесь ----------
и, собственно, сами байты в usbdrv.h ---------- typedef struct usbRequest{ uchar bmRequestType; //1 uchar bRequest; //2 usbWord_t wValue; //3,4 usbWord_t wIndex; //5,6 usbWord_t wLength; //7,8 }usbRequest_t; ---------- Все 8 штук, обращаюсь при чтении и записи un.dataBuffer - это мой массив обмена ---------- usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data;
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){ DBG1(0x50, &rq->bRequest, 1); /* debug output: print our request */ // прием if(rq->bRequest == CUSTOM_RQ_SET_STATUS) { un.dataBuffer[0] = rq->wValue.bytes[0]; un.dataBuffer[1] = rq->wValue.bytes[1]; un.dataBuffer[2] = rq->wIndex.bytes[0]; un.dataBuffer[3] = rq->wIndex.bytes[1]; flag=1; usbMsgPtr = un.dataBuffer; /* tell the driver which data to return */ return 4; }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ /* buffer must stay valid when usbFunctionSetup returns */ //dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); // передача // данные в буфере должны быть готовы un.dataBuffer[0]=0x12; un.dataBuffer[1]=0x34; usbMsgPtr = un.dataBuffer; /* tell the driver which data to return */ return 2; /* tell the driver to send 1 byte */ } }else{ /* calss requests USBRQ_HID_GET_REPORT and USBRQ_HID_SET_REPORT are * not implemented since we never call them. The operating system * won't call them either because our descriptor defines no meaning. */ } return 0; /* default for not implemented requests: return no data back to host */ }
Т.е. как бы теоретически большой массив бьется на маленькие пакеты и передается последовательно, но пока с этим не заморачивайтесь, добейтесь обмена полный пакет за 1 раз.
нет, библиотека насколько я понял не отрабатывает типы запросов. if(rq->bRequest == CUSTOM_RQ_SET_STATUS){
Зато есть возможность использовать функцию uchar usbFunctionRead(uchar *data, uchar len) сейчас попробую написать под эту функцию код - нет все также виснет, и на 8 байтах и на одном (функция 1 байт изменяет) странно.
_________________ в спорах рождается ИСТИНА [AND] flud.
Что Гита. что Зита... Длл на все идет одна и та же. Думаю, это какое-то внутреннее соглашение, междусобойчик какой-то. Если интересно, я могу проверить в железе еще и этот вид обмена - по эхоотражению, например. Но не сейчас - сейчас жена самостоятельно ремонтирует сд-плейер (первый ремонт) и работать точно не даст.
Заголовок сообщения: Re: Простейший код HID. Везде только слова, мыши и джойстики
Добавлено: Вс апр 18, 2010 12:57:06
Потрогал лапой паяльник
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Цитата:
дальше пытаюсь считать данные и на HID_ReadDevice и на функции прога виснет. проект hid-data считываю 128 символов с устройства
Я же писал об этом
Цитата:
ВНИМАНИЕ! Программа "повиснет" в этой функции до тех пор, пока не будет принято указанное число байт. Поэтому её желательно вызывать в отдельном потоке.
Вот что по этому поводу пишет Агуров в книге "Практика программирования USB"
128 байт это много. при программной реализации USB, число байт находится в пределах 1...8 Кроме того, вполне возможно что данные передаются через FEATURE-репорт как в примере urry В этом случае, для обмена информацией следует использовать функции HID_GetFeature и HID_SetFeature
Но это лишь предположение, нужно на HID-репорт устройства посмотреть.
urry: было бы замечательно тогда скажи vid pid что передавать и какой длины. Я тебе скомпилирую прогу хоста и с исходниками выложу. тогда уже увидим в чем проблема. PB_EXPERT: кидаю 2 файла посмотри пожалуйста.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения