: if ComPort1.Connected then
: begin
: ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
: if com_port <> '' then // <-- 요부분 인식하지 않음
: begin
: cPort := TRIM(Listbox1.Items[I]);
: Memo1.Lines.Add(cPort);
: break;
: end;
: end;
1.여기서 보시면
ComPort1.WriteStr(SendStart);
명령어를 전송하시네요.
2.하지만 실제 통신상에서 송신보내고 다시 수신받는 시간은 수ms~수초까지 얼마가 걸릴지 예상 못합니다.
그러므로 바로
if com_port <> '' then // <-- 요부분 인식하지 않음
이렇게 검사하신다면 당연히 안됩니다.
3. 그냥 패킷이 도착하면 바로 처리하도록 하세요.
아래 부분 주석처리 또는 삭제
: ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
: //////if com_port <> '' then // <-- 요부분 인식하지 않음
: ////////begin
: //////// cPort := TRIM(Listbox1.Items[I]);
: //////// Memo1.Lines.Add(cPort);
: /////// break;
: ///////// end;
4. 패킷 받으면 처리
: begin
: com_port := ComPort1.Port; // 실제 통신포트 저장 (요부분도 인식하질 않고요.)
: cPort := TRIM(Listbox1.Items[I]);
: Memo1.Lines.Add(cPort);
: end
그리고 장비의 동작 구조가 어떤지 잘 모르겠지만 송/수신 동기화를 좀더 가다듬어서 맞추셔야 할거 같아요.
compacket에서 받은 메세지 처리 후, 전송해야될 데이터가 생긴다면 RX,TX 큐를 만들어서 쓰시면 좋죠.
이노야 님이 쓰신 글 :
: !!!참 쉽지 않네용, 고수님들의 조언을 부탁드립니다.
: unit Unit1;
:
: interface
:
: uses
: Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
: CPort, CPortTypes, CPortCtl, Registry, StdCtrls;
:
: const
: SendStart = Chr($73) + Chr($10) + Chr($04) + Chr($10) + Chr($40) + Chr($50) + Chr($AA);
: SendData = Chr($73) + Chr($10) + Chr($04) + Chr($10) + Chr($60) + Chr($70) + Chr($AA);
:
: RecvStart = Chr($73) + Chr($50) + Chr($04) + Chr($10) + Chr($30) + Chr($20) + Chr($AA);
: RecvEnd = Chr($73) + Chr($50) + Chr($04) + Chr($01) + Chr($70) + Chr($60) + Chr($AA);
:
: type
: TForm1 = class(TForm)
: ComPort1: TComPort;
: ComDataPacket1: TComDataPacket;
: ListBox1: TListBox;
: Memo1: TMemo;
: Button1: TButton;
: Button2: TButton;
: procedure ComDataPacket1Packet(Sender: TObject; const Str: String);
: procedure Button1Click(Sender: TObject);
: procedure Button2Click(Sender: TObject);
: private
: { Private declarations }
: function StrToHex(const S: string): string;//16진수변환
:
: public
: { Public declarations }
: com_port : string;
: end;
:
: var
: Form1: TForm1;
:
: implementation
:
: {$R *.DFM}
:
: function TForm1.StrToHex(const S: string): string;//16진수변환
: var
: i: Integer;
: begin
: Result := '';
: for i := 1 to Length(S) do
: Result := Result + IntToHex( Byte(S[i]), 2 );
: end;
:
: procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
: var
: I : Integer;
: begin
: if (Str = RecvStart) then // 최초 장비로부터 메세지를 받았을 때
: begin
: ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
: end
: else if (Str = RecvEnd) then // 장비로부터 종료 메세지를 받았을 때
: begin
: com_port := ComPort1.Port; // 실제 통신포트 저장 (요부분도 인식하질 않고요.)
:
: Exit; // 끝내면 된다
: end
: else // 장비ID정보를 받거나 측정데이터를 받았을 때
: begin
: ComPort1.WriteStr(SendData);
:
: for i := 1 to Length(Str) do
: Memo1.Lines.Add('['+IntToStr(i) + '] ' +Str[i] + ' (' + StrToHex(Str[i]) + ')' + ' : ' +
: IntTostr(StrToInt('$'+StrToHex(Str[i])))+#13);
: Memo1.Lines.Add('-------------');
:
: end;
: end;
:
: procedure TForm1.Button1Click(Sender: TObject);
: var
: TempReg: TRegistry;
: TempStr: TStrings;
: I: Integer;
: begin
: TempReg := TRegistry.Create;
:
: with TempReg do
: try
: RootKey := HKEY_LOCAL_MACHINE;
: if OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', True) then
: begin
: TempStr := TStringList.Create;
: try
: GetValueNames(TempStr);
: ListBox1.Clear;
: for I := 0 to TempStr.Count-1 do
: ListBox1.Items.Add(ReadString(TempStr.Strings[I]));
: finally
: TempStr.Free;
: end;
:
: CloseKey;
: end;
:
: finally
: Free;
: end;
: end;
:
: procedure TForm1.Button2Click(Sender: TObject);
: var
: i : integer ;
: cPort : string ;
: begin
: ComDataPacket1.StartString := #115;
: ComDataPacket1.StopString := #170;
:
: com_port := '';
: for I := 0 to ListBox1.Items.Count-1 do
: begin
: ListBox1.ItemIndex := I;
:
: if ComPort1.Connected then
: ComPort1.Close;
:
: ComPort1.Port := AnsiString(Listbox1.Items[I]);
: ComPort1.BaudRate := br38400;
: ComPort1.Open;
:
: if ComPort1.Connected then
: begin
: ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
: if com_port <> '' then // <-- 요부분 인식하지 않음
: begin
: cPort := TRIM(Listbox1.Items[I]);
: Memo1.Lines.Add(cPort);
: break;
: end;
: end;
: end;
: end;
:
: end.
|