- 论坛徽章:
- 0
|
代码2:
BOOL CComS::Send(LPBYTE pBuf, int len, DWORD MaxTime)
{
BOOL ret = FALSE;
OVERLAPPED overlap;
ASSERT(m_hCom != NULL);
ASSERT(len < 2000);
DWORD written = 0;
SetEvent(m_ComOverlap.hEvent);
memset(&overlap, 0, sizeof(OVERLAPPED));
overlap.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
EnterCriticalSection(&m_Critical);
BYTE Buf[100] = "rbbttqqyybb";
//if (!::WriteFile(m_hCom, Buf, 10, &written, &overlap)) {
if (!::WriteFile(m_hCom, pBuf, len, &written, &overlap)) {
if (::GetLastError() == ERROR_IO_PENDING) {
if (::WaitForSingleObject(overlap.hEvent, MaxTime) == WAIT_OBJECT_0) {
if (!GetOverlappedResult(m_hCom, &overlap, &written, FALSE))
ReportLastErr();
ret = TRUE;
}
}
} else {
ret = TRUE;
}
if (!::CloseHandle(overlap.hEvent))
ReportLastErr();
LeaveCriticalSection(&m_Critical);
return ret;
}
DWORD CComS::Receive(LPBYTE pDestBuf, int length, DWORD MaxTime)
{
#define RX_BUF_LEN 10000
static BYTE buffer[RX_BUF_LEN];
static int curOut = -1, curLen = 0;
int tmp, len;
ASSERT(m_hCom != NULL);
ASSERT(length < 2000);
tmp = length;
if (curLen) {
len = min(length, curLen);
memcpy(pDestBuf, &buffer[curOut], len);
length -= len;
pDestBuf += len;
curOut += len;
curLen -= len;
if (length == 0)
return len;
}
ASSERT(curLen == 0);
EnterCriticalSection(&m_Critical);
DWORD dwEvtMask = 0;
OVERLAPPED os;
memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent = m_Event;
ResetEvent(m_Event);
SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY);
COMSTAT ComStat;
DWORD dwLength, dwErrorFlags, dwBytesRead;
if (!WaitCommEvent(m_hCom, &dwEvtMask, &os)) {
if (::WaitForSingleObject(m_ComOverlap.hEvent, 0) == WAIT_OBJECT_0) {
ResetEvent(m_ComOverlap.hEvent);
goto out;
}
if (GetLastError() != ERROR_IO_PENDING)
goto out;
if (::WaitForSingleObject(m_Event, 300) == WAIT_OBJECT_0) {
if (!GetOverlappedResult(m_hCom, &os, &dwBytesRead, FALSE)) {
ReportLastErr();
goto out;
}
//break;
}
//dwEvtMask = 0;
}
if (dwEvtMask & EV_TXEMPTY) {
//PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_TXABORT);
goto out;
}
if (!(dwEvtMask & EV_RXCHAR))
goto out;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat) ;
dwLength = ComStat.cbInQue;
if (dwLength > 0) {
ResetEvent(os.hEvent);
ASSERT(dwLength <= RX_BUF_LEN);
if (!ReadFile(m_hCom, buffer, dwLength,
&dwBytesRead, &os)) {
ReportLastErr();
}
//GetOverlappedResult(m_hCom, &os, &dwBytesRead, TRUE);
len = min((int)dwBytesRead, length);
memcpy(pDestBuf, buffer, len);
curLen = dwBytesRead - len;
curOut = len;
length -= len;
}
out:
LeaveCriticalSection(&m_Critical);
return tmp - length;
}
|
|
|