Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

1

06.11.2014, 22:25

[C#] Serial Port Breaksignal senden

Hallo Community,

heute habe ich mal eine etwas andere Frage, die auch nichts so direkt mit Spieleprogrammierung zu tun hat... Darum schreibe ich sie in das Sprachen Unterforum! Wenn einem Moderator das aber nicht gefällt, kann er den Thread gerne ins Offtopic verschieben. ;)

Soo nun zur Frage:

Ich möchte mir ein DMX Programm schreiben, womit ich meine DMX RGB-Scheinwerfer ansteuern kann. Dazu habe ich ein Interface gekauft. Ich kann es mit der angebotenen Software steuern, die gefällt mir aber nicht so ganz und daher will ich eine eigene programmieren.

Ich habe das Interface mal aufgeschraubt und geguckt was darin verbaut ist. Ich habe einen USB-UART Controller gefunden. Jetzt habe ich geschaut, wie meine vorhandene Software den ansteuert. Der Treiber definiert es als "USB Communication Port" bzw. "Virtual Communication Port". Das Teil ist also als serielle Schnittstelle ansprechbar und alles was ich als Bytes vom Programm aus sende kommt aus der UART-Schnittstelle wieder raus. Nun habe ich den Serial Port vom .NET Framework gefunden und will nun damit meine DMX Signale generieren. Dazu habe ich mir die DMX Spezifikation bei Wikipedia angeschaut und möchte die programmieren. Nun habe ich ein Problem, weil DMX Empfänger ein Break-Signal (LOW für min. 88µs = 22 bits) vor jedem Paket empfangen müssen. Das lässt sich nicht als Bytefolge senden, denn es muss durchgehend LOW sein und das wäre zwischen den Bytes nicht der Fall. Ich habe mich durch X Foren gelesen, aber keine Lösung für das Problem in C# gefunden.

Ich habe dann versucht selber nochmal verschiedene Dinge zu versuchen: Zum Beispiel mal die SerialPort.BreakState Eigenschaft auf true gesetzt. Da kam dann aber sofort eine Exception, dass das "COM-Device nicht mehr funktioniert". Auch habe ich versucht die Bytelänge auf 22 festzulegen um dann in einem Stück 0x0 zu senden. Aber der Serial Port verträgt nur Bytelängen von 5 bis 8 :( .

Hat jemand von euch da eine Lösung bzw. Erfahrung? Oder kann ich irgendwie die Win32 Befehle benutzen? Die solls ja geben hab ich gehört. Da weiß ich aber auch nicht, ob das klappt...

Danke schonmal für eure Antworten! :)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

07.11.2014, 01:49

Was ich gelesen habe ist in dem Interface ein kleiner Microprozessor, der die DMX Signale generiert und sendet. Du sendest also keine direkten DMX Pakete vom PC aus, sondern sendest die Daten die gesendet werden sollen an diesen Microprozessor. Auf der Herstellerseite (http://www.enttec.com/?main_menu=Products&pn=70304) gibt es folgende Spezifikation: http://www.enttec.com/docs/dmx_usb_pro_api_spec.pdf

Ich kenn mich mit DMX zwar gar nicht aus, da aber ein Bekannter von mir an http://www.dmxcontrol.de/ mitarbeitet, würde ich dir die Software einfach mal ans Herz legen.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

07.11.2014, 02:56

Scheinbar bietet diese Freestyler software nen HTTP interface an welches du benutzen koenntest: http://www.freestylersupport.com/fsforum…php?f=38&t=2230
Das waere einfacher als direkt ueber USB zu kommunizieren. Ansonsten sollte dir die Dokumentation des USB protokolls die Tobiking gepostet hat weiter helfen.

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

4

07.11.2014, 13:54

Danke für eure schnellen Antworten!

@Tobiking: Leider ist der Microprozessor den du meinst von FTDI und meiner ist von Microchip. Das liegt daran, dass das Enttec-Interface ein anderes ist, als das Eurolite-Interface. Sie werden aber dummerweise im Internet öfters verwechselt... DMXControl habe ich auch schonmal ausprobiert, aber ich würde gerne trotzdem meine eigene Software programmieren.

@xardias: Das HTTP Interface kannte ich vorher noch nicht - ich werde mich mal damit auseinanderetzen. Trotzdem suche ich nach einer Möglichkeit ein komplett eigenes Programm zu schreiben, das keine anderen benötigt!

@All: Hat keiner von euch den Serial Port schonmal benutzt oder kennt irgendeine andere Möglichkeit, mit COM Ports zu kommunizieren?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

07.11.2014, 14:10

Also laut Doku ist die SerialPort.BreakState Eigenschaft genau das, was du suchst... was gibt es denn da genau für eine Exception? "Funktioniert nicht mehr" wohl eher nicht ;)

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

6

07.11.2014, 18:23

Ich hab mal einen Screenshot von der Meldung gemacht. Du kannst dich selbst davon überzeugen... Eben habe ich mal mit einem Speicheroszilloskop überprüft, ob überhaupt was aus dem Interface rauskommt - nichts. :( Habt ihr ne Ahnung wie das sein kann? Weil das Interface erkennt mein Programm und wenn ich es während dem Betrieb aus dem USB Port rausziehe dann kommt sofort eine Fehlermeldung von wegen Verbindung getrennt. Also ist das doch alles korrekt verbunden...
»CeDoMain« hat folgendes Bild angehängt:
  • Fehler.png
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

07.11.2014, 18:54

IOException kann jetzt vieles bedeuten. Google vielleicht mal nach dem Problem. Vielleicht lässt sich da ja was finden. Versuch dein Programm vielleicht auch mal mit dem Debugger durchzugehen. Damit siehst du dann schon mal an welcher Stelle du etwas falsch machst, bzw kannst den Bereich eingrenzen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

8

07.11.2014, 19:03

Also mit Google habe ich nichts gefunden, außer die Seite wo die Eigenschaft erklärt wird. Da steht bei Bedingung für das Auslösen einer IOException:

Zitat

The port is in an invalid state. - or - An attempt to set the state of the underlying port failed. For example, the parameters passed from this SerialPort object were invalid.
Wenn ich das richtig verstehe, dann heißt das ich habe falsche (invalide) Parameter gesetzt. Stimmt das? Und was ist da falsch? Ich habe nur StoppBits und Geschwindigkeit geändert... :( Der Debugger meldet den Fehler genau dann, wenn die Eigenschaft auf true gesetzt wird. Also muss im Setter irgendwas stehen, was den Fehler wirft...
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

07.11.2014, 19:09

Dafür gibt es doch den Quellcode des Frameworks ;)

Im Endeffekt wird einfach die WinAPI Funktion SetCommBreak aufgerufen.
Also guck mal in der Exception, welches HResult das genau ist.

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

10

07.11.2014, 19:19

Wie Tobiking schon sagt musst du die Daten ganz normal senden. Alle Sync, Stop, Reset- "Bits" und was auch immer werden automatisch von der Schnittstelle generiert und gesendet.

Du musst nur gegeben falls definieren wie diese Konfiguration ist, zum Beispiel beim Konstruktor. (Anzahl Stop Bits, Parität Bit, Baud?)

Wie das Protokoll dann letzten endlich definiert ist wirst du im Datenblatt deines Scheinwerfers nachlesen können.

Eine Auswahl:
http://mc.mikrocontroller.com/de/dmx512.php <- Startbyte und dann Byteweise Kanalkonfiugration
http://asta.tu-berlin.de/sites/default/f…ung_KLS-406.pdf Wie oben?
http://www.enttec.com/docs/rs232_spec.pdf Ascii-Befehle

Werbeanzeige