1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

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

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

  1. PavKo

    PavKo Гость

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

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

    Пытаюсь добавить в пример на 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 КБ
      Просмотров:
      85
  2. sinkopa

    sinkopa Well-Known Member

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

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