Probleme mit COM-Port

Hallo!

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?

Kann ich das irgendwie erzwingen?

Also die PIN setzen Geschichte würde ich vernachlässigen.
Nur wichtig ist hierbei

  1. Terminalprogramm zu sonst ist der Port blockiert.
  2. IPS DIENST Starten
  3. Kontrolle in der Console ob der Port geöffnet wurde.
  4. Im Port auf DEBUG Klicken EVTL den Hacken auf Hex setzen.

Hallo,

es gibt den Befehl

COMPort_SetDTR($ID,true);

Ansonsten , bitte sicherstellen das der Com Port nicht von einer anderen Anwendung blockiert wird.

Gruß

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.

Very strange…

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.

Nun bin ich ratlos…

Und wie wird das Gerät jetzt mit Spannung versorgt?
Von deinem Com-Port kommt doch jetzt nichts, oder?

Stromversorgung über den PIN DTR.
Wenn DTR deaktiviert ist, hat der Seriell-Wandler keine Versorgungsspannung und funktioniert nicht.

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.

Was ist das für ein Gerät?

Viele wege führen nach Rom, aber ich denke, esw äre sinnvoller, das
Problem zu beseitigen, als um das Problem rumzubasteln.

Außerdem will ich kein weiteres Netzteil haben, was Strom verbraucht.

Kann ja aus dem USB-Port kommen.
Leistung braucht das Ding nunmal, ob aus der seriellen Schnittstelle oder aus dem USB-Port.

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?

Das ist nicht viel arbeit, hilft aber ungemein!

es gibt da so eine tolle Erfindung: USB Hub.

mfg

BerndJ

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.

Ist das machbar, oder nicht?!

Sicher ist das möglich, nur wenn Du Änderungen am Comport vornimmst, musst Du diese auch übernehmen.

COMPort_SetDTR($ID,true); 
IPS_ApplyChanges($ID); 

Hallo RWN,

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.

probier das mal aus.

    COMPort_SetPort($comPortID, 'COM5'); // ComNummer 
           COMPort_SetBaudRate($comPortID, '9600');
            COMPort_SetDataBits($comPortID, '7');
            COMPort_SetStopBits($comPortID, '1');
           COMPort_SetParity($comPortID, 'Even');
       COMPort_SetDTR($comPortID,true); 
           COMPort_SetOpen($comPortID, true);
           IPS_ApplyChanges($comPortID);

bringt auch nichts…
ich werde gleich mal den Pegel mit meinem Speicheroszi ansehen, ob sich da überhaupt was tut…

Ich melde mich, wenn ich das probiert habe (heute abend noch)

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)

<?
$ID=33848  /*[Serial_Port_COM3]*/;

if (COMPort_GetDTR($ID) == true)
  {
  echo "HIGH";
  }
else
  {
  echo "LOW";
  }

//COMPort_SetDTR ($ID, !COMPort_GetDTR($ID));
//IPS_ApplyChanges($ID);

COMPort_SetDTR ($ID, false);

?>

… was bei mir nicht funktioniert ist der Befehl „COMPort_GetDTR“ denn der liefert immer FALSE :confused:

tgusi74

So, nun habe ich mal mein Speicheroszi angeschlossen und überprüft, was so am Port passiert

  1. 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.

  2. Wird bei geöffneten seriellen Port in einem Script folgendes ausgeführt:

$comPortID = 44925;
COMPort_SetDTR($comPortID, true);

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).

  1. 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?