P
PavKo
Имеется пример программы на СИ Builder, который читает и записывает информацию в HID устройство (прилагается), и пример считывания данных на Delphi.
Обе программы используют компонент: jvHiddevicecontroller
Пытаюсь добавить в пример на 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.