시리얼통신의 시장이 이전만큼은 못한거 같지만 아직도 현장에서는 볼 수 있습니다
시리얼 프로그램 관련해서 수신부분에 질문이 많은것 같아서 검색하여 찾은 자료를 가지고 팁을 드리려고 합니다
참고로 365일 돌려도 수신부분의 문제는 발생하지 않고 있습니다(데이터량 엄청납니다만^^ 이상없음)
통신프로토콜은 STX와 ETX가 있다는 가정하여 자신합니다 ^_^
그림으로 만들었는데 운영자님한테 혼나지 않을까 염려됩니다만 저같은 초보를 위하여 시간내서 편집했습니다
1. TComport를 Form에 붙입니다.
2. Events에서 OnRxChar를 더블클릭합니다
3. 코딩을 합니다.
3. 전역변수를 정의합니다.
4.TMemo1을 화면에 올립니다.
5. Object Inspector에서 시리얼포트를 설정합니다
6. Connected를 True로 설정하면 끝입니다.
F9을 눌러서 동작이 되는지 봅니다
카피신공을 하시는분들을 위하여
procedure TMain_Form.ComPort1RxChar(Sender: TObject; Count: Integer);
var
i : integer;
Str : String; // Sbuffer : string; // 전역변수로 지정 한다.
begin //
Comport1.ReadStr(Str, Count); //Serial포트로 데이터를 받는다
/////////////////////////////////////////////////////////////////////////////
// 02FF8082808303 데이터이면 FF80828083 STX와 ETX를 제거한다
/////////////////////////////////////////////////////////////////////////////
for i := 1 to Length(Str) do begin
if Str[i] = Chr(2) then
begin
Sbuffer := ''; // STX 스타트비트가 (02)
end else
if Str[i] = Chr(3) then begin // ETX END비트가 (03)
MemoRxHex.Text := (Sbuffer);
end else begin
////////////////////////////////////////////////////////////////////////////
// 이부분은STX와 ETX를 제거하고 데이터만 FF0203같이 붙어서 옵니다 ' '를 줘서 FF 02 03으로 나중에
// 공백으로 데이터를 대입하기 편하게 했습니다
// 그리고 대부분 STX(02)와 ETX(03)안에 02 또는 03이 붙을때가 발생하는데 이럴때는
// 대부분 데이터를 FF 80(0) 82(2) 80(0) 83(3)으로 표기합니다
// 이런 데이터를 대입할때 귀찮아서 아래와 같이 80이면 FF 8082 8083 로
// 붙도록 만들었습니다 ^^
if Str[i] = #$80 then
begin
Sbuffer := Sbuffer + IntToHex(Integer(Str[i]), 2);
end else
Sbuffer := Sbuffer + IntToHex(Integer(Str[i]), 2) + ' ';
end;
end;
end;
팁을 하나더 드리자면 8082, 8083 16진수를 10진수로 바꿔쓸때가 가끔 있습니다
투박하지만 참고해서 보십시오
///////////////////////////////////////////////////////////////////////////////////
// 8082 또는 8083으로 들어오는 16진수를 10진수로...(정수이기때문에 앞 0이 없다)
// 즉 8082는 16진수 02 이고 8083은 16진수 03 이라고 가정할때 쓴다
//////////////////////////////////////////////////////////////////////////////////
function HexToInteger(hex: String): Integer;
begin
if hex = '' then
begin
Result := 0;
end else begin
if hex = '8082' then
begin
hex := '$' + '02';
Result := StrToInt(hex);
exit;
end else
if hex = '8083' then
begin
hex := '$' + '03';
Result := StrToInt(hex);
exit;
end else
hex := '$' + hex;
Result := StrToInt(hex);
end;
end;
시험해보는 방법은
Edit2.Text := IntToStr(HexToInteger(Edit1.Text));
////////////////////////////////////////////////////////////////////////////////////////////////////
// 여기까지 수신 받는 팁이었습니다
// 프로그래머마다 각기 생각이 다르기 때문에 다른방법도 무궁무진하겠지요
// 저도 개발할때 마다 다르게 수신받는 방법을 이용하고 있습니다
///////////////////////////////////////////////////////////////////////////////////////////////////
그럼 다음으로 어떻게 02 FF 10 8082 04 03 16진수를 대입하는가 인데요
이번에는 CommaText를 이용해 보았는데 나름 편했습니다 ^^
Edit1.Text 를 Form에 올려 놓습니다 그리고 Text에 임의 16진수 02 FF 10 8082 04 03 를 입력합니다
procedure TForm2.Button1Click(Sender: TObject);
var
RX_Text: TStringList;
a, b, c, d, e, f: String;
begin
RX_Text := TStringList.Create;
RX_Text.CommaText := Edit1.Text;
a := RX_Text.Strings[0]; //02
b := RX_Text.Strings[1]; // FF
c := RX_Text.Strings[2]; //10
d := RX_Text.Strings[3]; // 8082
// 8082를 10진수로 바꾸어서 대입하고자 한다면
// d := IntToStr(HexToInteger(RX_Text.Strings[3])); // 십진수 2가 표기 되겠지요
e := RX_Text.Strings[4]; // 04
f := RX_Text.Strings[5]; // 03 이 들어있겠지요
ShowMessage(b); // FF가 보이면 OK입니다 아마도 보일겁니다!
// 테스트시 무한루프에 빠질때를 대비해서 이런방법도 Edit1.Text := RX_Text.Strings[1]; // FF
end;
Comport를 이용해서 수신받는 방법을 대략 적어보았습니다
처음 접하시면 또 모르는 부분이 생길지는 모르겠습니다.
프로그램을 개발하다보면 간단한 부분에서 몇일 또는 몇주를 고민하는 경우가 있는데 더 딜레마에 빠질 경우가 있습니다
이때 델파이관련 사이트에 질문을 해보면 가끔은 더 기발한 방법을 알려주시는 고마운분들이 계신데
덕분에 저도 먹고 살고 있습니다 ^^ 감사합니다
마지막으로 전 Comport를 유료로 구매해서도 써보았습니다만 지금은 Delphi XE2에 공개용 Comport411f를
이용하고 있습니다 공개용으로 Comport를 이용하게 해주신분들께도 진심 감사드립니다.