안녕하세요?
델초보인데 얼마전 부서를 옮기고 델파이를 시작하면서 OJT 과제로
작은 프로젝트를 받아서요 comport 2.64로 작업중인데요,
시리얼 통신 채팅프로그램 같은 거 만들고 있거든요.
일단 프로그램 띄우고 양쪽에서 connect 시켜주고 텍스트 입력해서 보내면
상대방에 텍스트가 뜹니다.
문제는요 두 번 정도 왔다갔다하고나면 그담부턴 더 이상 내용이 전달되지 않습니다.
그래서 자꾸 연결이 끊어진다고 생각했었거든요.
근데, 연결이 끊어지는 게 아닌 것 같습니다.
텍스트가 전달이 안되서 양쪽에서 다시 connect를 시켜줘도
마찬가지로 전달이 되지 않네요.
프로그램을 종료시키고 다시 띄워서 양쪽에서 connect해주고나면
다시 텍스트 전송이 되지만 두어줄 보내고나면 마찬가지로 전송이 되지 않습니다.
그래서, 연결이 끊어지는 게 아니고 어딘가에서 딴짓을하는 게 아닐까(무한루프라던지.. 뭐 그런 거)
소스 좀 봐주세요.
그리고 한 가지 더 묻자면
R_str : array[1..100] of char; 이렇게 변수선언하고
ComPort.ReadStr(R_str,count);
이런식으로 컴포트에서 read한 파일을 char배열에 넣으려고하니까
array와 string의 type이 맞지 않는다는 에러가 뜨는데요,
이거 원래 가능한 거잖아요. char로 된 배열에 string 문자 넣고 읽고 하는 거 다 되는건데
기존에 다른 소스에서도 많이 썼었는데 안되네요.
======== 소스내용입니다 ===================
unit ComPort;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, CPort, CPortCtl, ExtCtrls;
type
TForm1 = class(TForm)
ComPort: TComPort;
RichEdit1: TRichEdit;
Edit1: TEdit;
ConnBtn: TButton;
ClearBtn: TButton;
ExitBtn: TButton;
EnterBtn: TButton;
DisConnBtn: TButton;
Memo1: TMemo;
procedure ConnBtnClick(Sender: TObject);
procedure DisConnBtnClick(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
procedure ExitBtnClick(Sender: TObject);
procedure EnterBtnClick(Sender: TObject);
procedure ComPortRxChar(Sender: TObject; Count: Integer);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ConnBtnClick(Sender: TObject);
begin
if ComPort.Connected then exit
else
ComPort.Open;
ConnBtn.Caption := '연결중';
Edit1.SetFocus;
end;
procedure TForm1.DisConnBtnClick(Sender: TObject);
begin
if ComPort.Connected then
ComPort.Close
else exit;
MessageDlg('연결 해제되었습니다', mtInformation, [mbOK], 0);
ConnBtn.Caption := '&Connect';
end;
procedure TForm1.ClearBtnClick(Sender: TObject);
begin
RichEdit1.Lines.Clear;
Edit1.SetFocus;
end;
procedure TForm1.ExitBtnClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.EnterBtnClick(Sender: TObject);
var T_str : string;
begin
if ComPort.Connected then
begin
T_str := Edit1.Text;
if copy(T_str, length(T_str), 1) <> #13 then T_str := T_str + #13;
ComPort.WriteStr(T_str);
RichEdit1.Lines.Add('[송신] ' + T_str);
Edit1.Clear;
Edit1.SetFocus;
end
else if MessageDlg('연결되지 않았습니다' + #10#13 + '연결하시겠습니까?',
mtWarning,[mbYes,mbNo],0) = mrYes then ComPort.Open
else begin
Edit1.SetFocus;
Exit;
end;
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
R_str : string;
begin
ComPort.ReadStr(R_str, Count);
if copy(R_str, count, 1) <> #13 then Memo1.Text := Memo1.Text + R_str
else
begin
RichEdit1.Lines.Add('[수신] '+ Memo1.Text + R_str);
Memo1.Clear;
Edit1.SetFocus;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then EnterBtnClick(nil);
end;
end.
저는 컴이 하나라 serial port를 loop시켜서 했습니다. (2, 3번 핀 loop)
송신, 수신 모두 이상이 없었습니다.
그럼 수고하세요.