|
저도 cPort 3.0으로 장비에서 날아오는 문자열을 수신하는 프로그램을 만들었었는데요.
RxChar 이벤트를 이용할때 몇가지 문제가 있는데요.
RxChar 이벤트가 데이터 수신이 완료된 시점에 발생하는게 아니라 데이터 수신 시작시점에 발생하는듯 하더군요.
이벤트 발생시 전달된 Count가 버퍼에 수신된 데이터의 Count와 달라서 30밀리정도 지연을 주고 COunt를 다시 읽었었죠.
그래도 중간에 한 두 바이트씩 날아가는 경우가 생기긴 하는데요... 당시엔 데이터가 중요한게 아니라 더 이상 진행하지 않았었습니다.
비슷한 경우라면 이벤트 내에 몇십밀리초 정도의 디레이를 주고 Count를 다시 읽어 보시면 어떨까요?
linuxman 님이 쓰신 글 :
: CPORt 2.64를 사용하고 있습니다.
:
: 상대쪽 장비에서 약 250~300밀리초 단위로 약 100 byte정도의 완전한 프레임(임의로 정의한 Soh ~ EOT 까지) 을 계속 writing 하고 있습니다.
: ComPort1RxChar 에서 읽어 보면 frame이 통째로 빠지는 느낌이 듭니다.
: 중간에 rxbuffer 에서 하나의 프레임이 완전히 사라지는 느낌입니다. ( 즉 100 byte의 프레임을 100번 보내면, 80번정도는 못 받는 그런현상 )
: 이런 현상이 왜 일어나나요?
:
: (그런데..시간을 약 300밀리초 ~ 500밀리초로 writing 하면 100번 보내면, 100번 수신합니다)
:
: rx,tx buffer는 4096으로 설정하였습니다.
:
: ComPort1 ==>
: BaudRate = br19200
: Port = 'COM1'
: Parity.Bits = prNone
: StopBits = sbOneStopBits
: DataBits = dbEight
: Events = [evRxChar, evTxEmpty, evRxFlag, evRing, evBreak, evCTS, evDSR, evError, evRLSD, evRx80Full]
: Buffer.InputSize = 4096
: Buffer.OutputSize = 4096
: FlowControl.OutCTSFlow = False
: FlowControl.OutDSRFlow = False
: FlowControl.ControlDTR = dtrDisable
: FlowControl.ControlRTS = rtsDisable
: FlowControl.XonXoffOut = False
: FlowControl.XonXoffIn = False
: OnRxChar = ComPort1RxChar
:
:
: 그런데..CPort의 void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count) ..
: {
: BYTE recvBuf[512];
: int iLen,i;
:
: memset(recvBuf,'\0',sizeof(recvBuf));
: iLen=ComPort1->Read(recvBuf,Count);
:
: }
|