본문 바로가기
Delphi Tip/통신

델파이 RS232 통신

by MonoSoft 2023. 11. 3.
728x90
반응형

RS232 통신

728x90

 

 

 

 

RS232

 

RS-232는 시리얼 통신을 위한 표준 통신 프로토콜.

이것은 전자 장치 간에 데이터를 송수신하는 데 사용되며,

초기에는 컴퓨터 및 주변 장치 간의 통신을 위해 개발되다.

 

 

전압 레벨

 

RS-232는 양방향 통신을 위해 표준 전압 레벨을 정의다.

이것은 대부분 양의 전압과 음의 전압 사이의 차이로 데이터를 나타낸다.

전형적인 레벨은 +12V와 -12V 또는 +5V와 -5V와 같은 값을 가진다.

 

 

비동기 통신

 

RS-232는 비동기 통신을 기반으로 하며, 데이터를 보낼 때

시작 비트와 정지 비트를 사용하여 데이터 프레임을 형성합니다.

이를 통해 데이터의 시작과 끝을 정의하고 데이터 비트를 보내는 장치 간의 동기화를 가능하게 한다.

 

 

다중 데이터 송수신

 

RS-232는 여러 데이터 비트를 전송하고 수신할 수 있는 다양한 데이터 전송 속도를 지원합니다.

일반적인 데이터 전송 속도는 300 bps, 1200 bps, 9600 bps, 19200 bps 등 다양하다.

 

 

 

단점

 

RS-232는 비교적 짧은 거리에서만 효과적으로 작동하며, 노이즈에 취약할 수 있습니다.

또한, 신호가 물리적인 전선을 통해 전달되기 때문에 케이블의 길이와 품질이 중요하다.

RS-232 표준은 오랫동안 사용되었으며,

여전히 일부 장치 및 응용 프로그램에서 사용되고 있지만,

최근에는 USB, 이더넷, 무선 통신과 같은 다른 통신 기술이 RS-232를 대체하고 있다.

 

일단 컴퓨터에 뒤쪽 보시면 Com1 Com2 가 달려 있다.

( 뭐 자기꺼는 Com1 한개만 붙어 있다고 우기신다면 할말 웁구)

Com 포트의 통신은 기본적으로 RS232의 통신방법을 따른다.

 

RS232 는 Rx Tx Gound 요거 3선만 있으면 컴터와 컴터,

각 제어장치와 컴터와의 통신이 가능하다.

- 델파이에서 Com 포트 제어 가능한 콤포넌트 TComport가 있다.

 

RS232는 통신거리가 대략 15 정도 뿐이 되질 않는다라는 말도있다.

그것두 15 미터 돼면 속도 축 처지고 데이터 잘 깨지고...

 

15미터 이상을 날리고 싶다면 RS485 나 R422 을 쓰시면 된다.

RS422은 4선을 보통 사용 하고 RS485는 2선을 써두 무방 하다.

 

RS422,RS485는 보통 1.2키로 까정 가능 하고 허울이나

모뎀을 단다면 1.2키로 이상이 연장이 된다고 보면 된다.

 

물론 RS232 를 RS422,RS485로 변환할수 있는 장치

(시리얼용 컴버터: 시중에 보통 3-4만원정도 살수 있음)를 사용하세요.

 

한가지더.. 시리얼 통신을 TCP/IP 프로토콜을 이용해서

통신을 할수 있는 방법이 있다.

 

이렇게 돼면 지구 반대편의 프린터에 인쇄 신호를 보낼수 있나?.

크크.. 이때는 시리얼용 터미널 서버가 있더여..

그걸 사용 하쉬면 clientsocket을 커넥트 해서 할수도 있고

가상 포트를 만들어서 사용할수도 있다.

 

 

예제

 

간단하게 TComm 을 활용해서 만든 예제이고 요즈음 TComport 컴포넌트를 활용한다.

 

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, CommInt, ExtCtrls;

 

type

TForm1 = class(TForm)

Comm1: TComm;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Edit1: TEdit;

Button4: TButton;

Timer1: TTimer;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Memo2: TMemo;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Comm1Cts(Sender: TObject);

procedure Comm1Rlsd(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

LineData,com_chk : String;

count1,count2 : integer ;

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

// timer1.Enabled:=true;

com_chk:='send';

Memo1.Lines.Clear;

Comm1.DeviceName := '\\.\com102';

Comm1.Open;

// Memo1.Lines.add(GetProviderSubtypeName(Comm1.ProviderSubtype));

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

Timer1.Enabled:=false;

Comm1.Close;

end;

 

procedure TForm1.Button4Click(Sender: TObject);

var

s : String;

Count : Integer;

sDate, sTime : String;

Busea : String;

begin

sDate := FormatDateTime('yy-mm-dd', Now);

sTime := FormatDateTime('hh:nn:ss', Now);

Busea := 'test'; s := Chr(27) + '@' + Chr(13) + Chr(10);

Count := Length(S);

Comm1.Write(S[1], Count);

end;

 

procedure TForm1.Comm1Cts(Sender: TObject);

begin

Memo1.Lines.Add('Cts On');

end;

 

procedure TForm1.Comm1Rlsd(Sender: TObject);

begin

Memo1.Lines.Add('rlsd');

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

var

Buff, sbuff : Array[0..4096] of Char;

Csum : Char;

i,rlen,j,k : Integer; s: string ;

begin

Timer1.Enabled:=false;

if Memo1.Lines.Count > 15 then Button6.click;

{ Buff[0] := #255;

Buff[1] := #10;

Buff[2] := #0;

Buff[3] := #77;

Buff[4] := #0;

Buff[5] := #197;

Buff[6] := #255;

Buff[7] := #0;

Buff[8] := #0;

Buff[2] := #0;

}

 

Buff[0] := #255;

Buff[1] := #10;

Buff[2] := #0;

Buff[3] := #56;

Buff[4] := #5;

Buff[5] := #00;

Buff[6] := #00;

Buff[7] := #00;

Buff[8] := #00;

Buff[9] := #00;

Buff[10] := #0;

Buff[11] := #255;

Buff[12] := #0;

Buff[2] := #0;

csum := #0;

csum := chr(ord(csum) + Ord(Buff[2]));

// Addr csum := chr(ord(csum) + Ord(Buff[3]));

// Type;

for i := 4 to 4 do

begin

csum := chr(ord(csum) + ord(buff[i]));

end;

 

csum := chr(256 - ord(csum));

buff[5] := csum;

comm1.write(buff,13);

sleep(50);

rlen := 0;

 

for k := 1 to 400 do

begin

sleep(10);

i:= Comm1.Read(sbuff[Rlen],255);

rlen:=rlen+ i ;

 

if Rlen > 22 then break;

end;

 

for j:=0 to Rlen-1 do

begin

s:=s+inttohex(ord(sbuff[j]),2);

end;

 

if Rlen > 0 then

begin

count1:=count1+1;

Memo1.Lines.Add(inttostr(count1)+':' + IntToStr(Rlen) + ' - ' + s);

end;

 

if (Rlen > 25) or (Rlen =24 )or (Rlen = 0) then

begin

count2:=count2+1;

Memo2.Lines.Add(inttostr(count2)+':' +IntToStr(Rlen) + ' - ' + s);

end;

 

Timer1.Enabled:=true;

end;

 

procedure TForm1.Button5Click(Sender: TObject);

begin

if Timer1.Enabled=true then

Timer1.Enabled:=false

else

Timer1.Enabled:=true;

end;

 

procedure TForm1.Button6Click(Sender: TObject);

begin

Memo1.Clear;

end;

 

end.

 

728x90
반응형

댓글