Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15138] Re:[질문]cport에서 포트가 여러개 인경우 실제 장비가 연결된 포트 찾기가 어려워요.
조대현.Clau [casanebula] 2346 읽음    2014-04-21 19:41
:     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.

+ -

관련 글 리스트
15123 [질문]cport에서 포트가 여러개 인경우 실제 장비가 연결된 포트 찾기가 어려워요. 이노야 2505 2014/04/07
15138     Re:[질문]cport에서 포트가 여러개 인경우 실제 장비가 연결된 포트 찾기가 어려워요. 조대현.Clau 2346 2014/04/21
15124     Re:[질문]cport에서 포트가 여러개 인경우 실제 장비가 연결된 포트 찾기가 어려워요. gomsun2 5795 2014/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.