FTDI Kommunikation mit USB-Gerät - Ziel C

7

Ich versuche mit dem Enttec USB DMX Pro zu kommunizieren. Hauptsächlich Empfang von DMX.

Sie haben eine Visual C ++ - Version hier veröffentlicht, aber ich ' Ich bin ein wenig ratlos, was ich tun könnte, um nach Obj-c zu konvertieren. Enttec schreibt: "Sprechen Sie mit dem PRO, indem Sie die FTDI-Bibliothek für Mac verwenden, und lesen Sie den D2XX-Programmierleitfaden, um das Gerät zu öffnen und mit ihm zu sprechen." Gibt es irgendwelche Beispiel-Apps für Objective-C? Gibt es eine einfache Möglichkeit, mit dem Enttec DMX USB Pro zu kommunizieren?

    
objectiveccoder001 26.12.2012, 01:06
quelle

2 Antworten

25

Ich habe eine Menge Arbeit mit den FTDI-Chips auf dem Mac gemacht, daher kann ich hier einen kleinen Einblick geben. Ich habe die Einkanal- und Zweikanal-Varianten ihrer USB-Seriell-Wandler verwendet, und sie verhalten sich alle gleich.

FTDI verfügt über ihre virtuellen COM-Port-Treiber, die einen seriellen COM-Port auf Ihrem System erstellen, der die an den jeweiligen Chip angeschlossene serielle Verbindung und ihre D2XX-Bibliotheken für direkte Kommunikation darstellt. Sie werden mit letzterem arbeiten wollen, welches von ihrer Website für verschiedene Plattformen heruntergeladen werden kann .

Die D2XX-Bibliotheken für den Mac werden in einer eigenständigen .dylib (die neueste Version ist libftd2xx.1.2.2.dylib) oder einer neuen statischen Bibliothek, die sie vor kurzem ausgeliefert haben, geliefert. In diesem Paket enthalten sind die entsprechenden Header-Dateien, die Sie benötigen (ftd2xx.h und WinTypes.h).

Fügen Sie in Ihrem Xcode-Projekt die .dylib als zu verknüpfendes Framework hinzu und fügen Sie die Dateien ftd2xx.h, WinTypes.h und ftd2xx.cfg zu Ihrem Projekt hinzu. Stellen Sie in Ihrer Build-Build-Phase für das Build-Paket sicher, dass libftd2xx.1.2.2.dylib und ftd2xx.cfg in dieser Phase vorhanden sind. Möglicherweise müssen Sie auch den relativen Pfad anpassen, den diese Bibliothek erwartet, damit sie in Ihrem App-Bundle funktioniert. Daher müssen Sie möglicherweise den folgenden Befehl in der Befehlszeile ausführen:

%Vor%

Sobald Ihr Projekt vollständig konfiguriert ist, sollten Sie die FTDI-Header importieren:

%Vor%

und starten Sie die Verbindung zu Ihren seriellen Geräten. Das Beispiel, auf das Sie in Ihrer Frage verlinken, enthält ein herunterladbares C ++ - Beispiel, das zeigt, wie sie mit ihrem Gerät kommunizieren. Sie können fast den gesamten C-Code, der dort verwendet wird, mitbringen und ihn in Ihre Objective-C-Anwendung einfügen. Sie scheinen nur die Standard-FTDI-D2XX-Befehle zu verwenden, die detailliert im herunterladbaren D2XX Programmierhandbuch .

Dies ist ein Code, den ich aus einer meiner Anwendungen übernommen habe, um eine Verbindung zu einem dieser Geräte herzustellen:

%Vor%

Die Trennung ist ziemlich einfach:

%Vor%

Schreiben auf das serielle Gerät ist dann ziemlich einfach:

%Vor%

( command ist eine NSData-Instanz, und runOnMainQueueWithoutDeadlocking() ist lediglich eine Komfortfunktion, mit der ich die Ausführung eines Blocks garantiere die Hauptwarteschlange ).

Sie können rohe Bytes von der seriellen Schnittstelle lesen, indem Sie Folgendes verwenden:

%Vor%

Am Ende von oben wird response eine NSData-Instanz sein, die die Bytes enthält, die Sie vom Port gelesen haben.

Außerdem würde ich vorschlagen, dass Sie immer vom Hauptthread auf das FTDI-Gerät zugreifen sollten. Obwohl sie sagen, dass sie Multithread-Zugriffe unterstützen, habe ich festgestellt, dass jede Art von Nicht-Haupt-Thread-Zugriff (sogar garantierte exklusive Zugriffe von einem einzelnen Thread) zeitweise Abstürze auf dem Mac verursacht.

Neben den oben beschriebenen Fällen können Sie den D2XX-Programmierleitfaden für die anderen Funktionen, die FTDI in seiner C-Bibliothek bereitstellt, konsultieren. Auch hier sollten Sie nur den entsprechenden Code aus den Beispielen, die Ihnen von Ihrem Gerätehersteller zur Verfügung gestellt wurden, verschieben.

    
Brad Larson 21.01.2013, 20:42
quelle
0

Ich stieß auf ein ähnliches Problem (Versuch, mit Objective-C auf den EntTec Open DMX zu schreiben), ohne Erfolg. Nachdem ich die große Antwort von @ Brad befolgt hatte, wurde mir klar, dass Sie auch jedes Mal, wenn Sie ein DMX-Paket senden, den BREAK-Status wechseln müssen.

Hier ist ein Beispiel für meine Schleife in einem Testcode, der Pakete mit einer Verzögerung von 20 Millisekunden zwischen Frames sendet.

%Vor%

Hoffe, das hilft jemand anderem da draußen!

    
Harry 11.02.2016 21:17
quelle

Tags und Links