Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с проектом под Delphi дл работы с HID USB, поиск простенького проекта 
:(
    Опции темы
arzamax
Дата 17.11.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.11.2008

Репутация: нет
Всего: нет



Пасиба, попробую!
Надо бы полностью описать работу с данным микропоцессором: начиная от простой структурной схемы и заканчивая конечным устройством с управлением от компа - было бы не плохо (мысли вслух).
PM MAIL   Вверх
arzamax
Дата 2.2.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 2.11.2008

Репутация: нет
Всего: нет



xvr, Наконец-то просмотрел твои исходники: получше чем у Агурова на диске. Твои исходники читают передаваемую в хост информацию на ура. У меня возникла проблема с передачей данных от хоста устройству, к слову в книге Агурова этот вопрос рассматривается по принципу: "Есть такая возможность, давайте дальше...". В этих исходниках есть возможность передавать данные устройству, но видимо я чего-то не до конца понимаю в программировании микроконтроллеров для приема данных. Если кто сталкивался с подобной проблемой - поделитесь вашими наработками, мнением, исходным кодом для МК AT89C5131.
Заранее спасиба всем откликнувшимся!
PM MAIL   Вверх
DimonSDA
Дата 28.4.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Два года назад делал дипломный проект "USB Контроллер Системы Сбора Информации" в институте, причем собирал устройство писал все программы (прошивку, драйвер и интерфейс) и теоретическую часть - чертежи, пояснительную записку и много еще чего. Сами понимаете время на все это дело давалось примерно 5 мес. В итоге защитил на отлично, причем с демонстрацией работающего макета.  В общем вот Вам выкладываю исходники надеюсь разберетесь. Багов там наверное миллион, так что не ругайте smile - сами понимаете за такой короткий промежуток времени разобраться со всеми тонкостями протокола USB, разработать устройство, написать все программы и теорию - нелегко, поэтому на исправление всех багов времени просто небыло. Проект разработан с применением AT89C5131АМ, я приложил схему.
Но я не уверен, что это самые последние версии программ, в процессе разработки их накопилось много, и я просто не помню какая из них самая последняя :(. Но там есть и чтение данных из устройства и запись в него (у Агурова примеров записи нет вообще!!!).

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

Прошивка написана в Keil uVision, интерфейс на Delphi 7.
Схема в PCAD-2002.
Драйвер изночально писался с использованием DDK, но при работе с тремя конечными точками происходило падение системы, с одной - работало. Было решено использовать пакет Jungo WinDriver или Jungo KernelDriver (точно не помню). С ним все работает на ура.

Может кону-нибудь пригодится.



Это сообщение отредактировал(а) DimonSDA - 28.4.2009, 20:37

Присоединённый файл ( Кол-во скачиваний: 442 )
Присоединённый файл  AT89C5131.7z 312,80 Kb
PM MAIL   Вверх
mr_smit
Дата 30.5.2009, 21:46 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



PM MAIL   Вверх
QuickWitted
Дата 15.6.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Продублирую тему в качестве своего вопроса - "помогите с проектом под Delphi для работы с HID USB, поиск простенького проекта"
Есть готовый проект на СИ, но хотелось бы достучаться до HID USB с Delphi...

читал много - только запутался...

Неподскажиче чем дело с адаптацией исходников от Агурова кончилось?


Присоединённый файл ( Кол-во скачиваний: 311 )
Присоединённый файл  IgorPlugTermometr.rar 55,03 Kb
PM MAIL   Вверх
mr_smit
Дата 15.6.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



Я собрал схему по приведенной мною выше ссылке (там их много разных, но смысл один). Вам там дают готовую библиотеку и нужно только поправить код под свои нужды. На Delphi (с помощью компонента что то там THID... не помню) написал программу. Смысл такой: нажал кнопку (мышкой) - лампочка загорелась (на плате), ещё раз нажал - погасла. Долго мучился с этим, но получилось.

А книга Агурова мне не очень нравится. Практики в ней нет. Я предпочитаю практические примеры. Как мой. Пожалуйста, цепляй вместо светодиода релюшку и включай/выключай настольную лампу не отрывая руки от мыши. А можно это и на "горячие клавиши" повесить. Будет даже на буке работать. USB ведь... smile Просто что то руки никак не дойдут это спаять.

Это сообщение отредактировал(а) mr_smit - 15.6.2009, 13:30
PM MAIL   Вверх
QuickWitted
Дата 15.6.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Цитата(mr_smit @  15.6.2009,  13:14 Найти цитируемый пост)
Смысл такой: нажал кнопку (мышкой) - лампочка загорелась (на плате), ещё раз нажал - погасла. Долго мучился с этим, но получилось.


у меня 8 релюшек и ИР на слае уже год живут...
(управляются как от компа, так и автономно от обученного пульта)

Задача слезть с IgorPlug.dll (и за одно с комплектного драйвера)...

т.е. нужна прога общающаяся с HID без дров и по возможности без библиотек.

первое решение - прикинимся HID джойстиком - реализовали...
недостатки в джой данные передать нельзя...

второе решение - поищем аналог.
нашли, только прога на СИ и на железе нет приёма данных из компа...

вот теперь думаю как на дэльфи перевести....
(а приём данных потом допишем)


ЗЫ: в теме только один исходник... и он зверски ругается при старте и при закрытии
если не найдёт устройство....

может, у кого рабочий есть?
(не сильно паникующий без железа?)

PM MAIL   Вверх
mr_smit
Дата 15.6.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



Код

function TForm1.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
  const Idx: Integer): Boolean;
begin
  FeatureReportLen := HidDev.Caps.FeatureReportByteLength;
  fillchar(MyReport, 8, 0);
  
  if on_off=0 then
    begin
    MyReport[1] := 0;
    on_off:=1;
    end
  else begin
    MyReport[1] := 1;
    on_off:=0;
  end;

  Result := HidDev.SetFeature(MyReport, FeatureReportLen);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
JvHidDeviceController1.Enumerate;
end;


Код

// вызывается когда хост посылает данные устройству

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    uchar    on_off;
    on_off = data[0];
    
    DDRB |= 0x01;
    // в зависимости от того что пришло включаем или выключаем светодиод
    if (on_off==0) { 
      PORTB &= ~ ( 0x01 );
      }
    else if (on_off==1) {
      PORTB |= ( 0x01 );
      }
    return 1; 
}


Использовал этот компонент: http://ifolder.ru/12653480 Его тут уже выкладывали.

Я не делал никакие проверки. Это работает в том случае если к ПК в данный момент подключено 1 HID устройство. Если несколько - надо искать наше (по VID и PID) и обращаться к нему. На отсутствие железа не ругается.

Это сообщение отредактировал(а) mr_smit - 15.6.2009, 16:27

Присоединённый файл ( Кол-во скачиваний: 541 )
Присоединённый файл  USB_HID_Delphi.rar 1,50 Kb
PM MAIL   Вверх
QuickWitted
Дата 16.6.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Цитата(mr_smit @  15.6.2009,  16:16 Найти цитируемый пост)
Это работает в том случае если к ПК в данный момент подключено 1 HID устройство. Если несколько - надо искать наше (по VID и PID) и обращаться к нему.


отправился мучать исходник...

а с поиском  (по VID и PID) не у кого готового нет?
PM MAIL   Вверх
mr_smit
  Дата 16.6.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



В примерах которые идут с компонентом есть.

Что то типа этого:
Код

HidDev.Attributes.VendorID
HidDev.Attributes.ProductID


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

Это сообщение отредактировал(а) mr_smit - 16.6.2009, 21:09
PM MAIL   Вверх
QuickWitted
Дата 17.6.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.6.2009

Репутация: нет
Всего: нет



Цитата(mr_smit @  16.6.2009,  20:40 Найти цитируемый пост)
Я только пока не пойму как потом к нужному устройству обратиться. Надо разбираться.


вот в этом и проблема...
не всё понятно, рабочий исходник бы...
PM MAIL   Вверх
mr_smit
Дата 18.6.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 253
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



Исходник который идет с компонентом - рабочий. Бегло посмотрел. Они там ищут устройства и найденные добавляют в Listbox как objects и потом работают с нужным.

Код

Dev := TJvHidDevice(DevListBox.Items.Objects[I]);

PM MAIL   Вверх
pvabox
Дата 24.9.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



Код

Пример поиска нужного устройства

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  StdCtrls, Buttons, JvHidControllerClass, JvComponentBase;
  
type
  TForm1 = class(TForm)
    HidCtl: TJvHidDeviceController;
    Label1: TLabel;
    Label2: TLabel;
    procedure HidCtlArrival(HidDev: TJvHidDevice);
    function  HidCtlEnumerate(HidDev: TJvHidDevice;
              const Idx: Integer): Boolean;
    procedure HidCtlRemoval(HidDev: TJvHidDevice);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
// Описание устройства
  ProductName_  = 'My HID USB Device';
  VendorID_     =  5824;
  ProductID_    =  1503;

var
  Form1: TForm1;
  WorkDev: TJvHidDevice = nil;

implementation

{$R *.dfm}

procedure TForm1.HidCtlArrival(HidDev: TJvHidDevice);
// Обработчик подключения нового устройства
// событие OnArrival от HidCtl
begin
// если устройство не определено, то вызываем энумерацию
  If not Assigned(WorkDev) then HidCtl.Enumerate
end;

function TForm1.HidCtlEnumerate(HidDev: TJvHidDevice;
                                const Idx: Integer): Boolean;
// Поиск нужного устройства из всех подключенных
// событие OnEnumerate от HidCtl
begin
  Result:= True;                      // продолжать поиск
  If (Trim(HidDev.ProductName) = ProductName_)
    then  If  (HidDev.Attributes.VendorID  = VendorID_) and
              (HidDev.Attributes.ProductID = ProductID_)
            then  begin
                    Result:= False;   // поиск закончен
                    HidCtl.CheckOutByIndex(WorkDev, Idx);
                    Label2.Caption:= 'подключено'
                  end
end;

procedure TForm1.HidCtlRemoval(HidDev: TJvHidDevice);
// Обработчик физического отключения устройства
// событие OnRemoval от HidCtl
begin
  If HidDev = WorkDev then  // устройство было отключено
    begin
      WorkDev:= nil;
      Label2.Caption:= ' отключено'
    end
end;

end.


Это сообщение отредактировал(а) Alexeis - 7.10.2009, 11:49
PM MAIL   Вверх
rpuH
Дата 8.10.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Цитата(pvabox @ 24.9.2009,  19:03)
Код

Пример поиска нужного устройства

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  StdCtrls, Buttons, JvHidControllerClass, JvComponentBase;
  
type
  TForm1 = class(TForm)
    HidCtl: TJvHidDeviceController;
    Label1: TLabel;
    Label2: TLabel;
    procedure HidCtlArrival(HidDev: TJvHidDevice);
    function  HidCtlEnumerate(HidDev: TJvHidDevice;
              const Idx: Integer): Boolean;
    procedure HidCtlRemoval(HidDev: TJvHidDevice);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
// Описание устройства
  ProductName_  = 'My HID USB Device';
  VendorID_     =  5824;
  ProductID_    =  1503;

var
  Form1: TForm1;
  WorkDev: TJvHidDevice = nil;

implementation

{$R *.dfm}

procedure TForm1.HidCtlArrival(HidDev: TJvHidDevice);
// Обработчик подключения нового устройства
// событие OnArrival от HidCtl
begin
// если устройство не определено, то вызываем энумерацию
  If not Assigned(WorkDev) then HidCtl.Enumerate
end;

function TForm1.HidCtlEnumerate(HidDev: TJvHidDevice;
                                const Idx: Integer): Boolean;
// Поиск нужного устройства из всех подключенных
// событие OnEnumerate от HidCtl
begin
  Result:= True;                      // продолжать поиск
  If (Trim(HidDev.ProductName) = ProductName_)
    then  If  (HidDev.Attributes.VendorID  = VendorID_) and
              (HidDev.Attributes.ProductID = ProductID_)
            then  begin
                    Result:= False;   // поиск закончен
                    HidCtl.CheckOutByIndex(WorkDev, Idx);
                    Label2.Caption:= 'подключено'
                  end
end;

procedure TForm1.HidCtlRemoval(HidDev: TJvHidDevice);
// Обработчик физического отключения устройства
// событие OnRemoval от HidCtl
begin
  If HidDev = WorkDev then  // устройство было отключено
    begin
      WorkDev:= nil;
      Label2.Caption:= ' отключено'
    end
end;

end.

Добрый день!!! Если не затруднит скиньте пожалуйста исходники этой программы, а было бы вообще замечательно если в совокупностим с предыдущей программой. Спасибо зараннее.
PM MAIL   Вверх
pvabox
Дата 16.10.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



Пример моего проекта работы с HID устройством на базе V-USB от Objective Development

Схема

user posted image


Основная программа микроконтроллера main.c

Код

/* ------------------------------------------------------------------------- */
/*
 Этот простой пример показывает как можно использовать протокол HID для передачи
данных в микроконтроллер AVR и управлять 8-ми битным портом. Он должен работать
на многих AVR с небольшими изменениями. Не используются никакие специальные аппаратные
ресурсы, кроме INT0. Вы можете изменить usbconfig.h для других выводов I/O USB.
Пожалуйста, имейте в виду, что USB D+ должен быть подсоединен к выводу INT0, либо,
как минимум, также должен быть соединен с INT0.
*/

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>      /* требуется для sei() */
#include <util/delay.h>           /* требуется для _delay_ms() */

#include <avr/pgmspace.h>   /* требуется для usbdrv.h */
#include "usbdrv.h"
#include "oddebug.h"             /* пример для использования макроса отладки */


/* ------------------------------------------------------------------------- */
/* ----------------------------- Интерфейс USB ----------------------------- */
/* ------------------------------------------------------------------------- */

PROGMEM char usbHidReportDescriptor[21] = {  /* дескриптор репорта USB */
    0x05, 0x08,                 // USAGE_PAGE (LEDs)
    0x09, 0x4b,                 // USAGE (Generic Indicator)
    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
};

/*
 Поскольку мы задали только один feature-репорт, мы не используем идентификаторы 
report-ID (которые должны быть в первом байте репорта). Весь репорт состоит из
одного 8-ми битового блока неопределенных данных.
*/

/* ------------------------------------------------------------------------- */

/*
 usbFunctionRead() вызывается, когда хост запрашивает кусок данных от устройства.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

uchar   usbFunctionRead(uchar *data, uchar len)
{
    data[0] = PINB;             /* читаем байт данных из порта PB */
    len = 1;                        /* считали один байт данных */
    return len;                     /* возвращаем кол-во считанных байт */
}

/*
 usbFunctionWrite() вызывается, когда хост посылает кусок данных в устройство.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    PORTB = data[0];            /* записываем байт данных в порт PB */
    return 1;                         /* возвращаем 1 - все данные успешно приняты */
}

/* ------------------------------------------------------------------------- */

/*
 usbFunctionSetup вызывается, когда драйвер принимает транзакцию SETUP от хоста,
которому не отвечает драйвер непосредственно (на практике: запросы класса
и вендора). Все управляющие передачи стартуют с транзакции SETUP, где хост
сообщает параметры следующтих (опционально) передач данных. Данные SETUP 
доступны в параметре 'data', который может (и должен) быть преобразован 
в 'usbRequest_t *' для лучшего дружественного для пользователя доступа
к параметрам.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;

    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* запрос HID class */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
            /* поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID */
            return USB_NO_MSG;  /* использование usbFunctionRead() для получения данных хостом от устройства */
        }else if(rq->bRequest == USBRQ_HID_SET_REPORT){
            /* поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID */
            return USB_NO_MSG;  /* использование usbFunctionWrite() для получения данных устройством от хоста */
        }
    }else{
        /* игнорируем запросы типа вендора, мы их все равно не используем */
    }
    return 0;
}

/* ------------------------------------------------------------------------- */

int main(void)
{
uchar   i;

    wdt_enable(WDTO_1S);
    /* Даже если Вы не используете watchdog, выключите его здесь. На новых устройствах
     *  состояние watchdog (вкл/выкл, период) СОХРАНЯЮТСЯ ЧЕРЕЗ RESET!
     */
    DBG1(0x00, 0, 0);       /* отладочный вывод: стартует тело main */
    /* Состояние RESET: все биты порта работают как входы без нагрузочных резисторов (pull-up).
     *  Это то, что нужно для входов USB D+ и D-.
     */
    DDRB  = 0xFF;             /* конфигурируем порт PB для вывода данных */
    odDebugInit();
    usbInit();
    usbDeviceDisconnect();  /* запускаем принудительно реэнумерацию, делайте это, когда прерывания запрещены! */
    i = 0;
    while(--i){                    /* эмулируем USB дисконнект на время > 250 мс */
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    sei();                            /* общее разрешение прерываний */
    DBG1(0x01, 0, 0);       /* отладочный вывод: вход в цикл main */
    for(;;){                /* цикл событий main */
        DBG1(0x02, 0, 0);   /* отладочный вывод: повторы цикла main */
        wdt_reset();
        usbPoll();
    }
    return 0;
}

/* ------------------------------------------------------------------------- */


ВНИМАНИЕ! Не забудьте отредактировать файл конфигурации usbconfig.h !!!!


Далее - тестовая программа на Delphi 7 main.pas

Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  StdCtrls, Buttons, JvHidControllerClass, JvComponentBase;
  
type
  TReportData = array [0..7] of Byte;  // размер буфера репорта HID

  TForm1 = class(TForm)
    HidCtl: TJvHidDeviceController;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    CheckBox0: TCheckBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    
    procedure HidCtlArrival(HidDev: TJvHidDevice);
    function  HidCtlEnumerate(HidDev: TJvHidDevice;
              const Idx: Integer): Boolean;
    procedure HidCtlRemoval(HidDev: TJvHidDevice);
    function  WorkDevSetFeature(Buf: TReportData): Boolean;
    procedure CheckBoxClick(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
    WorkDev   : TJvHidDevice;
  end;

const
// Описание устройства
  ProductName_  = 'LED USB Device';
  VendorID_     =  $16c0;
  ProductID_    =  $05df;

var
  Form1     : TForm1;

implementation

{$R *.dfm}


procedure TForm1.HidCtlArrival(HidDev: TJvHidDevice);
// Обработчик подключения нового устройства
// событие OnArrival от HidCtl
begin
// если устройство не определено, то вызываем энумерацию
  If not Assigned(WorkDev) then HidCtl.Enumerate
end;


function TForm1.HidCtlEnumerate(HidDev: TJvHidDevice;
                                const Idx: Integer): Boolean;
// Поиск нужного устройства из всех подключенных
// событие OnEnumerate от HidCtl
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);  // получаем устройство по индексу
                    Label2.Caption:= 'подключено';
                    Result:= False;   // поиск закончен
                  end
end;


procedure TForm1.HidCtlRemoval(HidDev: TJvHidDevice);
// Обработчик физического отключения устройства
// событие OnRemoval от HidCtl
begin
  If HidDev = WorkDev then
    begin                             // устройство было отключено
      WorkDev:= nil;
      Label2.Caption:= ' отключено'
    end
end;


function TForm1.WorkDevSetFeature(Buf: TReportData): Boolean;
// Передача данных устройству WorkDev
begin
  If Assigned(WorkDev)
    then Result:= WorkDev.SetFeature(Buf, WorkDev.Caps.FeatureReportByteLength)
    else Result:= False
end;


procedure TForm1.CheckBoxClick(Sender: TObject);
// Опрос состояний CheckBox и передача данных устройству
var
  LEDs      : Byte;
  ReportData: TReportData;

begin
// Опрос состояний CheckBox
  LEDs:= 0;
  If CheckBox0.Checked then LEDs:= LEDs+1;
  If CheckBox1.Checked then LEDs:= LEDs+2;
  If CheckBox2.Checked then LEDs:= LEDs+4;
  If CheckBox3.Checked then LEDs:= LEDs+8;
  If CheckBox4.Checked then LEDs:= LEDs+16;
  If CheckBox5.Checked then LEDs:= LEDs+32;
  If CheckBox6.Checked then LEDs:= LEDs+64;
  If CheckBox7.Checked then LEDs:= LEDs+128;

  Label3.Caption:= 'LEDs = ' + IntToStr(LEDs);

// Передача данных устройству WorkDev
  FillChar(ReportData, SizeOf(ReportData), 0);  // заполняем массив нулями
  ReportData[0]:= 0;                            // номер репорта
  ReportData[1]:= LEDs;                         // данные репорта
  If WorkDevSetFeature(ReportData)              // пытаемся передать данные
    then Label4.Caption:= ' Ok! '
    else Label4.Caption:= ' Ошибка передачи данных '
end;

end.



PS: Программа использует JvHidControllerClass библиотеки JEDI, не забудьте установить!

Будут вопросы - не стесняйтесь, постараюсь ответить.


Это сообщение отредактировал(а) pvabox - 28.10.2010, 09:20
PM MAIL   Вверх
Google
  Дата 21.9.2019, 13:57 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.