Страница 1 из 1
мое hid устройство
Добавлено: Вс май 14, 2017 14:03:34
TDKS
я сделал HID устройство, описанное в статье
http://we.easyelectronics.ru/electro-an ... v-usb.htmlустройство отобразилось в диспетчере устройств. Программа на си, текст которой приведен в
статье не видит моё устройство.
Обнаружилось, что код
Код: Выделить всё
Код:
if ( hid.GetConnectedDeviceName() == exampleDeviceName ){
res = 1;
break;
}
нормально не отрабатывает, то есть hid.GetConnectedDeviceName() всегда возвращает пустую строку.
И так эта функция себя ведет для любого HID устройства, а не только для моего,
подскажите что делать. Стоит c++ belder update 4. проблема не только у меня вот тут
обсуждается
viewtopic.php?f=24&t=66562&start=20 решение я так и
не нашел, помогите пожалуйста.
Re: мое hid устройство
Добавлено: Вс май 14, 2017 17:50:47
ARV
Не знаю, что там и как у вас устроено, но строки в Си так не "возвращаются" и тем более так не сравниваются.
Re: мое hid устройство
Добавлено: Вс май 14, 2017 19:31:02
TDKS
как это не сравниваются вот код из статьи
Код: Выделить всё
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 Name.
// Сравниваем, если совпало - значить устройство наше
if ( hid.GetConnectedDeviceName() == exampleDeviceName )
{
res = 1;
break;
}
}
return res;
}
но у меня hid.GetConnectedDeviceName всегда пустая
Re: мое hid устройство
Добавлено: Вс май 14, 2017 19:46:13
ARV
Еще раз: в Си строки так не сравниваются. Точка.
Возможно, это пример на каком-то ином языке... например, С++ с переназначенными операторами сравнения... это уже мне неведомо.
Re: мое hid устройство
Добавлено: Пн май 15, 2017 10:00:35
TDKS
Мне надо чтоб это устройство заработало. Как заставить программу работать. Устройство корректно распознаётся в диспетчере
Re: мое hid устройство
Добавлено: Сб май 20, 2017 14:06:25
TDKS
Я попытался сделать устройство, описанное в
этой статье. Само устройство я сделал. Сделал и залил прошивку.Все сделал как в статье кроме 2 моментов: 1)в файле usbconfig.h пришлось раскоментарить строчку
/* #_DESCRIPTORNdefine USB_CFG_HID__LEREPORTGTH 42 */
42 поменяв на 22
без этой строки устройство в диспетчере устройств отображалось с ошибкой.
2) программу на стороне компьютора писал на delphi7.
Все делал под windows xp 32 bit В итоге устройство в моей программе определяется, но зажечь светодиоды не получается. Я там пользовался компонентом TJvHidDeviceController
вот код
Код: Выделить всё
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, JvComponent, JvHidControllerClass, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
HidCtl: TJvHidDeviceController;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
function HidCtlEnumerate(const HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
private
{ Private declarations }
public
{ Public declarations }
WorkDev : TJvHidDevice;
end;
type
dataexchange_t = record
b1:Byte;
b2:Byte;
b3:Byte;
end;
var
Form1: TForm1;
pdata : dataexchange_t;
const
ProductName_ = 'Hid example';
VendorID_ = $16c0;
ProductID_ = $05dc;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//устанавливаем связь с устройством
HidCtl.Enumerate;
//заполняем структуру
pdata.b1:=1;
pdata.b2:=1;
pdata.b3:=1;
//отправляем данные
If Assigned(WorkDev)
then WorkDev.SetFeature(pdata, WorkDev.Caps.FeatureReportByteLength);
end;
function TForm1.HidCtlEnumerate(const HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
begin
Result:= True; // продолжить поиск
If (Trim(HidDev.ProductName) = ProductName_)
then If (HidDev.Attributes.VendorID = VendorID_) and
(HidDev.Attributes.ProductID = ProductID_)
then begin // устройство найдено
HidCtl.CheckOutByIndex(WorkDev, Idx); // получаем устройство по индексу
Label1.Caption:= 'подключено';
Result:= False; // поиск закончен
end
end;
end.
Re: мое hid устройство
Добавлено: Вс май 21, 2017 20:02:31
bob1
[uquote="TDKS",url="/forum/viewtopic.php?p=3109842#p3109842"]/* #_DESCRIPTORNdefine USB_CFG_HID__LEREPORTGTH 42 */
42 поменяв на 22[/uquote]
ссылка на файл битая. Скачал c V-USb.
Писать надо более понятно. Правильно #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 22
Это строчка как написана #define USB_CFG_INTERFACE_CLASS ? 2 или 3?
И комп как видит устройство? Hid совместимое или как написано в диспетчере задач?
з.ы. лучше найти работающий полностью проект. Запустить его, а уж потом менять....
Re: мое hid устройство
Добавлено: Вс май 21, 2017 22:34:17
TDKS
#define USB_CFG_INTERFACE_CLASS 3
в диспетчере устройств определяется как HID
и еще:
в прошивке есть функция usbFunctionSetup
вот ее код:
Код: Выделить всё
usbRequest_t *rq = (void *)data;
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* HID устройство */
if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */
// у нас только одна разновидность репорта, можем игнорировать report-ID
bytesRemaining = sizeof(struct dataexchange_t);
currentAddress = 0;
return USB_NO_MSG; // используем usbFunctionRead() для отправки данных хосту
}else if(rq->bRequest == USBRQ_HID_SET_REPORT){
// у нас только одна разновидность репорта, можем игнорировать report-ID
bytesRemaining = sizeof(struct dataexchange_t);
currentAddress = 0;
return USB_NO_MSG; // используем usbFunctionWrite() для получения данных от хоста
}
}else{
/* остальные запросы мы просто игнорируем */
}
return 0;
}
условие (rq->bRequest == USBRQ_HID_GET_REPORT) не выполняется и условие rq->bRequest == USBRQ_HID_SET_REPORT не выполняется, а условие rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS - выполняется