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
[10076] [질문]Cport를 이용한 시리얼 통신에서.. (Rx 부분에 대한 질문)
란티아 [] 1921 읽음    2005-04-18 18:23
안녕 하세요.

CPort를 이용해서 시리얼 통신을 하는데 궁금한게 있어서 이렇게

글을 올립니다.

CPort를 이용해서 데이터 수신시 ComPortRxChar() 이 함수가 호출되어서

내부적으로 ComPort.Read(Buffer, Count); 이런씩으로 데이터를 읽어 오더군요

여기서 제가 시리얼로 데이터를 주고 받기 위해서 간단히 프로토콜을 정했거든요.

TCP의 3번 악수 (?) 기법과 비슷하게요..

데이터를 보내기전에 "나 데이터 보낸다", "데이터 받을 준비 됐다", "데이터전송"

이런씩으로요..

먼저 "나 데이터 보낸다"를 전송후에..

ComPort.Read(Buffer, Count) 이 함수에서 "데이터 받을 준비 됐다" 가 올때까지

기다린다.

"데이터 받을 준비 됐다"라는 메시지가 왔을 경우에..

실질적인 데이터를 전송합니다.

여기서 Buffer의 내용을 디버깅해보니깐요..

이전에 읽어들인 내용까지 같이 들어가 있더군요..

물론 Read하기전에  ZeroMemory(@Buffer[0], sizeof(Buffer)); 이렇게 초기화를

시켰습니다...

그래서.. Read 하기 전에 강제적으로 수신버퍼의 내용을 초기화 할 수 없는지.

궁금해서.. 이렇게 글을 올립니다

글 뒤에는 간단히 소스 형식으로 적어 봤습니다.

그럼.. 답변 부탁드립니다..

좋은 하루 보내세요..

Ex)
ComPort.WriteStr("나 데이터 보낸다.")


procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
begin
   ZeroMemory(@Buffer[0], sizeof(Buffer));
   ComPort.Read(Buffer, Count)
   if Buffer가 "나 데이터 보낸다." 인지 조사.
//여기서 CPort를 이용해서 Write를 한경우, 항상 Read함수를 통해서 얻어진
//Buffer에는 Write시 보낸데이터가 그대로 존재하더군요.. 왜 그런지요???
   {
     while(1)
     {
       ZeroMemory(@Buffer[0], sizeof(Buffer));
       ComPort.Read(Buffer, Count)
//여기서 Read시 Buffer에는 이전에 수신되었던 데이터 + 현재 수신데 데이터가 공존
//을 하고 있습니다.. 왜 그런지요.. Sleep()을 사용해서 시간 Delay를 주어도 마찬가
//지 더군요.. 그래서, 아예 수신 버퍼를 초기화 시키는 방법이 있는지요..
       if Buffer가 "데이터 받을 준비 됐다" 이냐 ? 준비가 됐다면 데이터를 전송한다.
         ComPort.Write(Data, Sizeof(Data));
     }
  }
end;

+ -

관련 글 리스트
10076 [질문]Cport를 이용한 시리얼 통신에서.. (Rx 부분에 대한 질문) 란티아 1921 2005/04/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.