Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Newbee! Anwendung für USB/HID - startet nicht auf anderem PC (https://www.delphipraxis.net/100407-newbee-anwendung-fuer-usb-hid-startet-nicht-auf-anderem-pc.html)

BigWumpus 27. Sep 2007 20:56


Newbee! Anwendung für USB/HID - startet nicht auf anderem PC
 
Hallo,
Bin neu bei DELPHI.
Ich habe jetzt eine Anwendung erstellt, die Standards aus dem Delphi-Paket nutzt und eine eigene DLL vom Hersteller.
Per USB soll mit einem HID-Gerät kommuniziert werden.

Hier auf meinem Läppi habe ich es entwickelt und es läuft.

Die EXE und die fremde DLL auf 2 anderen PCs - läuft nicht. - Keine Fehlermeldung!
Das USB-Device wird von WinXP korrekt erkannt und installiert,
meine Anwendung erkennt auch den Connect/Disconnect des HID-Gerätes über einen Event und sendet Daten an das Gerät, welches auch eine Antwort sendet (die Kontroll-LEDs an meinem Gerät zeigen Aktionen). Der PC empfängt diese Daten nicht.

Fehlt da jetzt wieder eine Library ?

Wie gehe ich am besten an so ein Problem ?

RWarnecke 27. Sep 2007 23:29

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Hallo und herzlich willkommen inder Delphi-Praxis,
irgendwie sieht das schon nach einer fehlenden DLL aus. Aber um Dir helfen zu können brauchen wir schon noch ein paar mehr Informationen. Es gibt aber ein Programm, womit Du nachschauen kannst, welche DLL's u.s.w. Dein Programm nutzt. Ich weiß gerade leider den Namen nicht genau.

Robert Marquardt 28. Sep 2007 05:53

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Das klingt merkwuerdig. Hat das HID-Geraet zusatzliche Treiber oder laeuft es auf den Standard-HID-Treibern?
Was fuer eine Device-Klasse ist es denn? Ich nehme an du benutzt die HID-Komponente. Poste doch mal was du in OnDeviceChange machst.

hoika 28. Sep 2007 07:01

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Hallo,

remote debugging würde ich da mal empfehlen.
Inwieweit die PR das auch kann, weiss ich nicht.

Ansonstens alles loggen (Textdatei)


Heiko

BigWumpus 28. Sep 2007 08:34

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Hier mal das Proggi als Quelle.

Das Gerüst wurde mittels EasyHID automatisch erzeugt und ich habe noch etwas "Leben" eingehaucht.


Code:
unit FormMain;

interface

uses
   Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  ExtDlgs;

const

   // input and out buffer size constants...
   BufferInSize = 32;
   BufferOutSize = 32;
type

   // input and output buffers...
   TBufferIn = array[0..BufferInSize] of char;
   TBufferOut = array[0..BufferOutSize] of char;

   // main form
   TMain = class(TForm)
    Datentext: TMemo;
    Programmname: TLabel;
    ReadButton: TButton;
    LabelConnected: TLabel;
    DeviceLabel: TLabel;
    DeleteButton: TButton;
    SaveButton: TButton;
    SaveDialog: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ReadButtonClick(Sender: TObject);
    procedure DeleteButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    private
      FBufferIn:TBufferIn;
      FBufferOut:TBufferOut;
      function USBEvent(var Msg: TMessage): Boolean;
    public
    end;

var
  Main: TMain;

implementation

uses
   cUSBInterface,
   cUSBInterfaceTypes;

const
   // vendor and product ID constants...
   VENDOR_ID          = 6017;
   PRODUCT_ID         = 2000;

{$R *.DFM}

procedure TMain.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(USBEvent);
   Connect(Application.Handle);
end;

procedure TMain.FormDestroy(Sender: TObject);
begin
   Application.UnHookMainWindow(USBEvent);
end;

procedure TMain.ReadButtonClick(Sender: TObject);
Var DevHandle:cardinal;
begin
   //Buffer löschen
   DatenText.Clear;
   //Daten vom USB-Device abrufen
[...]
   DevHandle := GetHandle(VENDOR_ID, PRODUCT_ID);
   Write(DevHandle,@FBufferOut);
   //Löschen-Knopf aktivieren
   DeleteButton.Enabled := true;
   SaveButton.Enabled := true;
end;

{
****************************************************************************
* Name   : USBEvent                                                      *
* Purpose : DLL message handler hook                                      *
****************************************************************************
}
function TMain.USBEvent(var Msg: TMessage): Boolean;
var
   DevHandle:cardinal;
   USBDatenText:string;
   I: Integer;
begin
   result := False;
   if Msg.Msg = WM_HID_EVENT then
   begin
      case Msg.WParam of

         // a HID device has been plugged in...
         NOTIFY_PLUGGED :
         begin
            // is it our HID device...
            DevHandle := Msg.LParam; // handle of HID device in this message
            if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
            begin
               //SetReadNotify(DevHandle,true);
               SetReadNotify(DevHandle,true);
[das hier wird durchlaufen]
               LabelConnected.Caption:='connected';
               DeviceLabel.Caption:='?';

[...]
               //Lesen-Knopf aktivieren
               ReadButton.Enabled := true;
            end;
            result := true;
         end;

         // a HID device has been device removed...
         NOTIFY_UNPLUGGED :
         begin
            DevHandle := Msg.LParam; // handle of HID device in this message
            if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
            begin
               LabelConnected.Caption:='not connected';
               DeviceLabel.Caption:='';
               ReadButton.enabled := false;
               DeleteButton.enabled := false;
            end;
            result := true;
         end;

         // a HID device has been attached or removed. This event is fired after
         // either NotifyPlugged or NotifyUnplugged.
         NOTIFY_CHANGED :
         begin
            // get the handle of the device we are interested in
            // and set it's read notification flag to true...
            DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID);
            SetReadNotify(DevHandle,true);
            result := true;
         end;

         // a HID device has sent some data..
         NOTIFY_READ :
         begin
            DevHandle := Msg.LParam; // handle of HID device in this message
            if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
            begin
               // read the data - remember that first byte is report ID...
               Read(DevHandle,@FBufferIn);
               case FBufferIn[1] of
                  'T','L':
                  begin
[...]
                  end;
               end;
            end;
            result := true;
         end;
      end;
   end;
end;

end.

Robert Marquardt 28. Sep 2007 15:27

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Das ist nicht die HID-Komponente, sondern ein "Konkurrenzprodukt". Ich wusste garnicht das es so etwas gibt.
Lade dir mal von http://www.soft-gems.net die HID-Komponente herunter. Solltst du schon die JVCL haben, dann nicht installieren, aber trotzdem herunterladen. Es sind naemlich ein paar praktische Demoprtogramme mit dabei.
Ich schreib dir mal ein Skelettprogramm, wenn ich mich ein bischen besser fuehle.

Auf was fuer Windows-Varianten laeuft denn das Programm?
Die obige Source sieht soweit sauber aus.

BigWumpus 28. Sep 2007 18:44

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Ja,
hatte ich mir auch schon angesehen und für zu aufwendig empfunden.

Das Problem ist ja nur - es läuft auf dem Entwicklungs-PC.
Warum nicht überall ?


Bernd

Robert Marquardt 29. Sep 2007 05:24

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Bei der HID-Komponente kommt man mit weniger Code aus. Beantworte doch mal die Fragen. Der Unterschied muss in den Rechnern liegen.

BigWumpus 29. Sep 2007 09:21

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Hallo,
Danke erst mal für die Posts.

Hier ein paar Antworten:
Es sind alles Windows XP 32bit-Kisten.
Das Gerät ist ein uC, den ich selbst mit Code versorge. Es werden keine extra-Treiber benötigt, das Gerät wird mit den Standard-HID-Treibern vom Betriebssystem erkannt und unterstützt. Es soll nichts steuern, sondern nur Daten austauschen.

Robert Marquardt 29. Sep 2007 15:33

Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
 
Probieren wir es erst mal mit der HID-Komponente.
Delphi-Quellcode:
unit NB5100PMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, JvComponentBase, JvHidControllerClass, StdCtrls;

type
  TForm1 = class(TForm)
    HidCtl: TJvHidDeviceController;
    Label1: TLabel;
    ListBox1: TListBox;
    procedure HidCtlDeviceChange(Sender: TObject);
    procedure HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte;
      const Data: Pointer; Size: Word);
  public
    Dev: TJvHidDevice;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.HidCtlDeviceChange(Sender: TObject);
begin
  // pruefen ob das bereits benutzte Geraet ausgesteckt wurde
  if Assigned(Dev) and not Dev.IsPluggedIn then
  begin
    // das Geraet zurueckgeben
    HidCtl.CheckIn(Dev);
    Label1.Caption := 'No device';
  end;
  // noch kein Geraet in Benutzung
  if not Assigned(Dev) then
    // pruefen ob die Fernbedienung angesteckt wurde, wenn ja in Benutzung nehmen
    if HidCtl.CheckOutByID(Dev, $147A, $E019) then
    begin
      Label1.Caption := 'Device connected';
      Listbox1.Items.Clear;
    end;
end;

procedure TForm1.HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte;
  const Data: Pointer; Size: Word);
var
  I: Word;
  P: PChar;
  S: string;
begin
  P := Data;
  S := '';
  for I := 0 to Size - 1 do
    S := S + Format('%.2x ', [Cardinal(P[I])]);
  ListBox1.Items.Add(S);
end;

end.
Hier ein Programm fuer das Auslesen einer Fernbedienung. Ich glaube die richtige VID und PID einzusetzen sollte kein Problem sein.
Wenn du nicht die JVCL benutzt, dann JvComponentBase aus dem uses loeschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz