FT245BM +Linux +Kernelmodul -> zusätliche Datenbytes werden angehängt

Apr 16, 2006 10 Replies

Hallo,



ich experimentiere gerade mit dem FT245BM von FTDI. Wenn ich mein Modul mit dem FT245BM einstecke, wird es vom Kernel erkannt und Gerät unter /dev/ttyUSB0 angelegt.



Wenn ich jetzt z.B. per echo "Hallo" > /dev/ttyUSB0 was sende, wird der Text auf meinem LCD Display auch angezeigt,aber hinten angefügt sind zwei weitere Zeichen. Diese Zeichen haben den ASCII Code 13 und 10.



Diese Zeichen sind konstant immer an den letzten beiden Stellen der gesendeten Nachricht, egal was ich sende.



Weiß einer , wo die herkommen und was diese bedeuten ? Ich vermute mal, das sind irgendwelche Steuerinformationen von echo, oder ?



Wie kriege ich die weg ?



Ich habe erstmal zur Ausgabe auf mein LCD nur die Zeichen zwischen ASCII



21 - 122 freigegeben. Eine andere Lösung wäre mir natürlich lieber.

Desweiteren hätte ich noch eine zweite Frage.



Man kann den FTDI CHip per Kernelmodul oder über eine FDTI Bibliothek ansprechen.



Was ist da der Unterschied, welches sollte man nehmen und warum ?



Jogibär


Das sind Carriage Return (CR) und Line Feed (LF), die bei einem Terminal zur Cursorsteuerung benutzt werden. echo -n sollte helfen...

Johannes

Pruuust.

Carriage Return und Line Feed.

Ja. Das sind die Zeichen, die dafür sorgen, daß nach einem "echo Hallo" der Prompt der bash eine Zeile tiefer und am Anfang der Zeile und nicht direkt nach dem "Hallo" erscheinen.

nadia@potti:~> man echo Formatiere echo(1) neu, bitte warten... NAME echo - display a line of text

SYNOPSIS echo [OPTION]... [STRING]...

DESCRIPTION NOTE: your shell may have its own version of echo which will supersede the version described here. Please refer to your shell's documentation for details about the options it supports.

Echo the STRING(s) to standard output.

-n do not output the trailing newline

Für jeden anderen Zweck als USB-Seriellwandlung braucht man die Library. Fürs Bit-Banging bspw.

Gruß Henning

^^^^^^^^^^erscheint.

^^^^^ Falls sich jemand wundert: Sitze hier an einem Fremdrechner... :-)

Gruß Henning

Hallo,

danke für deine Antwort.

Natürlich hast Du recht, man bin ich doof. Daran habe ich jetzt wirklich nicht gedacht. (hätte selber drauf kommen müssen )

Auf alle Fälle funktioniert das jetzt wie gewünscht.

Bloß die Sache mit dem Kernelmodul ist mir echt noch unklar.

Dieses meldet sich ja als FT232 an, man sollte denken, dieses funktioniert nur mit dem seriellen FT232, aber ich erhalte beim FT245 parallel eine korrekte Ausgabe über den Datenbus.

Vielleicht ist der FT245 so intelligent, daß er die Daten, die eigentlich für den FT232 bestimmt sind, trotzdem ausgibt, oder das Kernelmodul ist intelligent.

Vielleicht weiß einer von euch mehr.

Ich hätte da noch eine Frage zur Ansteuerung per Kernelmodul.

Ich habe soviel unter Linux in C noch nicht programmiert. Wo ist denn etwas genauer aufgelistet, welche Funktionsaufrufe das Kernelmodul unterstützt ? ( Oder ist die einzige Funktion das senden von Daten über die Device Schnittstelle ?) Die Doku in den Linuxquellen gibt nicht unbedingt viel her .

Per FTDI Bibliothek soll man eigentlich auch das EEProm beschreiben können und so weiter.

Kennt jemand zufälligerweise eine Seite mit Beispielcode?

Jogibär

Das ist so beabsichtigt. Für den PC sieht der FT245 wie ein serieller Port aus. Sich wie ein paraller auszugeben, wäre Hochstapelei, soviele Statusleitungen hat der Baustein nicht.

Das Kernelmodul ist einfach für beide Bausteine geschrieben worden.

Ja, sowieso. Man kann allerdings, wenn man einen seriellen Port in seinem Programm mit open() geöffnet hat, auch noch mehr als read() und write() mit ihm machen. (Diese Funktionen entsprechen einem cat /dev/ttyUSB0 > datei bzw. echo Text > /dev/ttyUSB0.) Normale serielle Ports kann man nämlich mit ioctl()s auch Kontrollleitungen setzen bzw. Statusleitungen auslesen lassen. Die FTDIs beherrschen auch noch andere IOCTLs. Die unterstützten IOCTLs liest man am besten in den Kernelsourcen nach.

Ich kann Dir ja mal ein paar Sourcen von mir zur Verwendung von ioctl()s schicken, wenn Du möchtest. Richten sich zwar an "echte" serielle Ports, ist für das Verständnis aber vielleicht nicht schlecht. Übrigens - (fast?) alle Linux-Devices werden so angesprochen, ich habe auch noch Beispiele für den Parallelport (/dev/parport).

Ja, beispielsweise. Könnte aber sein, daß die Library aber auch nur die speziellen ioctl()s kapselt, das weiß ich nicht genau.

Für die Verwendung der Library hatte ich mal was, muß ich nochmal suchen.

Gruß Henning

Hä ?? Der FT245 hat als Schnittstelle einen 8 bit parallelen Datenbus. ( + einiger Steuerleitungen wie, Lese und Schreibfreigabe für den FT245 u.s.w.) Der FT232 hat TXT,RXD, u.s.w.

Mich wundert eben, daß er die Daten parallel und nicht seriell ausgibt. Aber es funktioniert, und das ist die Hauptsache.

Ich habe mir dir ftdilib + ftdilib-dev installiert.

In der ftdilib.h finde ich die Funktionsprototypen. Mehr habe ich allerdings nicht. Man kann natürlich herumprobieren, bis man die korrekten Aufrufe mit entsprechenden Parametern herausbekommen hat; und weiß, was jene Funktion genau bewirkt.

So richtig Beispielcode habe ich bisher noch nicht gefunden.

Jogibär

Ja.

Ja, deren Funktion wird aber nicht an den PC durchgereicht.

Works as designed. Die FTDI-Entwickler hatten 3 Optionen, als sie den Treiber für den FT245 geschrieben haben:

1) Virtuellen Parallelport abbilden, 2) Virtuellen seriellen Port abbilden, 3) Proprietären Port sich ausdenken.

Sie haben sich für 2) entschieden.

Ich kann Dir ja mal was schicken, wenn ich wieder zuhause bin. Eventuell habe ich auch noch was auf dem Laptop, den habe ich hier. Ich schau mal.

Gruß Henning

P.S.: Wie hast Du den FT245 eingelötet? Ich habs so gemacht:

formatting link

Hallo,

dann reden wir doch vom gleichen.

Das die Statusleitungen von USB aus nicht anzusprechen sind ist ja klar, da diese nur für die Verbindung CPU - FTDI erforderlich sind. Man muß ja schließlich wissen, wann man Daten lesen und senden kann.

Für Beispielcode von Dir wäre jederzeit dankbar, da ich mich noch nicht entschieden habe, ob ich die Kommunikation über des Kernelmodul oder über die libftdi mache.

Eigentlich soll das Ganze später mal für meinen VDR eingesetzt werden, und das möchte ich eben mit USB machen, weil parallel und seriell irgendwann komplett verschwinden.

Jogibär

auch PS.

Also wie Du habe ich das nicht gemacht, da würde es mir kalt den Rücken runterlaufen, bei der Ausführung. Das wäre mir viel zu unzuverlässig; und ich wüßte bei einem Fehler nie, liegt es an meinem Programm oder an meinem Hardwareaufbau. Ich habe mir mit Eagle eine kleine Platine erstellt ( ca. 50x50mm ), die ich in mein Testsystem einstecken kann. Da habe ich zum Beispiel auch LED's über Treiber an jedem Port, so sehe ich, wenn sich dort was tut.

Falls Du Interesse an der Platine hast, kannst Du die Pläne haben.

Fotos kann ich leider nicht anbieten, da ich anscheinend der letzte in Deutschland bin, der noch keine Digitalkamera hat. (habe noch nicht mal ein Handy; kann mich dadurch wenigstens frei bewegen )

Ja, ich habe nur versucht Dir klarzumachen, daß die Herangehensweise, den FT245 als seriellen Port (und nicht als Parallelport) anzusprechen die sinnvollste für den Hersteller war.

An meinem VDR habe ich noch einen seriellen LIRC-Dongle hängen, LCD habe ich keins dran.

Hab noch mehr solche Bilder:

formatting link

Habe mir mal für den ATmega128 Adapterplatinen geeaglet und die bei jemandem mitfertigen lassen, bin aber für so Kleinkram wie

Jogib=E4r schrieb:

ggrohmann@Guido:~$ man bin ich doof Kein Manual-Eintrag f=FCr bin vorhanden Kein Manual-Eintrag f=FCr ich vorhanden Kein Manual-Eintrag f=FCr doof vorhanden

:-D

Guido

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required