Forum: Mikrocontroller und Digitale Elektronik RTS/CTS-Handshake beim LantronixXPort, Pinbezeichn.konfusion


von Uwe G. (golter)


Lesenswert?

Hallo *,
ich versuche seit längerem vergeblich, dem XPort richtiges Handshake
beizubringen und bin dabei auf einiges Durcheinander gestoßen:
Die einzigen klar definierten Ports am XPort sind Din und Dout. Die
drei "configurable pins" CP1..CP3 sind, auch wenn sie die
Flusskontrolle machen sollen, unterschiedlich bezeichnet:

Bezeichnung im Device-Installer | in c't 13/04 | im Datenblatt
CP1: CTS | CTS | RTS
CP2: DCD | - | DTR
CP3: RTS (o. DTR) | RTS | CTS (o. DCD)

Dass die Einstellungen weder per Telnet noch per Web-Interface änderbar
sind, kann man verschmerzen. Aber Recht hat nur das Datenblatt...

Theoretisch sollte doch das Handshake so funktionieren, dass RTS
(Ausgang aus Sicht XPort) und CTS (Eingang) in Ruhe inaktiv sind.
Sobald der XPort Daten via LAN zur Ausgabe kriegt, sollte er das per
Aktivierung von RTS anzeigen. Das am seriellen Port angeschlossene
Gerät meldet dann seine Empfangsbereitschaft mit Aktivierung von CTS
und XPort sendet die Daten ab.
Die Sendung des XPort in Abhängigkeit des CTS-Signals funktioniert
auch. Wenn man Daten per Telnet an Port 10001 sendet, werden die
solange vom XPort gepuffert, bis CTS aktiv wird und erst dann
abgesandt. Das Problem ist aber, dass der XPort in jeder ausprobierten
Lebenslage sofort nach Erreichen der Betriebsbereitschaft RTS aktiviert
und das ewig so lässt. Ob Daten im Ausgangspuffer bereit stehen,
signalisiert er einfach nicht. Was tun???
Ein Hardwareproblem ist es nicht. Den CP1 als "Out1" zu programmieren
funktioniert ja. (Abgesehen davon, dass im Device-Installer "Low"
eingestellt werden muss, um High am Ausgang zu erreichen!)

Es gibt nur eine funktionierende Signalisierung, die standardgemäß
arbeitet: Wenn CP2 als DCD definiert wird (damit in Wirklichkeit DTR
ist), wird dieser Ausgang aktiviert, sobald und solange die Verbindung
zwischen PC und XPort aufgebaut ist (egal ob per Telnet oder
ComPortRedirector).

Hat jemand eine Lösung?

Gruß
Uwe

PS.
Weitere Fragen am Rande:
Was bedeutet die Ausgangskonfiguration der CPx als "LEDx"? In keiner
Dokumentation ist darüber was zu lesen, bei Lantronix gibt's das
Problem nicht und hier im Forum wurde es auch noch nicht erwähnt. Nur
die Beschreibung des Evaluation-Kit (im Integration Guide) lässt
vermuten, dass es sich um einen Stromausgang handelt, der direkt LED's
treiben kann. Stimmt das?
Hat schon mal jemand das GPIO-Interface über Port 0x77F0 benutzt? Ich
kriege keine vernünftigen Antworten vom XPort.
Die unterschiedliche Funktionsbeschreibung der selben Sache im
Web-Interface, im Device-Installer und per Telnet ist schon ganz schön
verwirrend.
Sind mehr als ein Netzwerkadapter im PC installiert, kommt der
Device-Installer trotz der Auswahloption 1./2. Adapter ins Schleudern.
D.h. Device gefunden, aber kein Ping möglich...
Das Gerät, welches ich über das LAN/WAN via XPort zu steuern gedenke,
ist mein Hauscomputer, s.
http://www.godemann.de/Controller/Hauscomputer/hauscomputer.html

von Felix A. (madifaxle)


Angehängte Dateien:

Lesenswert?

Hi Uwe,

ich weiß, über zwei Jahre zu spät. Aber vielleicht hilft es dem einen 
oder anderen doch noch. Ich fand dazu nämlich auch nichts im Web.

Also: Port 77F0 (oder 30704) ist richtig, zumindest beim XPort Direct 
mit der Firmware 6.30 (Extended : 6.3.0.3). Nicht die Angabe der IP
vergessen.
Im XPort Direct User Guide ab Seite 45 sind die Bytes, die zu senden 
sind, hexadezimal angegeben. Das protokoll ist simpel. 9 Bytes senden, 
das erste ist der Befehl. Danach vier Bytes als Maskierung (eine 1 für 
jedes Bit, das geändert werden soll, für insg. 32 GPIOs). Darauf folgen 
weitere 4 Bytes mit den Bitzuständen, die an die GPIOs gehen sollen.

Beispiel:
-XPort Direct mit zwei GPIOs
-ein TCP-Paket senden mit dem Inhalt "10h 0h 0h 0h 0h 0h 0h 0h 0h"
-darauf Antwort: "0h 10h 03h 0h 0h 0h 0h 0h 0h"
 (also zwei GPIOs, Bits 0 und 1 des ersten Bytes, daher die 3)
-jetzt den Zustand beider Pins ändern (habe nur Pin 23, CP1 
angeschlossen.
 Daher keine Ahnung, was CP2 tut!): "1Bh 3h 0h 0h 0h 3h 0h 0h 0h" 
senden.
 heißt: Befehl "Set States" 1Bh, die beiden unteren Bits von Byte 1 
sollen
 geändert werden auf (siehe Byte 5) 3 (also beide auf 1).
 LED geht bei mir an :).
-und wieder aus: "1Bh 3h 0h 0h 0h 0h 0h 0h 0h" senden.
 heißt: Befehl "Set States" 1Bh, die beiden unteren Bits von Byte 1 
sollen
 geändert werden auf (siehe Byte 5) 0 (also beide auf 0).
 LED geht bei mir aus :).

Für die Software habe ich Delphi 6 mit einer TClientSocket-Komponente
benutzt. Quellcode (cs1 ist die Komponente):
1
cs1.Socket.SendText(chr(16) + chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)); // Abfrage, welche Pins änderbar sind
Die Antwort liefert folgende Funktion:
1
procedure TForm1.cs1Read(Sender: TObject; Socket: TCustomWinSocket);
2
var txt : string;
3
    charcodes : array[0..8] of byte;
4
    i : byte;
5
begin
6
  txt := cs1.Socket.ReceiveText;
7
  for i := 0 to length(txt) do begin
8
    charcodes[i] := ord(txt[i]);
9
  end;
10
  memo1.Lines.Add(inttostr(charcodes[0]) + ',' 
11
  + inttostr(charcodes[1]) + ',' + inttostr(charcodes[2]) + ','
12
  + inttostr(charcodes[3]) + ',' + inttostr(charcodes[4]) + ','
13
  + inttostr(charcodes[5]) + ',' + inttostr(charcodes[6]) + ','
14
  + inttostr(charcodes[7]) + ',' + inttostr(charcodes[8]));
15
end;
Das Ergebnis auf die Anfrage vorhin ist
0,16,3,0,0,0,0,0,0 im Memofeld (Textfeld).

LEDs an:
1
cs1.Socket.SendText(chr(27) + chr(3)+ chr(0)+ chr(0)+ chr(0)+ chr(3)+ chr(0)+ chr(0)+ chr(0));

LEDs aus:
1
cs1.Socket.SendText(chr(27) + chr(3)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0)+ chr(0));

Hoffe, es hilft weiter.

LG

PS: bin kein Programmierer, kann daher weder professionell Programme
   schreiben noch gute Tipps geben. Den Quellcode habe ich in den Anhang
   gepackt. Viel Erfolg.

von Axel Schnell (Gast)


Angehängte Dateien:

Lesenswert?

Auch ich habe mich damit beschäftigt die GPIOs von WIPORT bzw. XPORT 
anzusprechen. Allerdings mit Commandline php, da man damit sehr einfach 
interaktiv arbeiten kann. (php5 muss als exe auf dem Rechner verfügbar 
sein).

Der php code ist auch als Anlage beigefügt.

mit der Funktion sendcommand werden entsprechende Kommandos zum WIPORT 
geschickt, die entsprechende Antwort wird mit printf  auf der Konsole 
angezeigt.

mit den Funktionen setportbit und getportbit können gezielt die 
einzelnen IOs gesetzt und abgefragt werden.

<?php        // Programming Xport or Wiport general io  Dez. 2007 
A.Schnell

$Host = "192.168.1.234";

$Response = sendcommand($Host,0x11,0,0); // get directions (1 Output 0 
Input)
printf("\nDirections    :%016b",$Response);

$Response = sendcommand($Host,0x12,0,0); // get active level (high or 
low active)
printf("\nActive Levels :%016b",$Response);
$Response = sendcommand($Host,0x13,0,0); // get active io state
printf("\nIO States     :%016b",$Response);

$Response = setportbit(0,1);  // io Bit 3 auf 1 setzen
printf("\nNew States    :%016b",$Response);

$n = 3; $iobit = getportbit($n);   // get state of IOBit n
echo "\nIObit(",$n,") :",$iobit;

exit;

function setportbit($iobit,$value)  // iobit 0..10, $value 0 oder 1
{  global $Host;
  $b = pow(2,$iobit);        // bitmask
  if($value) $v = $b; else $v = 0;
    $par1 = $b; $par2 = $v;  // $par1 mask, $par2 Bitvalue
    return sendcommand($Host,0x1B,$par1,$par2);
}

function getportbit($iobit) // iobit 0..10
{  global $Host;
  $Result = sendcommand($Host,0x13,0,0);
  $bitvalue = $Result & pow(2,$iobit);    // Bit ausmaskieren
  if($bitvalue) $bitvalue = 1;        // only 0 or 1 as bitvalue
  return $bitvalue;
}

function sendcommand($Host,$command,$par1,$par2)
{   $noerr = true; $Port = 0x77f0; // local  wiport socket for gpio
  $wiport = @fsockopen($Host, $Port, $ErrNo, $ErrStr, 5) or $noerr = 
false;
  if($noerr) {
    $carray = pack("CLL",$command,$par1,$par2); // C:8Bit, L:32Bit, 
L:32Bit
    fwrite($wiport,$carray,9);     // total 9 Bytes
    $Response = fread($wiport,5);  // get 5 Byte response from wiport
    fclose($wiport);
    $carray = unpack("C/L",$Response); // C:8Bit command, L:32Bit result 
-> carray[1]
    return ($carray[1]);
     } else return false;
}

?>

Hoffe auch, das es einigen Lantronix Anwendern weiterhilft, da die 
Lantronixdoku zwar umfangreich, aber nicht besonders übersichtlich ist.

Axel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.