Ich kämpfe hier mit einem, eigendlich sehr simplen Problem:
Ich habe einen COM-Port erstellt und möchte die empfangenen Daten
weiterverarbeiten (jede 2 Sekunden kommt ein Datenblock über die Schnittstelle). Mittels eines Terminalprogramme s(Realterm) kann ich die reinkommenden Daten sehen, nur unter IP-Symcon klappt das nicht.
In Realterm habe ich folgendes eingestellt:
Port: COM3
9600 Baud
Parity: Even
Bits: 7
Stop-Bits: 1
Hardware Flow: None
In IP-Symcon so:
Baud: 9600
Databits: 7
Stopbits: 1
Parität: even
Trotzdem wird nichts empfangen (habe es im Debug-Fenster überprüft).
meine Vermutung ist folgende:
Das Gerät an dem Com-Port, welches die Daten aussendet, wird über die DTR-Leitung mit Strom versorgt. Könnte es sein, dass der IP-Symcon Serial Port diesen Pin nicht setzt, wohl aber ein Terminalprogramm?
Dass der COM-Port blockiert wird, kann ich ausschließen.
Das Terminalsprogramm läuft nicht und ich erhalte beim öffen des COM-Ports auch keine Fehlermeldung in IP-Symcon. Sollte der COM-Port blokiert sein, so meckert IP-Symcon (habe das gerade mal ausprobiert…).
So, wieder etwas weiter.
Ich kann nun definitiv bestätigen, das DTR aktiv sein muss. Sonst kommt
sonst wird kein Signal empfangen. In Realterm kann man das DTR-Signal schalten, und wenn dies ausgechaltet ist, wierden keine Daten mehr empfangen.
Die Frage ist nun, wie in dies in IP-Symcon hinbekomme.
Im Com-Port selber kann ich nichts einstellen. Mittels COMPort_SetDTR habe ich das versucht, hat aber nicht funktioniert. Leider habe ich auch kein Ereignis gefunden, so man PHP-Code ausführen kann, wenn z.B. der Com-Port geöffnet wird.
Wenn ich beim COM-Port ein zyklisches Ereignis erstelle (z.B. jede 5 Sekunden) und dann den PHP-Code „COMPort_SetDTR(45687, true);“ eingebe, so wird zwar was empfangen, aber nur Bruchstücke. Es seint so, als ob das DTR-Signal zwar aktiviert, aber kurz darauf wieder deaktiviert wird.
Anhand der empfangenen Daten, die zu dieser Zeit reinkommen, würde ich sagen, dass dies nur wenige Millisekunden sind.
Wenn der Pin nicht per PHP-Befehl dauerhaft auf High bleibt, würde ich, als Bastler, mir einen Adapter bauen und den Pin per 5Volt hardwaremäßig setzen.
Hm, wäre möglich, scheitert aber daran, dass ich kein USB-Port mehr frei habe.
Sollte ich das nicht hinbekommen werde ich auf die Anbindung wohl verzichten müssen.
An das IP-Symcon Team:
Kann man bei der seriellen Schnittstelle nicht maleine Möglichkeit einbauen, die Datenflusskontrolle zu wählen, sowie DTR und RTS fest auf einen festen Pegel setzen kann?
Bevor jetzt noch weitere Antworten zu externen Stromversorgungen kommen:
NEIN, es soll keine externe Stromversorgung benutzt und auch kein Kabel angepasst oder modifiziert werden.
Es soll so funktionieren, wie vom Hersteller des Anschlusskabels vorgesehen.
Sprich: 9600 Baud, 7 Bit, parity even, DTR auf high.
ja, auch das habe ich probiert. Das Ergebnis war, dass der Comport nach dem Apply jedes mal geschlossen und wieder geöffnet (resetted?) wurde. Dann war das DTR wieder deaktiviert. Das meinte ich damit, dass der DTR nur kurzzeitig auf high ist und danach sofort selbständig wieder auf Low wechselt.
Hallo,
bei mir funktioniert das umschalten der Pin4 (DTR) ohne Probleme
… also Schnittstelle konfigurieren und öffnen (IPS_ApplyChanges), danach mit COMPort_SetDTR den Pegel bestimmen
(jedoch OHNE IPS_ApplyChanges, den das setzen der Pins ist doch nicht INSTANZ-Änderungsrelevant, was ja zwangsweise zu einen schliessen und öffnen der Schnittstelle führt)
So, nun habe ich mal mein Speicheroszi angeschlossen und überprüft, was so am Port passiert
Standardmäßig ist der Pin DTR deaktiviert. Er führt -5V gegen Masse.
Wird nun der serielle Port über in IP-Symcon geöffnen so geht der Pin für
110ms auf high (+5V), danach wieder auf low und bleibt dann auch so.
Wird bei geöffneten seriellen Port in einem Script folgendes ausgeführt:
so ändert sich der Pegel am DTR-Pin NICHT. keine funktion!
Auch ein
IPS_ApplyChanges($comPortID);
danach ändert sichts an der sachen (nur dass der Port resettet, siehe Punkt 1).
das selbe habe ich nun nochmal mittels des Terminalprogrammes „Realterm“. ausprobiert. Dort gibt es ein Button, um den DTR-Pin manuell zu schalten. Hier kann ich den Pin beliebig schalten (Pegeländerung von -5V nach +5V gegen Masse).
Der Befehl COMPort_GetDTR($comPortID) liefert, wie auch schon von tgusi74 berichtet, immer false. Dies kann wohl richtig sein, da der Ausgang wirklich immer auf Low liegt.
Fazit:
Irgendwas stimmt nicht mit dem Befehl COMPort_SetDTR. Bug?