|
아래 소소와 같이 com port를 open 하고 송,수신 합니다.
com port가 1자리 면 문제없이 Open, 송, 수신 잘 됩니다.
com port가 2자리면 Open, 송신은 됩니다.
수신시 ReadFile(gethcomm(), &by, 1, &dwbytesread, 0); 이부분에서 멈춰버립니다.
제 기억에 Window 98에서는 문제없이 되나가 NT이후에서는 문제가 되서 아래 처럼 \\\\.\\를
앞에 넣어서 해결했던것 같습니다. [NT, 2000 에서는 사용했었습니다.]
Window XP에서는 처음 사용을 하는거라 당연히 \\\\.\\를 넣으면 될줄 알았는데
ReadFile 부분에서 멈추는 것은 어떤 문제일까요?
부탁드립니다.
#define CONNECTED true
#define DISCONNECTED false
HANDLE m_hcomm;
void sethcomm(HANDLE hcomm)
{ m_hcomm = hcomm; }
HANDLE gethcomm()
{ return m_hcomm; }
BOOL ccomm32::opencomm(int nport, DWORD dwbrate) // com port / baudrate Open
{
COMMTIMEOUTS commtimeouts;
DCB dcb;
AnsiString port;
if(nport >= 10)
wsprintf(port.c_str(), "\\\\.\\COM%d", nport);
else
wsprintf(port.c_str(), "COM%d", nport);
sethcomm(CreateFile(port.c_str(),
GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
if(gethcomm() != INVALID_HANDLE_VALUE)
{
중략
setconnected(CONNECTED);
}
return CONNECTED;
}
DWORD ccomm32::readcommch(BYTE &by) // 1byte씩 수신
{
COMSTAT comstat;
DWORD dwerrflgs, dwbytesread;
if(getconnected())
{
ClearCommError(gethcomm(), &dwerrflgs, &comstat);
ReadFile(gethcomm(), &by, 1, &dwbytesread, 0);
return dwbytesread;
}
return 0;
}
//---------------------------------------------------------------------------
DWORD ccomm32::writecomm(const BYTE *by, int nlen) // 송신
{
if(getconnected())
{
DWORD dwbyteswritten ;
clearcomm(RXBUFF | TXBUFF); WriteFile(gethcomm(), (LPSTR) by, nlen, &dwbyteswritten, NULL);
return dwbyteswritten;
}
return DISCONNECTED;
}
//---------------------------------------------------------------------------
void ccomm32::clearcomm(BYTE bystat)
{
if(getconnected())
{
COMSTAT comstat;
DWORD dwerrflgs;
ClearCommError(gethcomm(), &dwerrflgs, &comstat);
if(bystat & RXBUFF)
PurgeComm(gethcomm(), PURGE_RXCLEAR | PURGE_RXABORT);
if(bystat & TXBUFF)
PurgeComm(gethcomm(), PURGE_TXCLEAR | PURGE_TXABORT);
}
}
//---------------------------------------------------------------------------
|