Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TxD,RxD,RTS auf LOW/HIGH setzen


Oliver70 - So 05.10.03 14:39
Titel: TxD,RxD,RTS auf LOW/HIGH setzen
Hi,Delphi Experten !!!
Wie kann ich mit Delphi(3.0) die TxD,RxD,RTS auf LOW/HIGH setzen ?
Für Ihre Hilfe wäre ich sehr Dankbar(ein kleines SourceCode wäre nicht schleht)
MfG
Oliver70


Adrian - Mo 06.10.03 12:44

Servus!

Die RxD-Leitung wird nicht vom Pc sondern vom angeschlossenen Gerät bestimmt, die kannst Du deshalb nicht setzen. Für die anderen Signale müsste ich wissen, welches Betriebssysten Du verwendest. Bei Win 95/98/Me gehts halbwegs einfach, bei NT/2000/XP wird es komplizierter.

Gruß,

Adrian


Oliver70 - Di 07.10.03 06:00

HI,Adrian !!!
Es ist schon Richtig,RxD ist nur zum lesen(Empfangenn) da,ich benutze Wn98 SE
MfG
Oliver70


Adrian - Do 09.10.03 13:34

Servus!

Jetzt hat es zwar ein wenig gedauert, aber ich denke mir, Du kannst die Infos noch brauchen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
function InPort (PortAddr: Word): Byte;
{ Funktion, mit der direkt von den Port-Adressen unter Win32 ein Byte
  eingelesen werden kann }

{$IFDEF WIN32}
assemblerstdcall;
asm
  mov dx,PortAddr
  in al,dx
end;
{$ELSE}
begin
  Result:=Port(PortAddr);
end;
{$ENDIF}

procedure OutPort(PortAddr: Word; DataByte: Byte);
{ Prozedur, mit der ein Byte direkt auf eine Port-Adresse unter Win32
  ausgegeben werden kann }

{$IFDEF WIN32}
assemblerstdcall;
asm
  mov al,DataByte
  mov dx,PortAddr
  out dx,al
end;
{$ELSE}
begin
  Port(PortAddr):=DataByte;
end;
{$ENDIF}

procedure Setzen_und_Lesen;
{  Es wird die Schnittstelle COM1 verwendet,
   für COM2 wäre anstelle von $3Fx der Wert
   $2Fx zu verwenden. }

var
  a: Byte;
begin
  OutPort($3FC,$00);
  a:=InPort($3FC);
end;

{ Information zur Ansteuerung
  Schreibvorgänge:
  Register  Wert       Funktion
  $3FC      xxxx xxx1  setzt DTR auf H
  $3FC      xxxx xxx0  setzt DTR auf L
  $3FC      xxxx xx1x  setzt RTS auf H
  $3FC      xxxx xx0x  setzt RTS auf L

  $3FB      x1xx xxxx  setzt TxD auf H
  $3FB      x0xx xxxx  setzt TxD auf L

  Lesevorgänge:
  Register  Wert       Funktion
  $3FE      1xxx xxxx  DCD ist auf H
  $3FE      0xxx xxxx  DCD ist auf L
  $3FE      x1xx xxxx  RI  ist auf H
  $3FE      x0xx xxxx  RI  ist auf L
  $3FE      xx1x xxxx  DSR ist auf H
  $3FE      xx0x xxxx  DSR ist auf L
  $3FE      xxx1 xxxx  CTS ist auf H
  $3FE      xxx0 xxxx  CTS ist auf L
  }


Das dürfte so hinkommen, aber probiers lieber nochmal aus.

Gute Informationen zum Thema gibt es im Internet unter "Serielle Schnittstelle mit Windows API ansprechen" von Thomas Steinhauer, eine ausgezeichnete Darstelleung, da findest Du alles sehr detaillert beschrieben.

Gruß,

Adrian


Oliver70 - Do 09.10.03 13:50

Hi,Adrian !!!
Herzlichen Dank,werde mal Testen
MfG
Oliver70


Oliver70 - So 12.10.03 17:00

Hi,Adrian !!
Irgenwie komme ich nicht klar mit deine Sourcecode,nach eintippen und starten zeigt mir Delpi ständich fehlermeldung z.b Result:=Port(PortAddr);
oder mov al,dx,PortAddr.
Ich möchte noch einmal schildern was möchte ich machen:Ich möchte eine Ampel über die RS232 Schnittstelle steuern:Ich habe drei Buttons zur verfügung:Button1=TxD;Button=DTR;Button3=RTS:
so,wenn ich auf TxD drücke soll LED aufleuchten,wenn ich noch einmal drücke soll ausgehen,das selbe mit DTR und RTS:da heb ich eine Bitte,könntest du Sourcecode schreiben und dann als ZIP Datei mir zu verfügung stellen und an meine E-Mail Adresse senden,wäre sehr Dankbar dafür,bin nämlich Anfänger und habekein grosse erfahungen mit Delphi
MfG
Oliver70
meine E-Mail adresse:
oliver_1970@gmx.de


Adrian - Di 14.10.03 23:48

Servus!

Da es vielleicht andere auch interessiert, stelle ich den Quellcode auch hier zur Verfügung.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
unit AmpelUnit;

{ Steuerung einer Ampel über die serielle Schnittstelle unter
  Win9x und ME.
  TxD = Rot
  DTR = Gelb
  RTS = Grün
  Verwendet wird COM2, bei COM1 muß $2Fx durch $3Fx ersetzt
  werden.
  A. Haunstetter, 14.10.2003 }


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function InPort (PortAddr: Word): Byte;
{ Funktion, mit der direkt von den Port-Adressen unter Win32
  ein Byte eingelesen werden kann }

{$IFDEF WIN32}
assemblerstdcall;
asm
  mov dx,PortAddr
  in al,dx
end;
{$ELSE}
begin
  Result:=Port(PortAddr);
end;
{$ENDIF}

procedure OutPort(PortAddr: Word; DataByte: Byte);
{ Prozedur, mit der ein Byte direkt auf eine Port-Adresse
  unter Win32 ausgegeben werden kann }

{$IFDEF WIN32}
assemblerstdcall;
asm
  mov al,DataByte
  mov dx,PortAddr
  out dx,al
end;
{$ELSE}
begin
  Port(PortAddr):=DataByte;
end;
{$ENDIF}  

procedure TForm1.Button1Click(Sender: TObject);
//TxD steuert Rot
begin
  OutPort($2FB,InPort($2FBxor $70);//Ändert den Zustand des TxD-Steuerungsbits
  if (InPort($2FBand $70)=0 then
  begin
    Shape1.Pen.Width:=25;
    Shape1.Pen.Color:=clWhite;
  end
  else
  begin
    Shape1.Pen.Width:=25;
    Shape1.Pen.Color:=clRed;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
//DTR steuert Gelb
begin
  OutPort($2FC,InPort($2FCxor $01);//Ändert den Zustand des DTR-Steuerungsbits
  if (InPort($2FCand $01)=0 then
  begin
    Shape2.Pen.Width:=25;
    Shape2.Pen.Color:=clWhite;
  end
  else
  begin
    Shape2.Pen.Width:=25;
    Shape2.Pen.Color:=clYellow;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
//RTS steuert Grün
begin
  OutPort($2FC,InPort($2FCxor $02);//Ändert den Zustand des RTS-Steuerungsbits
  if (InPort($2FCand $02)=0 then
  begin
    Shape3.Pen.Width:=25;
    Shape3.Pen.Color:=clWhite;
  end
  else
  begin
    Shape3.Pen.Width:=25;
    Shape3.Pen.Color:=clLime;
  end;
end;

end.


Gruß,

Adrian


Oliver70 - Do 16.10.03 16:27

Hi,Adrian !!!
Herzlichen Dank für deine Hilfe
Hast du meine E-Mail bekommen ?
MfG
Oliver


nagash369 - Mi 31.03.04 21:08

sorry wenn ich jetzt so eine leiche ausgrabe, aber ich weiß mir nicht mehr anders zu helfen.

ich möchte für ein schulprojekt einzelne pins auf der rs232 schnittstelle auf high und low setzen und die einzige lösung die ich immer wieder finde ist diese hier.

hab mir einen alten rechner mit windows 98 besorgt, an dem ich rumbasteln kann. aber es will nicht klappen.
ich habe exakt deinen code kopiert, adrian, aber es tut sich rein gar nix. immer konstante 10V

hab es auf beiden ports (com1 und com2) probiert. es nützt nichts, kann mir jemand vielleicht einen tip geben?


Adrian - Sa 03.04.04 13:23

Servus!

In dem Programm, das ich hier mal gepostet hatte, sind in der Zwischenzeit einige Veränderungen erfolgt. Probiert habe ich es unter Win98 und XP, aber eigentlich müßte von Win95 bis XP jedes Betriebssystem damit klarkommen. Man braucht die ComPort-Library von Dejan Crnila und Paul Doland (Freeware) sowie die IO.dll von Fred Bulback (auch Freeware). Unten steht ein Programmauszug, der das Setzen und Löschen verschiedener Signale demonstriert. Sollte das Deine Probleme noch nicht Lösen, dann schreib einfach nochmal hier rein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
unit RS232Unit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Menus, CPort;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    COM11: TMenuItem;
    COM21: TMenuItem;
    Rein: TButton;
    ComPort1: TComPort;
    procedure COM11Click(Sender: TObject);
    procedure COM21Click(Sender: TObject);
    procedure ReinClick(Sender: TObject);
private
    { Private-Deklarationen}
public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;
  BA: Word;//Basisadresse der Schnittstelle

implementation

{$R *.DFM}

procedure PortOut(Port : Word; Data : Byte); stdcallexternal 'io.dll';
function PortIn(Port:Word):Byte; stdcallexternal 'io.dll';

procedure Delay(ms : DWord);
var
  TheTime : DWord;
begin
  TheTime := GetTickCount + ms;
  while GetTickCount < TheTime do
    Application.ProcessMessages;
end;

procedure TForm1.COM11Click(Sender: TObject);
begin
  COM11.Checked:=True;
  ComPort1.Port:='COM1';
  ComPort1.Open;
  BA:=$3F8;
  PortOut(BA+4,PortIn(BA+4or $02);//Setzt das RTS-Signal
  Delay(5);
end;

procedure TForm1.COM21Click(Sender: TObject);
begin
  COM21.Checked:=True;
  ComPort1.Port:='COM2';
  ComPort1.Open;
  BA:=$2F8;
  PortOut(BA+4,PortIn(BA+4or $02);//Setzt das RTS-Signal
  Delay(5);
end;

procedure TForm1.ReinClick(Sender: TObject);
begin
  PortOut(BA+3,PortIn(BA+3or $40);//Setzt TxD
  PortOut(BA+4,PortIn(BA+4or $01);//Setzt DTR
  PortOut(BA+3,PortIn(BA+3and $BF);//Löscht TxD
  PortOut(BA+4,PortIn(BA+4and $FE);//Löscht DTR
end;

end.


Gruß,

Adrian


nagash369 - Sa 03.04.04 19:36

danke, ich werd mal sehen obs damit klappt