[Gelöst] Usb mit libusb
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
die gewünschten Dateien.
- Dateianhänge
-
Libusbdatien.tar.gz
- (12.89 KiB) 195-mal heruntergeladen
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
Wie ich sehe arbeitet ihr genau an dem Thema, so nun auch ich hänge.
habe ihr da eine gute Anleitung mit gefunden?
Wenn nein, dürfte ich euch um hilfe bitten, folgendes Device via Lazarus ausfindig zu machen?
Code: Alles auswählen
Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#= 9 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0403 ProdID=d8f8 Rev=06.00
S: Manufacturer=ELECTRONIC ASSEMBLY
S: Product=eDIP Programmer
S: SerialNumber=EA9777-1
C: #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=0mA
I: If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
So muß ich wohl von hinten an das Device ran.
EDIT:Bin gerade mal mit der hier geposteten LibUsb zu gange aber komme leider mit der Bezeichnung
Code: Alles auswählen
Type
Plibusb_context = ^libusb_context;
libusb_context = record
(*undefined structure*)
end;
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
In den alten Versionen wurden die Struktur von den Records direkt nachgebildet und damit konnte man auf die Elemente direkt zugreifen.
Jetzt ist alles anders. Du erhältst nur noch Pointer auf Strukturen, die unbekannt bleiben. Damit greifst Du nicht mehr direkt auf den Record zu, sondern über Descriptoren. Im Prinzip sind nur noch die Strukturen der Descriptoren öffentlich.
Zu deinem Programm:
var
ctx:Plibusb_context;
list:PPlibusb_device;
dev: Plibusb_device;
Ha : Plibusb_device_handle;
i := libusb_init(ctx); // ohne libusb_init(ctx) geht gar nichts !
i := libusb_get_device_list(ctx, list); // i = Anzahl der gefundenen devices in list
dev := list[x]; // gibt das device auf Position x zurück
Wenn Du Vendor=0403 und ProdID=d8f8 hast, und Dich nur für das eine Dev interessierst, solltest Du direkt verwenden :
libusb_init(ctx);
Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);
Ich denke das hilft
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
Das schaut schon mal vielversprechend aus.aro hat geschrieben: Mi 11. Nov 2020, 10:11 Ich habe auch eine Weile gebraucht um das zu verstehen.
In den alten Versionen wurden die Struktur von den Records direkt nachgebildet und damit konnte man auf die Elemente direkt zugreifen.
Jetzt ist alles anders. Du erhältst nur noch Pointer auf Strukturen, die unbekannt bleiben. Damit greifst Du nicht mehr direkt auf den Record zu, sondern über Descriptoren. Im Prinzip sind nur noch die Strukturen der Descriptoren öffentlich.
Zu deinem Programm:
Code: Alles auswählen
var ctx:Plibusb_context; list:PPlibusb_device; dev: Plibusb_device; Ha : Plibusb_device_handle; i := libusb_init(ctx); // ohne libusb_init(ctx) geht gar nichts ! i := libusb_get_device_list(ctx, list); // i = Anzahl der gefundenen devices in list dev := list[x]; // gibt das device auf Position x zurück
Wenn Du Vendor=0403 und ProdID=d8f8 hast, und Dich nur für das eine Dev interessierst, solltest Du direkt verwenden :
Code: Alles auswählen
libusb_init(ctx);
Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);
Ich denke das hilft
melde mich gegen ca. 19 Uhr nochmal, mit weiterem Feedback.
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
soweit funktioniert es sehr gut.aro hat geschrieben: Mi 11. Nov 2020, 10:11Code: Alles auswählen
libusb_init(ctx);
Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);
Ich denke das hilft
habe auch meine Auswertung hinbekommen :green: (erste Handleauswertung)
Code: Alles auswählen
procedure TTray_Form.SpeedButton1Click(Sender: TObject);
begin
libusb_init(eDip.ctx);
with Memo1.Lines do begin
Add('Suche USB-Geräte: ' + IntToStr(libusb_get_device_list(eDip.ctx, eDip.list)));
try
try
libusb_open_device_with_vid_pid(eDip.ctx, _eDip.VID, _eDip.PID);
Add('Das Gerät mit dem Vendor 0403 und der $d8f8 wurde gefunden: ');
except
Add('Das Gerät mit dem Vendor 0403 und der $d8f8 wurde nicht gefunden: ');
end;
finally
libusb_exit(eDip.ctx);
end;
end;
end;
Zumindest habe ich jetzt für dieses WE eine Lohnenswerte Arbeit

Class; Package.
USB, und im Dez. RS232, I²C & SPI
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
Prüfe, ob try - except wirklich erkennt, ob das Gerät auch angeschlossen wurde.
Normalerweise speichert man das Handle und überprüft ob ein gültiges Handle zurückgegeben wird!
Die meisten Funktionen erwarten dieses Handle als Parameter !
Wie willst Du später diese Funktionen, die das Handle benötigen, aufrufen, wenn Du es nicht abfängst und speicherst ?
eDip.ctx ist ein Verweis auf die Instanz von libusb aber kein Handle !
Wenn Du in dem Programm libusb_init(ctx) nicht mehrfach aufrufst,
musst Du ctx nicht speichern, und kannst deshalb für alle weiteren Funktionen, die ctx erfordern, eDip.ctx durch Nil ersetzen.
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
eDip ist Type, welcher wie folgt definiert istaro hat geschrieben: Fr 13. Nov 2020, 10:49 eDip.ctx ist ein Verweis auf die Instanz von libusb aber kein Handle !
Wenn Du in dem Programm libusb_init(ctx) nicht mehrfach aufrufst,
musst Du ctx nicht speichern, und kannst deshalb für alle weiteren Funktionen, die ctx erfordern, eDip.ctx durch Nil ersetzen.
Code: Alles auswählen
Type
TeDipUSB = record
list : PPlibusb_device;
dev : Plibusb_device;
Ha : Plibusb_device_handle;
end;
const
_eDip : record
VID, PID : longint;
end = (VID: ($0403);
PID: ($d8f8));
ctx : Plibusb_context = NIL;
habe mir auch mal via "Breakpoint" den Inhalt von eDip angeschaut.aro hat geschrieben: Fr 13. Nov 2020, 10:49 Vergiss es, das ist nicht der richtige Weg !!!!!.
Prüfe, ob try - except wirklich erkennt, ob das Gerät auch angeschlossen wurde.
Normalerweise speichert man das Handle und überprüft ob ein gültiges Handle zurückgegeben wird!
Die meisten Funktionen erwarten dieses Handle als Parameter !
Wie willst Du später diese Funktionen, die das Handle benötigen, aufrufen, wenn Du es nicht abfängst und speicherst ?
Code: Alles auswählen
eDip nicht USB angeschlossen
list : PPlibusb_device; = $6b15d0
dev : Plibusb_device; = $0
Ha : Plibusb_device_handle; = $0
Code: Alles auswählen
eDip via USB angeschlossen
list : PPlibusb_device; = $6b0d18
dev : Plibusb_device; = $0
Ha : Plibusb_device_handle; = $0
Code: Alles auswählen
eDip.Ha := libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID);
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
1. es macht überhaupt keinen Sinn Werte, die man ein einziges mal benötigt in einen Record zu packen und die ganze Zeit mit rum zuschleppen!
ctx - benötigst Du nur ein mal. Das Ergebnis ist vollkommen uninteressant und nutzlos.
VID und PID - musst du ein einziges mal übergeben.
list - verwendest Du nie, wenn libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID); anwendest - weshalb also im Record?
Sinnvoll bleibt doch nur dev : Plibusb_device; und Ha : Plibusb_device_handle; übrig !
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
Gerne würde ich den Aufrufaro hat geschrieben: Sa 14. Nov 2020, 14:04 Warum denn einfach, wenn es auch umständlich geht ? Da kann mann vortrefflich darüber diskutieren, warum es nicht funktioniert, wenn man es nicht so macht, wie es vorgesehen ist. Ich helfe gerne, wenn jemand Probleme hat oder sinnvolle Fragen stellt, aber für sinnlose Diskussionen mit Besserwissern ist mir meine Zeit zu schade !
1. es macht überhaupt keinen Sinn Werte, die man ein einziges mal benötigt in einen Record zu packen und die ganze Zeit mit rum zuschleppen!
ctx - benötigst Du nur ein mal. Das Ergebnis ist vollkommen uninteressant und nutzlos.
Code: Alles auswählen
libusb_init(Nil);
Kompiliere Package EVALeDIPTFT 0.0: Erfolg
Projekt kompilieren, Ziel: VeeJee: Exit code 1, Fehler: 1
trayform.pas(121,18) Error: Can't assign values to an address
ergo. das ich mir in diesem fall eine Constante wie folgt anlege
Code: Alles auswählen
ctx : Plibusb_context = NIL;
bei dem Test gebe ich dir recht.aro hat geschrieben: Sa 14. Nov 2020, 14:04
VID und PID - musst du ein einziges mal übergeben.
list - verwendest Du nie, wenn libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID); anwendest - weshalb also im Record?
Sinnvoll bleibt doch nur dev : Plibusb_device; und Ha : Plibusb_device_handle; übrig !
Ob ich im weiteren verlauf jedoch noch öfters diese Werte benötige, kann/will/werde ich bis jetzt weder bestätigen, noch abstreiten.
Sollte es darauf hinauslaufen, das ich nur ein einziges mal die Parameter benötdigen, lass ich gerne die Zeil
Code: Alles auswählen
eDip.Ha := libusb_open_device_with_vid_pid(NIL, $0403, $d8f8);
Warum jedoch in diesen Funktionen der Parameter "libusb_open_device_with_vid_pid(ctx:Plibusb_context; x; y)" mit NIL direkt geschrieben werden kann, im Gegensatz
libusb_init(out ctx:Plibusb_context) kann ich mir nur dadurch erklären, das es sich bei dem Init um ein _out_ handelt.
Leider sind selbst nach diesen Änderungen, welche aus Gründen der allgemeinen Lesbarkeit und Einfachen Arbeit für alle immer noch nicht die gewünschten Ergebnisse eingetreten, welche ich mir erwünscht hätte.
Habe ja auch versucht mit dem USB Tester V0.0.8B15 von Markus Müller alle meine USB-Geräte zu finden, aber mit Bulk und Interrupt Jeweils 0 bis 15 kann ich alsolut nichts finden. sonst würde ich mir darüber einen Ansatz suchen.
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
Kommunikation mit USB - Geräten ist definitiv nichts für ein Anfängerwerk!
Übe erst mal einige Nummern kleiner ! Und wenn Du dann einige Wissenslücken geschlossen hast, dann gibt es noch einen guten Rat.
Wenn man wenig Erfahrung hat und etwas ganz neues anfängt, dann verwendet man als erstes mal den Quelltext, der andere zum Ziel gebracht hat.
Und wenn Du dann das Project erstmal zum laufen gebracht hast, und erkannt hast und nachvollziehen kannst was wie funktioniert, kannst Du es immer noch anpassen oder anderweitig verschlimmbessern.
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: [Gelöst] Usb mit libusb
und schon stellt sich eine Frage bezüglich der libusb_init()aro hat geschrieben: Sa 14. Nov 2020, 19:55 Wenn Du mal schauen würdest wie libusb_init() deklariert wurde, müsstest Du die Antwort sofort selber sehen.
Kommunikation mit USB - Geräten ist definitiv nichts für ein Anfängerwerk!
Übe erst mal einige Nummern kleiner ! Und wenn Du dann einige Wissenslücken geschlossen hast, dann gibt es noch einen guten Rat.
Wenn man wenig Erfahrung hat und etwas ganz neues anfängt, dann verwendet man als erstes mal den Quelltext, der andere zum Ziel gebracht hat.
Und wenn Du dann das Project erstmal zum laufen gebracht hast, und erkannt hast und nachvollziehen kannst was wie funktioniert, kannst Du es immer noch anpassen oder anderweitig verschlimmbessern.
in dem Testprogramm V8_Test_USB_FPC_D7 mit welchem du den Eingangspost gestartet hast lautet der entsprechende Quelltext wie folgt:
Code: Alles auswählen
Procedure usb_init();
Code: Alles auswählen
Procedure usb_init();
Begin
If LibUSBLoaded And Assigned(_usb_init) Then
_usb_init();
End;
dagegen steht aber auch deine Vorgeschlagene LibUSB, welche sich total von der anderen Unterscheidet.
Code: Alles auswählen
function libusb_init(out ctx:Plibusb_context):cint;extdecl;external;
Belese mich zudem auch auf der wiki von libusb.info und schlagartig kommt mir der Gedanke, und diesen halte ich für ehrlich gesagt absurt ist mei Pi4 mit 32 BIT ungeeingnet.
ABer wie gesagt.
Das halte ich für Absurt.
Also werde ich wohl nicht drumrum kommen und das Thema erst mal nach hinten zu scheiben, bzw in einem anderen Programm zu ergründen, damit ich mit meinem eigentlichen Programm weiterkomme...
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- Beiträge: 130
- Registriert: Di 26. Jul 2011, 19:58
- OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
- CPU-Target: 64Bit
Re: [Gelöst] Usb mit libusb
Ich habe als Eingang geschrieben, das die Datei V8_Test_USB_FPC_D7 nicht funktioniert und nachgefragt ob jemand zusammen passenden Versionen kennt!
Dann habe ich eine Lösung gefunden und aufgezeigt die funktioniert und die Dateien dazu geschickt.
Anstatt endlich die Quelle zu verwenden, die bei mir funktioniert haben, und auf die ich mich beziehe, reitest Du auf veralteten Quellen rum, von denen bekannt ist, das sie nicht mehr funktionieren. Und erwartest für diesen Unsinn ernsthafte Hilfe ?
Versuch es mal mit Töpfern oder Drechseln.