Запись данных в Hid устройство на Delphi.

Тема в разделе "Delphi - СОМ", создана пользователем PavKo, 10 сен 2010.

  1. PavKo

    PavKo Гость

    Имеется пример программы на СИ Builder, который читает и записывает информацию в HID устройство (прилагается), и пример считывания данных на Delphi.

    Обе программы используют компонент: jvHiddevicecontroller

    Пытаюсь добавить в пример на Delphi аналогичную функцию отправления данных.
    Но при записи в устройство информация не передается. Хотя все вроде как сделано аналогично с примером на СИ. Считывается все нормально.

    Полный код программы:

    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, JvHidControllerClass, StdCtrls, OleCtrls;
    type
    TForm1 = class(TForm)
    JvHidDeviceController1: TJvHidDeviceController;
    lstHidDevices: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    procedure JvHidDeviceController1DeviceChange(Sender: TObject);
    function JvHidDeviceController1Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
    procedure ShowRead(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);
    procedure Button1Click(Sender: TObject);
    procedure JvHidDeviceController1DeviceDataError(HidDev: TJvHidDevice; Error: Cardinal);

    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    CurrentDevice: TJvHidDevice;
    ToWrite, Written: Cardinal;
    BufOut:array[0..63] of Byte;

    implementation

    {$R *.dfm}

    // --------------------------------------------------------------------------
    // процедура обновляет данные о всех HID устройствах, подключенных к шине USB
    //---------------------------------------------------------------------------

    procedure TForm1.JvHidDeviceController1DeviceChange(Sender: TObject);
    var
    Count: Integer;
    Dev: TJvHidDevice;
    begin
    for Count := 0 to lstHidDevices.Items.Count - 1 do
    begin
    Dev := TJvHidDevice(lstHidDevices.Items.Objects[Count]);
    JvHidDeviceController1.CheckIn(Dev);
    lstHidDevices.Items.Objects[Count] := nil;
    end;
    lstHidDevices.Items.Clear;

    Label1.Caption := 'USB устройство обмена данными не подключено';

    // Перечисление USB - устройств
    JvHidDeviceController1.Enumerate;

    Label1.Caption := 'USB устройство обмена данными не подключено';

    end;

    //---------------------------------------------------------------------------
    // Процедура получает данные о всех HID устройствах, подключенных к шине USB
    //---------------------------------------------------------------------------

    function TForm1.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;
    var
    Dev: TJvHidDevice;
    DevID: Integer;
    s: String;
    begin
    if HidDev.ProductName <> '' then
    DevID := lstHidDevices.Items.Add(HidDev.ProductName)
    else
    DevID := lstHidDevices.Items.Add(Format('Device VID=%x PID=%x',
    [HidDev.Attributes.VendorID, HidDev.Attributes.ProductID]));

    JvHidDeviceController1.CheckOutByIndex(Dev, Idx);
    lstHidDevices.Items.Objects[DevID] := Dev;

    s := 'USB устройство обмена данными';

    if (HidDev.ProductName = s) then
    begin
    CurrentDevice := Dev;
    Label1.Caption := 'USB устройство подключено';

    ToWrite := CurrentDevice.Caps.OutputReportByteLength;
    CurrentDevice.OnData := Nil;
    if (CurrentDevice.HasReadWriteAccess) then
    CurrentDevice.OnData := ShowRead
    else
    CurrentDevice.OnData := Nil;
    end;

    Result := True;
    end;

    //---------------------------------------------------------------------------
    // Чтение информации из устройства
    //---------------------------------------------------------------------------

    procedure TForm1.ShowRead(HidDev: TJvHidDevice; ReportID: Byte;
    const Data: Pointer; Size: Word);

    begin
    Label1.Caption := 'Выкл;
    if (integer(PChar(Data)[1]) = 0) then
    begin
    Label1.Caption := '
    Вкл';
    end;
    end;

    //---------------------------------------------------------------------------
    // Запись информации в устройство
    //---------------------------------------------------------------------------

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    // Передаваемые данные

    BufOut[3] := $A1;
    BufOut[4] := $1;
    BufOut[1] := $00;
    BufOut[2] := $00;

    // Передача данных

    if(CurrentDevice <> nil) then
    begin
    CurrentDevice.WriteFile(BufOut, ToWrite, Written);
    end;
    end;

    procedure TForm1.JvHidDeviceController1DeviceDataError(
    HidDev: TJvHidDevice; Error: Cardinal);
    begin

    Label3.Caption:='
    Ошибка';

    end;

    end.
     

    Вложения:

    • USB_HID.zip
      Размер файла:
      283 КБ
      Просмотров:
      71
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну вообщето наверное писать надо начиная с адреса данных а не с адреса переменной... т.е
    Код (Delphi):
    if(CurrentDevice <> nil) then
    begin
    CurrentDevice.WriteFile(@BufOut[0], ToWrite, Written);
    end;
    Хотя, могу ошибаться, потому как jvHiddevicecontroller никогда на "щупал"...
    ну и наверное устройство нужно как то подготовить к записи в него данных...
    Думаю, что переводя код с сибилдера, вы упустили некоторые дизайн-тайм свойства компонента...
     
Загрузка...

Поделиться этой страницей