|
@@ -51,7 +51,10 @@ public:
|
|
|
TwoStopBits
|
|
|
};
|
|
|
protected:
|
|
|
- HANDLE m_hComm;
|
|
|
+ HANDLE m_hComm;
|
|
|
+ OVERLAPPED m_ovWait;
|
|
|
+ OVERLAPPED m_ovRead;
|
|
|
+ OVERLAPPED m_ovWrite;
|
|
|
public:
|
|
|
CAsynSerial(void);
|
|
|
virtual ~CAsynSerial(void);
|
|
@@ -95,6 +98,38 @@ public:
|
|
|
return ReadFileEx(m_hComm, lpBuffer, dwNumberOfBytesToRead, lpOverlapped, lpCompletionRoutine);
|
|
|
}
|
|
|
|
|
|
+ // 必须先启用:SetMask(EV_ERR | EV_RXCHAR),才能使用WaitCommEvent;
|
|
|
+ BOOL ReadAsyn(void* lpBuffer, DWORD dwNumberOfBytesToRead, DWORD &dwNumberOfBytesRead) throw()
|
|
|
+ {
|
|
|
+ ATLASSERT(IsOpen());
|
|
|
+ COMSTAT cs = { 0 };
|
|
|
+ DWORD dwErrors = 0;
|
|
|
+ DWORD dwEvtMask = 0;
|
|
|
+ DWORD dwNumberOfBytesTransferred;
|
|
|
+
|
|
|
+ m_ovWait.Offset = 0;
|
|
|
+ m_ovRead.Offset = 0;
|
|
|
+ BOOL Status = WaitCommEvent(m_hComm, &dwEvtMask, &m_ovWait);
|
|
|
+ // WaitCommEvent也是一个异步命令,所以需要等待
|
|
|
+ if (!Status && GetLastError() == ERROR_IO_PENDING)
|
|
|
+ {
|
|
|
+ // 如果缓存中无数据线程会停在此,如果hCom关闭会立即返回False
|
|
|
+ Status = ::GetOverlappedResult(m_hComm, &m_ovWait, &dwNumberOfBytesTransferred, TRUE);
|
|
|
+ }
|
|
|
+
|
|
|
+ ClearCommError(m_hComm, &dwErrors, &cs);
|
|
|
+ if (Status && dwEvtMask & EV_RXCHAR && cs.cbInQue > 0) //有数据
|
|
|
+ {
|
|
|
+ dwNumberOfBytesTransferred = 0;
|
|
|
+ memset(lpBuffer, 0, dwNumberOfBytesToRead);
|
|
|
+ // 数据已经到达缓存区,ReadFile不会当成异步命令,而是立即读取并返回True
|
|
|
+ Status = ReadFile(m_hComm, lpBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, &m_ovRead);
|
|
|
+ PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT);
|
|
|
+ }
|
|
|
+
|
|
|
+ return Status;
|
|
|
+ }
|
|
|
+
|
|
|
BOOL Write(const void* lpBuffer, DWORD dwNumberOfBytesToWrite, DWORD& dwBytesWritten) throw()
|
|
|
{
|
|
|
ATLASSERT(IsOpen());
|
|
@@ -108,6 +143,27 @@ public:
|
|
|
return WriteFile(m_hComm, lpBuffer, dwNumberOfBytesToWrite, lpNumberOfBytesWritten, &overlapped);
|
|
|
}
|
|
|
|
|
|
+ // SetMask(EV_ERR | EV_RXCHAR);
|
|
|
+ BOOL WriteAsyn(const void* lpBuffer, DWORD dwNumberOfBytesToWrite, DWORD &dwNumberOfBytesWritten) throw()
|
|
|
+ {
|
|
|
+ ATLASSERT(IsOpen());
|
|
|
+ PurgeComm(m_hComm, PURGE_TXCLEAR|PURGE_TXABORT);
|
|
|
+
|
|
|
+ m_ovWait.Offset = 0;
|
|
|
+ BOOL bRet = WriteFile(m_hComm, lpBuffer, dwNumberOfBytesToWrite, &dwNumberOfBytesWritten, &m_ovWrite);
|
|
|
+
|
|
|
+ if (!bRet && GetLastError() == ERROR_IO_PENDING)//后台读取
|
|
|
+ {
|
|
|
+ //等待数据写入完成
|
|
|
+ if (FALSE == ::GetOverlappedResult(m_hComm, &m_ovWrite, &dwNumberOfBytesWritten, TRUE))
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return bRet;
|
|
|
+ }
|
|
|
+
|
|
|
BOOL WriteEx(LPCVOID lpBuffer, DWORD dwNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) throw()
|
|
|
{
|
|
|
ATLASSERT(IsOpen());
|