USB-Kommunikation ganz einfach (Teil 3: DLL mit C#)


Funktionsaufrufe des DLL-Treibers in C#

 

Im ersten Teil haben wir uns mit der USB-Kommunikation über den virtuellen COM-Port beschäftigt. Das ist zwar sehr einfach, in den Möglichkeiten jedoch leider etwas eingeschränkt. Wenn Sie eigene Applikationen erstellen wollen, dann sind die Funktionen der DLL die richtige Wahl. Das Herunterladen haben Sie schon im ersten Teil kennen gelernt, die DLL wird ja mit dem VCP-Treiber in einer kombinierten Datei angeboten.

 

Für die Programmierung in C# gibt es auf der Seite von FTDI eine spezielle Wrapper-Klasse, die Sie hier herunterladen können. Damit wird die Programmierung noch erheblich komfortabler.

 

Verwendete Basis-Hardware

Bevor wir uns an das Erstellen der Software machen, brauchen wir eine möglichst einfache Hardware, um unsere Ergebnisse sofort überprüfen zu können. Es handelt sich um eine simple Steckbrettschaltung, die lediglich aus dem USBMOD4-Modul von Elexol, 8 LEDs und einem Widerstandsnetzwerk mit 8 x 470 Ohm besteht.

 

 

Elexol_Testschaltung_1_450.jpg 

Oberhalb des USBMOD4-Moduls können Sie 2 kleine Drahtbrücken erkennen, deren Funktion im 1. Teil beschrieben sind. Von den 8 Datenleitungen D0-D7 geht es direkt auf die Anode (langer Anschluss) der LED und von dort über das Widerstandsnetzwerk (schwarzer Balken hinter den LED) auf Masse. Wird ein Ausgang auf "high" gezogen, leuchtet also die LED. Mehr brauchen wir zum Testen nicht.

 

Einbinden der DLL
Nachdem Sie das Archiv für die Wrapper-Klasse heruntergeladen haben, entpacken Sie es in einem Verzeichnis Ihrer Wahl. Dann starten Sie die C#-Express-Entwicklungsumgebung und erstellen ein leeres Windows-Forms-Projekt. In unserem Beispiel nenne ich das Projekt "FTDI_245BM". In 2 Schritten binden wir nun die FTDI-DLL ein:

 

1. Im Projektmappen-Explorer öffnet sich mit einem Rechtsklick auf "Verweise" ein Dialog mit der Option "Verweise hinzufügen". Suchen Sie die Datei FTD2XX_NET.dll in dem von Ihnen gewählten Verzeichnis und nehmen Sie ins Projekt auf. Der Projektmappen-Explorer sollte nun folgendermaßen aussehen:

Projektmappen-Explorer.png

 

2. Nun müssen wir noch im Quelltext eine using-Direktive unterbringen:

using_Direktiven.png

 

Damit sind alle Vorbereitungen abgeschlossen und wir können mit der Programmierung beginnen. Wir benötigen erst einmal ein paar Variablen:

Variablen_1.png

 

Da wir es in C# immer mit Objekten zu tun haben, deklarieren wir zunächst einmal mit "myMOD" eine Instanz vom Typ "FTDI". Da alle Methodenaufrufe ein Ergebnis vom Typ FTDI.FT_STATUS zurückgeben, deklarieren wir ebenfalls eine Variable diesen Typs und dann legen wir einfach noch eine Integer-Variable an, in der wir die Anzahl der gefundenen Module speichern. Die "myMOD"-Instanz erzeugen wir im Konstruktor unserer Hauptklasse.

 

"C# an USBMOD"

Für den Aufruf unserer ersten Methode brauchen wir eine minimale Benutzeroberfläche aus einem Button (but_ModSuche), einem Label und einer Textbox (tB_ModCount). Das Ganze sieht dann in etwas so aus:

Form_1.png
 

Der folgende Code wird dann beim Klicken auf die Schaltfläche "Module suchen" ausgelöst.

MOD_Suchen.png
 

Unsere erste DLL-Funktion ist "GetNumberOfDevices". Der Name ist selbsterklärend, die Methode sucht angeschlossene Module und speichert die Anzahl in "iModCount". Aus diesem Grund wird beim Methodenaufruf eine Referenz auf iModCount übergeben. Nach dem Aufruf folgt eine Abfrage, ob die Methode ordnungsgemäß abgelaufen ist. 

Hinweis: Findet die Methode kein Modul, läuft sie trotzdem fehlefrei durch und der Inhalt von "iModCount" ist 0. Ein Fehler würde z. B. dann auftreten, wenn der Treiber nicht korrekt angesprochen werden kann.

 

Öffnen des Moduls

Die Suche teilt uns nur mit, wie viele Module am USB-Bus vorhanden sind. Sie ist für das Öffnen des Moduls auch nicht notwendig. Bei einem absoluten Minimalprogramm ist das Öffnen die erste Methode und geschieht z. B. durch den Methodenaufruf "OpenByIndex":

 

MOD_Open1.png
 

Es gibt mehrere Möglichkeiten, ein Modul zu öffnen, aber OpenByIndex ist die einfachste. Als Parameter wird lediglich der laufende Index vergeben, der bei einem einzigen Modul 0 ist. Da der erneute Aufruf der Open-Methode einen Fehler erzeugen würde, deaktivieren wir den Button "but_Open" einfach.

Hinweis: Wenn Sie in C# den Namen der Instanz eingeben "myMOD", den Punkt anhängen und dann "Open" tippen, sehen Sie eine Liste mit allen möglichen Methodeaufrufen für diesen Zweck. 

 

In Zeile 47 bis 54 erfolgt analog zur Suchfunktion eine Fehlerabfrage, bzw. eine Ausgabe des Status in der entsprechenden Textbox. Die Oberfläche sieht nun so aus:

Form_2.png

 

Schließen des Moduls

Gerade erst geöffnet und jetzt schon wieder schließen? Keine Sorge, wir werden noch einiges mehr kennenlernen. Falls Sie aber Ihr Programm öfter starten, z. B. um etwas zu testen, ist es gut, wenn Sie Ihr Modul nach jedem Test auch wieder schließen. Deshalb kommt diese Methode so früh. Wir bringen Sie einfach im Ereignis "FormClosed" unter:

 

MOD_Close.png

 

Wie schnell soll übertragen werden?

Um die nächsten Methoden richtig verstehen zu können, müssen Sie wissen, wie die Kommunikation in dem von uns verwendeten Bit-Bang-Modus tatsächlich abläuft: 

  • Es wird ein Array aus Byte-Variablen definiert
  • Die Startadresse und die Anzahl der zu übertragenden Bytes werden als Parameter übergeben
  • Die Bytes werden in einer vorher festgelegten Übertragungsrate an den Daten-Pins ausgegeben
  • sind alle Daten übertragen, bleiben die Datenleitungen auf dem letzten Zustand

Im einfachsten Fall handelt es sich nicht um ein Array, sondern lediglich um eine Byte-Variable. Der Inhalt dieser Variable wird dann bei jedem Aufruf an den Datenleitungen ausgegeben.

 

Die Übertragungsrate legen Sie mit der Methode "SetBaudRate" fest. Der tatsächliche Wert ist allerdings 16 Mal größer.  

 

Für die Eingabe der Baudrate nutzen wir in unserem Testprogramm eine Combo-Box. Sie erlaubt die Auswahl von fest definierten Werten, aber auch die Eingabe beliebiger Daten. Diese Eigenschaft nutzen wir, um das Verhalten des USBMOD-Moduls zu prüfen. Der Code dafür sieht folgendermaßen aus:

MOD_SetBaud.png

Wenn wir den Button "Setze Baudrate" anklicken, wir der aktuelle Inhalt der Combo-Box in der Variable sBaudRate gespeichert. Danach erfolgt eine Konvertierung in eine unsigned Integer (iBaudRate). Diese Variable wird als Parameter für den Methodenaufruf verwendet. Falls alles ohne Fehler abläuft, erscheint die gewählte Baudrate in dem Editfeld neben der Combo-Box. Geben Sie nun einen beliebigen Wert ein, erscheint eine Fehlermeldung, bei den vordefinierten Werten der Liste funktioniert alles fehlerfrei.  

 

Eingänge oder Ausgänge?

Sie können die Datenleitungen D0 bis D7 sowohl als Eingänge wie auch als Ausgänge oder als beliebige Kombination nutzen. Dazu schreiben Sie mit dem 1. Parameter der gleichnamigen Methode ein Bitmuster ins BitMode-Register. Eine 1 setzt den entsprechenden Pin auf Ausgang, eine 0 steht für Eingang. Mit dem 2. Parameter der SetBitMode()-Methode bestimmen wir den Modus. Beim FT245BM stehen nur 0 (Reset) oder 1 (asynchroner Bit-Bang-Modus) zur Verfügung. 

 

Wir werden der Einfachheit halber nur 2 Buttons verwenden, von denen einer alle Anschlüsse auf Ausgang setzt und der andere alle Pins auf Eingang. Die Oberfläche dazu sieht nun wie folgt aus: 

MOD_SetBitMode.png

 

Die jeweiligen Methoden sind dabei sehr simpel:

 

MOD_SetBitMode2.png
 

Die Bitmaske ist 0xff (Ausgänge) oder 0x00 (Eingänge) und der Modus auf 0x01 (asynchrone Übertragung). Nach dem Aufruf erhalten wir eine entsprechende Meldung über das Ergebnis.

 

Schreiben der Daten

Nun haben wir alle Schritte erledigt, die wir benötigen. Das Setzen der Baud-Rate ist für diese absolute Minimalversion noch nicht einmal nötig, da wir ja lediglich immer nur ein Byte ausgeben und dafür kein definierter Takt erforderlich ist. Damit würden die folgenden 3 Aufrufe ausreichen:

1. Open()

2. SetBiMode()

3. Write()

 

Hinweis: Auch ohne den SetBitMode-Aufruf KANN es funktionieren. Es kann aber auch zu unschönen Systemabstürzen führen, deshalb immer das SetBitMode-Register beschreiben.

 

Die Write-Methode gibt es in 4 Überladungen, die alle sehr ähnlich sind. Wir nutzen den folgenden Aufruf:

ftStat = myMod.Write(bOut, iCount, ref iWritten);

 

  • bOut ist die Adresse eines Byte-Arrays (in unserem Fall mit nur einem Feld)
  • iCount gibt die Anzahl, der zu schreibenden Bytes an (in unserem Fall "1")
  • iWritten enthält die tatsächlich geschriebenen Bytes. Beim Methodenaufruf wird eine Referenz darauf übergeben.

 

Um das Ganze etwas ansehnlicher zu machen, geben wir den Wert über einen Trackbar (Schieberegler ein):

Form_End.png

Die Schaltfläche "D0-D7 als Ausgänge" setzt das SetBitMode-Register und aktiviert auch den Trackbar darunter. Wird der Schieberegler bewegt, so ruft er das Event "Trackbar.Scroll" auf und im Eventhandler lässt sich dann unsere Write-Methode unterbringen. Sie übernimmt den Wert des Schiebereglers, der auf 0 bis 255 skaliert wurde und liest diesen Wert aus. Die Leuchtdioden stellen dann den Wert von 0 bis 255 binär dar.

 

MOD_Write.png

 

In Zeile 128 wird der Wert des Trackbars tBar_Out konvertiert und in das erste und einzige Feld des Byte-Arrays bOut eingelesen. Jedesmal wenn der Trackbar bewegt wird, erfolgt ein Aufruf dieser Methode.

  

LED_Ausgabe.png

 

Sie können Sie das gesamte C#-Projekt herunterladen. Klicken Sie dazu auf das Symbol unten rechts auf dieser Seite. Falls Sie Fragen zu den Bausteinen oder zur Programmierung haben, stehen wir Ihnen jederzeit gern über unsere Kontaktformular zur Verfügung.

 

Für weitere Informationen und Bestellungen einfach auf nachfolgende Links klicken:

 

USBMOD3

USBMOD4

USB232R

 

Falls Sie Fragen zum Thema haben, wenden Sie sich einfach an uns.

Wir helfen Ihnen gern weiter!

 

Ihr Team von Böcker Systemelektronik

 

Hinweis: Unser Tutorialangebot wird in unregelmäßigen Abständen erweitert. Wenn Sie sofort über eine Neuerscheinung informiert werden möchten, tragen Sie sich bitte hier in unsere Benachrichtigungsliste "Tutorials" ein. Sie können diesen unverbindlichen Service jederzeit in Ihrem Kundenkonto oder per E-Mail wieder abbestellen.  

 

Copyright © Böcker Systemelektronik

 

 


Archiv des C#-Projektes