Q&A

  • Cport를 이용한 시리얼 통신에서.. (Rx 부분)
안녕 하세요.

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;



3  COMMENTS
  • Profile
    이중철 2005.04.20 02:28
    SizeOf(buffer)에서 브레이크 걸고 데이터 확인 해보세요
    4바이트 일경우가 약 80% 이상이겠네요
    buffer를 정의를 어떤식인지 모른 상황에서는 확실히 100% 4바이트라고 말씀
    못드리겠고요 ^^

    그리고 수신버퍼는 Custom assgined buffer라는 이야기이죠
    CPort 내부버퍼가 아니라.. ^^ 답변주신 다른분들 이것땜시 혼돈이 된듯 합니다.



  • Profile
    박종록 2005.04.19 22:16
    [답변]
    별도의 TIMER에서 보내기를 하시고요
    받는 쪽에서는 잘 받았을 때만 응답하게 하고
    ComPortRxChar EVENT에서는 읽기만 하세요
    내가 만든 별도의 버퍼에 읽어서 처리가 완료되면 CLEAR하고요
    읽어서 처리하는 부분도 EVENT 처리부분이 아닌 별도의 TIMER에서 처리하는게 좋습니다.
    저는 문제없이 잘 쓰고 있는데요....
    될 수 있으면 EVENT처리는 간단하고 빠르게 처리하는 쪽으로 하심이 어떨지....



  • Profile
    도끼로이마까 2005.04.19 21:57

    Write로 보낸 데이타가 그대로 존재한다는 것은...
    Read했을때 Read가 되지 않았다는 뜻 아닐까요.
    RxChar의 Count를 조사해보심이..

    • 도끼로이마까
      2005.04.19 20:29
      <!--CodeS--> childForm.WindowState := wsNormal; <!--CodeE-->
    • srookie
      2005.04.19 19:49
      안녕하세요~ 저같은 경우는 ShowWindow 함수를 사용합니다. ShowWindow(해당폼.handle, SW_SHOWNORMAL); ...
    • 도끼로이마까
      2005.04.19 20:38
      컴포넌트 Free부분이 잘못되었습니다. Free하고나면 ControlCount가 하나씩 줄죠 ^^ 다음 루프에 인덱...
    • 유재우
      2005.04.19 22:45
      흑.. 그래도 에러나요..
    • 도끼로이마까
      2005.04.20 19:10
      <!--CodeS-->     for i := 0 to list.Count - 1 do    &nb...
    • [ROOKIE]
      2005.04.20 04:37
      Free할때 for문을 downto로 돌려보세요. 해보지 않아서 정확한 답변인지는ㅠㅠ <!--CodeS--> fo...
    • 윤승환
      2005.04.19 23:58
      GExperts 라는 이름의 Plugin tool에서 제공하긴 합니다만 이걸 사용해서 변경해본 적은 없습니다. 개...
    • 박현식
    • 2005.04.19 04:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박현식
      2005.04.19 04:21
      for i := 1 to 135 do         begin    &nb...
    • Crazy™
      2005.04.20 07:46
      FindComponent 는 말 그대로 반드시 그 컴퍼넌트가 있어야 합니다. Components 로 검색을 해보세요 여러...
    • 송인화
    • 2005.04.19 03:15
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2005.04.20 02:28
      SizeOf(buffer)에서 브레이크 걸고 데이터 확인 해보세요 4바이트 일경우가 약 80% 이상이겠네요 buffer...
    • 박종록
      2005.04.19 22:16
      [답변] 별도의 TIMER에서 보내기를 하시고요 받는 쪽에서는 잘 받았을 때만 응답하게 하고 ComPortRxCha...
    • 도끼로이마까
      2005.04.19 21:57
      Write로 보낸 데이타가 그대로 존재한다는 것은... Read했을때 Read가 되지 않았다는 뜻 아닐까요. RxC...
    • pie
    • 2005.04.19 01:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • Crazy™
      2005.04.20 07:54
      서접에 가시면 자료구조란 책이 많이 돌아댕깁니다. 그 책엔 퀵소트, 버블소트, 셀, 머지 등등등..소트구...
    • 김병윤
      2005.04.19 03:03
      sort 그까이거 대~충....아래처럼 하면 안될까요? ^^ <!--CodeS--> var   data : a...
    • 이중철
      2005.04.20 03:32
      클립보드를 활용하여 보세요 루틴은 어떤식으로 할지 모르지만.. 전 엑셀 데이터통신에서 레코드형식의 ...
    • 설장군
    • 2005.04.18 23:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정찬희
      2005.04.19 19:07
      IIS에서 DLL이 있는 디렉터리에 실행권한을 주지않아서 그렇습니다...
    • 도끼로이마까
      2005.04.19 21:05
      말 그대로 Application 객체의 윈도우를 후킹하는것이지..폼을 후킹하는것이 아닙니다. 폼의 특정 메시...
    • BINU
    • 2005.04.18 19:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김진태
    • 2005.04.18 18:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_BaSTaD
      2005.04.18 19:24
      >델을 시작한지 얼마 되지 않은 초보입니다. 이번에 공부하면서 웹브라우저를 간단하게 하나 맹글어 볼라...
    • 강재규
      2005.04.21 05:20
      제가 알기로는 파라독스에서는 PK가 아닌 필드를 먼저 만들면 안되는걸로 알고 있어요. With StrQuery d...
    • 한윤식
      2005.04.22 19:46
      정말 고맙습니다. error가 해결되었습니다. 감사드립니다.
    • 날라리
      2005.04.18 23:01
      Query1의 Sql.text 에 ":para" 를 넣기 전에 사용하려 해서 그런 것 같군요...
    • srookie
      2005.04.18 19:05
      안녕하세요. GetDC는 Window의 Client영역에 대한 Device Context Handle을 얻어올 때 쓰는것이구요, Get...
    • 윤승환
      2005.04.20 00:21
      panel1.color 는 컴포넌트가 아니고 속성(property)입니다. ColorToStr함수는 델파이 컬러상수명을 반환...
    • 조현태
    • 2005.04.16 06:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2005.04.17 06:26
      전 생업이 게임 개발이라 게임을 개발하고 있는데 사실 지금은 VC 를 씁니다.. 하다 보니 델파이가 ...
    • 조현태
      2005.04.18 05:33
      먼저 답변 감사합니다^^ 일단 제가 조언을 얻고 싶은 부분은.... 델파이로 게임을 제작하고 싶은데.....
    • 석주현
      2005.04.18 08:20
      delphiX는 일본 제 기억으론 "호리" 라는 분이 Direct X을 랩핑하신 VCL입니다 쓸만하죠.. 각각의 컴포...