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

  • Автор темы PavKo
  • Дата начала
P

PavKo

#1
Имеется пример программы на СИ 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.
 

Вложения

sinkopa

Well-known member
17.06.2009
344
4
#2
Код:
//---------------------------------------------------------------------------
// Запись информации в устройство
//---------------------------------------------------------------------------

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