|
@@ -8,6 +8,13 @@ CSynSerial::CSynSerial(void) :m_hSerialPort(NULL)
|
|
memset(&m_dcb, 0, sizeof(DCB));
|
|
memset(&m_dcb, 0, sizeof(DCB));
|
|
memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
|
|
memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
|
|
memset(&m_szSerialPort, 0, sizeof(TCHAR)*MAX_PORT_LEN);
|
|
memset(&m_szSerialPort, 0, sizeof(TCHAR)*MAX_PORT_LEN);
|
|
|
|
+
|
|
|
|
+ // 初始化重叠对象;
|
|
|
|
+ ZeroMemory(&m_wrOverlapped,sizeof(m_wrOverlapped));
|
|
|
|
+ if (m_wrOverlapped.hEvent != NULL) {
|
|
|
|
+ ResetEvent(m_wrOverlapped.hEvent);
|
|
|
|
+ m_wrOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
CSynSerial::~CSynSerial(void)
|
|
CSynSerial::~CSynSerial(void)
|
|
@@ -21,7 +28,7 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
|
|
CloseSerialPort();
|
|
CloseSerialPort();
|
|
|
|
|
|
_stprintf_s(m_szSerialPort, _T("\\\\.\\com%d"), (int)byCommPort);
|
|
_stprintf_s(m_szSerialPort, _T("\\\\.\\com%d"), (int)byCommPort);
|
|
- m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
|
|
|
|
|
|
+ m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
|
if (m_hSerialPort == INVALID_HANDLE_VALUE)
|
|
if (m_hSerialPort == INVALID_HANDLE_VALUE)
|
|
{
|
|
{
|
|
// 打开串口失败;
|
|
// 打开串口失败;
|
|
@@ -119,7 +126,7 @@ BOOL CSynSerial::ReOpenSerialPort()
|
|
ASSERT(_tcslen(m_szSerialPort));
|
|
ASSERT(_tcslen(m_szSerialPort));
|
|
CloseSerialPort();
|
|
CloseSerialPort();
|
|
|
|
|
|
- m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
|
|
|
|
|
|
+ m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
|
if (m_hSerialPort == INVALID_HANDLE_VALUE)
|
|
if (m_hSerialPort == INVALID_HANDLE_VALUE)
|
|
{
|
|
{
|
|
// 打开串口失败;
|
|
// 打开串口失败;
|
|
@@ -266,9 +273,25 @@ DWORD CSynSerial::WriteComm(IN BYTE * pWirteBuf, IN CONST INT32 nWriteSize)
|
|
ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);
|
|
ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);
|
|
// 写前,清空缓存区;
|
|
// 写前,清空缓存区;
|
|
PurgeComm(m_hSerialPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
|
|
PurgeComm(m_hSerialPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
|
|
- if ( !WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, NULL) )
|
|
|
|
|
|
+ if ( !WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, &m_wrOverlapped) )
|
|
{
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
DWORD dwError = GetLastError();
|
|
|
|
+ if ( ERROR_IO_PENDING == GetLastError() )
|
|
|
|
+ {
|
|
|
|
+ while(!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwBytesWritten, FALSE)){
|
|
|
|
+ dwError = GetLastError();
|
|
|
|
+ if ( ERROR_IO_PENDING == dwError || dwError == ERROR_IO_INCOMPLETE ) {
|
|
|
|
+ printf("等待\n");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ // 发生错误;
|
|
|
|
+ printf("发生错误:%d\n", dwError);
|
|
|
|
+ ClearCommError(m_hSerialPort, &dwError, NULL);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// 返回写入字节数;
|
|
// 返回写入字节数;
|
|
@@ -285,8 +308,10 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ DWORD dwError = 0;
|
|
DWORD dwBytesRead = 0;
|
|
DWORD dwBytesRead = 0;
|
|
DWORD dwErrorFlags = 0;
|
|
DWORD dwErrorFlags = 0;
|
|
|
|
+#if 0
|
|
// ReadFile前,使用ClearCommError清除错误;
|
|
// ReadFile前,使用ClearCommError清除错误;
|
|
COMSTAT ComStat = {0};
|
|
COMSTAT ComStat = {0};
|
|
DWORD dwLastLen = 0;
|
|
DWORD dwLastLen = 0;
|
|
@@ -320,6 +345,24 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
|
|
{
|
|
{
|
|
return (INT)dwBytesRead;
|
|
return (INT)dwBytesRead;
|
|
}
|
|
}
|
|
|
|
+#else
|
|
|
|
+ DWORD dwRealRead;
|
|
|
|
+ if ( !ClearCommError(m_hSerialPort, &dwError, NULL) ) {
|
|
|
|
+ PurgeComm(m_hSerialPort, PURGE_TXABORT|PURGE_TXCLEAR);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( !ReadFile(m_hSerialPort, pReadBuf, dwReadSize, &dwRealRead, &m_wrOverlapped) ) {
|
|
|
|
+ if ( GetLastError() == ERROR_IO_PENDING ) {
|
|
|
|
+ while(!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwRealRead, FALSE)){
|
|
|
|
+ dwError = GetLastError();
|
|
|
|
+ printf("\t 码值=%d, 长度=%d, 内容=%s \n\n", dwError, dwRealRead, pReadBuf);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pReadBuf[dwRealRead] = '\0';
|
|
|
|
+ printf("\t ======长度=%d, 内容=%s \n\n", dwRealRead, pReadBuf);
|
|
|
|
+#endif
|
|
|
|
|
|
return dwBytesRead;
|
|
return dwBytesRead;
|
|
}
|
|
}
|