|
안녕하세요...
시리얼 통신에 대해 하다 궁금한것이 있어 질문을 드림니다.
최보현님의 RS232C class를 참조했습니다.
저의 상황은 매번 200 밀리 second마다 com1에 데이타를 보내면(약 20byte)
그응답으로 약 100 byte 정도를 받습니다. ( 115200 bits )
아래의 코드를 이용해서, 한 character 마다 발생할때마다 interrupt가 발생해서 상위application에서 읽어가도록
되어 있는데...너무 빨라서 인지 데이타 데이타가 누락되는 현상이 일어납니다.
( 데이타가 많아서 인지? 속도가 너무 빨라서 인지? 읽어버리는 데이타가 발생합니다..)
또 이상한 점은 문자가 들어왔을대.. DataRead함수가 call되도록 되어있는데... 이때,
iLen = com1->Read ( RcvBuff,Message.WParam); 에서
iLen 의 값을 조사해보면, iLen 이 0 일때가 종종 있습니다. (이것도 왜 그런지 이해가 안됩니다- 분명 데이타가 들어
와서 DataRead 함수가 call 된것인데... 길이가 0 이라니?)
혹 위의 문제에 대해서 commet 주시면 감사하겠습니다.
혹,상용이라도 RS232C 콤포넌트 쉽게 설치해서/ 쉽게 사용할수 있는 콤포넌트 있으면 알려주시면 감사하겠습니다.
수고하세요.
void __fastcall TserialF::DataRead(TMessage &Message)
{
int iLen,i;
memset (RcvBuff, '\0', sizeof (RcvBuff ) );
iLen = com1->Read ( RcvBuff,Message.WParam);
}
void __fastcall TRS232CRxThread::Execute()
{
DWORD dwEventMask;
DWORD dwErrorFlags;
COMSTAT CommStatus;
while(!Terminated)
{
dwEventMask = 0;
/* wait read until a data arrive event */
WaitCommEvent(myRs232c->hmyPort, &dwEventMask, &myRs232c->evnRead);
if(!dwEventMask) {Sleep(1); continue ;}
EnterCriticalSection(&myRs232c->myCriticalSection);
if(myRs232c->hmyWnd)
{
if(dwEventMask & EV_RXCHAR)
{
//------------ 수신버퍼에 데이터 문자가 수신 되었을 경우
ClearCommError(myRs232c->hmyPort, &dwErrorFlags, &CommStatus);
SendMessage(myRs232c->hmyWnd, myRs232c->lparam, CommStatus.cbInQue, 0);
/*
if (myRs232c->device == SANG_HAENG_COM )
{
SendMessage(myRs232c->hmyWnd, UM_EVN_SANG_HAENG_COM_RXCHAR, CommStatus.cbInQue, 0);
}
else
{
SendMessage(myRs232c->hmyWnd, UM_EVN_HA_HAENG_COM_RXCHAR, CommStatus.cbInQue, 0);
}
*/
}
if(dwEventMask & EV_RXFLAG) SendMessage(myRs232c->hmyWnd, UM_EVN_RXFLAG, 0, 0);
if(dwEventMask & EV_TXEMPTY) SendMessage(myRs232c->hmyWnd, UM_EVN_TXEMPTY, 0, 0);
if(dwEventMask & EV_CTS) SendMessage(myRs232c->hmyWnd, UM_EVN_CTS, 0, 0);
if(dwEventMask & EV_DSR) SendMessage(myRs232c->hmyWnd, UM_EVN_DSR, 0, 0);
if(dwEventMask & EV_RLSD) SendMessage(myRs232c->hmyWnd, UM_EVN_RLSD, 0, 0);
if(dwEventMask & EV_BREAK) SendMessage(myRs232c->hmyWnd, UM_EVN_BREAK, 0, 0);
if(dwEventMask & EV_ERR) SendMessage(myRs232c->hmyWnd, UM_EVN_ERR, 0, 0);
if(dwEventMask & EV_RING) SendMessage(myRs232c->hmyWnd, UM_EVN_RING, 0, 0);
if(dwEventMask & EV_RX80FULL) SendMessage(myRs232c->hmyWnd, UM_EVN_RX80FULL, 0, 0);
}
LeaveCriticalSection(&myRs232c->myCriticalSection);
}
}
|