Hallo Delphi-Profis,
wer kann mir sachlich helfen?
Bitte keine Antworten wie: Guck mal in der Microsoft
API-Doku, schreib doch einfach ein Beispiel von C/C++ in Delphi um usw.
Würde ich das können, würde ich hier nicht fragen sondern hätte es schon gemacht. Dazu habe ich viele techn. Dokus (auch vom Hersteller Cypress mit mehreren hundert Seiten) gelesen über USB, stundenlange Recherchen im Internet usw. Konnte aber bisher nichts Brauchbares finden. Die bekannte LibUSB (Delphi-libusb-master 1.0.zip) ist für Delphi 10.xx oder höher. Bei der Umstellung für D7 verzweifele ich, es sind einfach zuviele Fehler und Einzelbaustellen, mit denen ich als Feierabendprogrammierer mit vertretbarem Aufwand in begrenzter Zeit nicht mehr weiter komme.
Meine Ausgangssituation:
------------------------
-Win 11 (64bit) und Delphi 7 (32bit). Daran ist Nichts zu ändern.
-USB-Gerät: NoName Logic-Analyzer mit 8 Digitaleingängen, ohne Doku und ohne Software. Nach meiner Kenntnis ist da ein Cypress CY7C68013A (Derivat vom 8051) mit entsprechender Firmware drinnen.
Das Gerät funktioniert, getestet mit fertiger Software anderer Hersteller. Ich benötige aber nicht eine grafische Darstellung der Digitaleingänge, sondern die Zustände (0/1) als Daten, damit ich diese Signale selbst weiter verarbeiten kann.
-Zugriff auf USB-Gerät über die WinUSB.dll aus dem Ordner ...\Win\system32\..., weil die auf jedem Rechner mit Win vorhanden ist.
-Anschluss Hardware: USB 2.0-Port oder USB 3 macht keinen Unterschied.
Ausführung bisher:
------------------
-Treiber mit dem Zadig 2.x erzeugt, der anscheinend auch funktioniert
-Herzstück meines bisherigen Programms ist eine C-Datei in Pascal umgeschriebene Datei für den Zugriff auf die WinUsb.dll, stammt aus dem Internet.
-Programm bisher:
-WinUsb_QueryPipe(Handle,1,zaehler,@Info): Liefert ein richtiges Handle, richtige PID + VID und plausible Pipe-Infos zurück. Gerät arbeitet im Bulk-Verfahren. Funktioniert also.
-WinUsb_ReadPipe(Handle,$81,@buffer,sizeof(buffer), EmpfangeneBytes,nil):
Handle, Endpoint, Buffer und Buffergröße funktionieren.
Aber: Bei den empfangenen Bytes wird nur 0 angezeigt, im Puffer stehen aber 64 bzw. 512 Bytes als Hexadezimalwerte.
Warum nicht die Anzahl der Bytes im Buffer?
Fragen:
-------
-Wie kriege ich es hin, dass x Bytes (je nach reservierter Puffergröße, z.B. 512) mir als empfangene Bytes angezeigt werden?
-Woher bekomme ich nun die gewünschten Daten der acht Digitaleingänge aus ReadPipe, oder gibt es noch andere Aufrufe dafür?
-Wie sind die Daten im Buffer (Eingang, Endpoint $81) zu interpretieren, sind darin vielleicht irgendwo die acht Digitaleingänge versteckt? Wenn ja, wo?
Gibt es dafür ein brauchbares Datenprotokoll (z.B in der Form Byte 0: Start, Byte 1: 8 Bit Daten, Byte 2: Zeitstempel, Byte 3: CRC...)?
In der chaotischen Doku von Cypress konnte ich unverständlicherweise nichts brauchbares finden. Für die Descriptoren gibts sowas, für den Datenempfang nicht. Hört sich komisch an, ist aber (anscheinend) so.
Wäre schön, wenn sich hiermit jemand auskennt und mich in diese Feinheiten der
USB-Geheimnisse einweihen könnte.
Vielen Dank an alle Kenner und Könner!