Hallo, also ich habe hier einen FT232H auf dem Modul "UM232H" und einen FT232R. Beide hängen am gleichen Rechner und sollen nun in einem C Programm geöffnet werden. Unter Windows verwende ich die D2XX Funktion auf alle gefundenen Geräte an FT_GetDeviceInfoDetail und die meldet mir dann z .B. die Description als String zurück oder auch die Seriennummer. Und dann weiß ich dass z. B. Gerät 1 auf Description "UM232H" und kann das passend öffen ftStatus = FT_Open(1, &FT232H_ftHandle); und alles ist gut. Unter Linux (Ubuntu) meldet FT_GetDeviceInfoDetail nichts sinnvolles zurück. Also weder Description noch Seriennummer. Aber gut, ich kenne ja die Seriennummer, die habe ich mit FT_Prog gesetzt "12345678" und wird unter Linux auch mit lsusb -v korrekt angezeigt. Jetzt könnte man doch ftStatus = FT_OpenEx("12345678",FT_OPEN_BY_SERIAL_NUMBER,&FT232H_ftHandle); verwenden und alles ist gut. Aber nein, geht nicht wieso auch immer. Auch ftStatus = FT_OpenEx("UM232H",FT_OPEN_BY_DESCRIPTION,&FT232H_ftHandle); geht nicht. Wieso ist das so? Und wie finde ich mit C heraus welches Gerät welches ist? Vielen Dank!
:
Verschoben durch User
Gustl B. schrieb: > Und wie finde ich mit C heraus welches Gerät welches > ist? ich verwende dafür UDEV. Da kann man auch darauf reagieren, wenn ein Gerät neu erkannt wird. Über UDEV bekommt man auch die Seriennummer raus.
Gustl B. schrieb: > Unter Linux (Ubuntu) meldet > > FT_GetDeviceInfoDetail > > nichts sinnvolles zurück. Mal mit "sudo ..." aufrufen, das könnte Root Rechte benötigen. Falls das dann funktioniert kann man via UDEV Regel auch die Zugriffsrechte auf das USB Device ändern.
Also als root lasse ich das sowieso laufen, klar. Wenn nur ein Gerät angeschlossen ist, also z. B. der UM232H als Gerät 0 dann kann ich den auch prima unter Linux mit ftStatus = FT_Open(0, &FT232H_ftHandle); öffnen und davon lesen. Ich möchte ein Programm schreiben dass ohne dass ich am Linux was basteln muss von selber die Geräte findet und richtig zuordnet. Unter Windows funktioniert das auch.
Gustl B. schrieb: > Ich möchte ein Programm schreiben dass ohne dass > ich am Linux was basteln muss von selber die Geräte findet und richtig > zuordnet. Unter Windows funktioniert das auch. dann verwende doch udev, dafür ist das da.
Das kenne ich noch nicht, kann man das aus C heraus ansprechen? Muss man da irgendwas im Linux einstellen? Edit: Was würde mir udev denn liefern? Also wie kann ich dann das FTDI Gerät öffnen? Das geht doch dann wieder mit dem D2XX von FTDI.
:
Bearbeitet durch User
Gustl B. schrieb: > Das kenne ich noch nicht, kann man das aus C heraus ansprechen? ja, ist ein Framework was auch eine libudev anbietet > Muss man da irgendwas im Linux einstellen? kann ich nicht pauschal sagen, auf einen linuxsystemen war es immer vorhanden. Leider muss man sich die Doku in Internet zusammensuchen. http://www.signal11.us/oss/udev/ ftp://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/api-index-fu ll.html
Gustl B. schrieb: > Was würde mir udev denn liefern? Also wie kann ich dann das FTDI Gerät > öffnen? Das geht doch dann wieder mit dem D2XX von FTDI. die Frage UDEV welche Geräte vorhanden sind die ein tty anbieten, dann bekommst du eine Liste der Geräte. Diese kann man durchgehen und kann die Eigenschaften abfragen. Dann bekommst du auch den Gerätenamen wie du es Ansprechen kannst.
Wenn ich das richtig sehe dann liefert mir udev doch auch nur die Werte die mir auch lsusb -v liefert. Aber wie öffne ich das FTDI Gerät wenn ich z. B. die Seriennummer schon kenne? Das ist es ja was nicht funktioniert. Ich kenne die Details des Gerätes aber kann es nicht öffnen.
Gustl B. schrieb: > Wenn ich das richtig sehe dann liefert mir udev doch auch nur die Werte > die mir auch lsusb -v liefert. Aber wie öffne ich das FTDI Gerät wenn > ich z. B. die Seriennummer schon kenne? du listest dir alle Geräte auf uns geht die Liste durch, fragst die Seriennumer ab und vergleichst sie. Wenn die passenden gefunden öffnest du sie.
AHHHHHHHH verdammt, ich hab das Problem behoben: Ich muss zuerst mit rmmod ftdi_sio den standardmäßig geladenen Treiber entfernen. Oh weia ... Das funktioniert jetzt: ftStatus = FT_OpenEx("12345678",FT_OPEN_BY_SERIAL_NUMBER,&FT232H_ftHandle); Trotzdem vielen Dank!
Gustl B. schrieb: > AHHHHHHHH verdammt, ich hab das Problem behoben: > > Ich muss zuerst mit > > rmmod ftdi_sio > > den standardmäßig geladenen Treiber entfernen. Oh weia ... Auch dafür könnte man UDEV einsetzen: Mit einer UDEV Regel kann man IMHO verhindern das sich ftdi_sio das USB Device greift.
Das stimmt, aber ich will möglichst nichts an dem Linux konfigurieren müssen. Jetzt läuft auch alles, nur es ist eine Ecke langsamer als unter Windows. Mit den gleichen Einstellungen für T_SetUSBParameters FT_SetLatencyTimer und auch gleicher Blockgröße die gelesen werden soll.
Gustl B. schrieb: > AHHHHHHHH verdammt, ich hab das Problem behoben: Jein > Ich muss zuerst mit > rmmod ftdi_sio > den standardmäßig geladenen Treiber entfernen. Oh weia ... Ich glaube, dein Problem sitzt tiefer. Du verwendest da irgendeine ranzige Library von FTDI, stimmts? Das macht man unter Linux nicht. Schon gar nicht, wenn es sich um einen simplen CDC handelt. Da freut man sich, daß das Kernelmodul die Details kapselt und daß man den seriellen Port genauso wie jeden anderen als character device ansprechen kann. Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser) man nimmt libusb dafür. Das geht dann auch plattformübergreifend.
Axel S. schrieb: > Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder > direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser) > man nimmt libusb dafür. Das geht dann auch plattformübergreifend. Windows und BSD kennen kein LibUSB - damit ist plattformübergreifend etwas übertrieben.
Gustl B. schrieb: > Das stimmt, aber ich will möglichst nichts an dem Linux konfigurieren > müssen. Jede Anwendung soll also seine eigene Gurkenscheiße mixen? Ist das wirklich zielführend, anstatt einen Mechanismus für alle Anwendungen zu nutzen?
Axel S. schrieb: > Ich glaube, dein Problem sitzt tiefer. Du verwendest da irgendeine > ranzige Library von FTDI, stimmts? Ja natürlich weil ich der Auffassung bin, dass der Hersteller seine Hardware am besten kennt und die besten Treiber bietet. Axel S. schrieb: > Das macht man unter Linux nicht. > Schon gar nicht, wenn es sich um einen simplen CDC handelt. Das ist denn ein CDC und wieso macht man das nicht? Axel S. schrieb: > Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder > direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser) > man nimmt libusb dafür. Das geht dann auch plattformübergreifend. Das ist kein USB Serial. Ich nutze den Synchronen FIFO Modus. Gurkenscheiße schrieb: > Jede Anwendung soll also seine eigene Gurkenscheiße mixen? Was willst Du damit genau fragen? Wenn der Hersteller eine Lib mitliefert und die für mehrere Betriebsysteme anbietet, dann wäre es wünschenswert wenn die trotzdem immer gleich anzusprechen ist. Und ja, das ist sie auch einigermaßen, aber eben nicht ganz.
Gustl B. schrieb: > weil ich der Auffassung bin, dass der Hersteller seine > Hardware am besten kennt und die besten Treiber bietet. Verabschiede dich von dem Gedanken :) Richtig würde es heißen: "...dass der Hersteller seine Hardware am besten kennen sollte..." <- dass ist aber nur sehr selten der Fall. Selbiges gilt auch und gerade für Software. Peter II schrieb: > Windows und BSD kennen kein LibUSB Keine Ahnung in welchem Jahr du stehen geblieben bist... http://libusb.info/
1 | What platforms are supported? |
2 | |
3 | Linux, OS X, Windows, Windows CE, Android, OpenBSD/NetBSD, Haiku. |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.