//
发送
void C_ControlMatrix::SendData(BYTE data)
{
DWORD dwError;
DWORD dwRealSend = 0;
//WaitForSingleObject
(m_HMutex,INFINITE);
if
(ClearCommError(m_HCom,&dwError,NULL))
{
PurgeComm(m_HCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
//
清干净输入、输出缓冲区
}
if
(!WriteFile(m_HCom,(VOID*)&data,1,&dwRealSend,&m_WriteOverlapped))
{
if
(GetLastError() == ERROR_IO_PENDING)
{
while
(!GetOverlappedResult(m_HCom,&m_WriteOverlapped,&dwRealSend,FALSE))
{
if
(GetLastError() == ERROR_IO_INCOMPLETE)
{
//cout
<<
"写未完成,继续!"
<
continue
;
}
else
{
//cout
<<
"发生错误,尝试恢复!"
<
ClearCommError(m_HCom,&dwError,NULL);
break
;
}
}
}
}
//ReleaseMutex
(m_HMutex);
}
//
接收
int C_ControlMatrix::RecveData(char* pReadBuf)
{
OVERLAPPED os;
DWORD dwError;
DWORD dwErrorFlags;
DWORD dwCommStatus=0;
DWORD dwWantRead = CHANNELCOUNT_16;
DWORD dwRealRead = 0;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if
(os.hEvent==NULL)
{
return
-1;
}
//WaitForSingleObject
(m_HMutex,INFINITE);
if
(m_HCom!=NULL)
{
SetCommMask(m_HCom,EV_RXCHAR|EV_TXEMPTY);
//
有哪些串口事件需要监视
WaitCommEvent(m_HCom,&dwCommStatus,&os);
//
检测返回的dwCommStatus,了解发生了什么串口事件
if
((dwCommStatus & EV_RXCHAR)==EV_RXCHAR)
//
缓冲区中有数据到达
{
COMSTAT ComStat;
DWORD dwLength=0;
ClearCommError(m_HCom,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue;
//
输入缓冲区有多少数据
if
(dwLength>0)
{
BOOL fReadStat;
fReadStat=ReadFile(m_HCom,pReadBuf,dwWantRead,&dwRealRead,&m_ReadOverLapped);
pReadBuf[dwRealRead]=
'\0'
;
if
(!fReadStat)
{
if
(GetLastError()==ERROR_IO_PENDING)
{
while
(!GetOverlappedResult(m_HCom,&m_ReadOverLapped,&dwRealRead,TRUE))
{
dwError = GetLastError();
if
(dwError==ERROR_IO_INCOMPLETE)
{
continue
;
}
}
}
}
}
//ReleaseMutex
(m_HMutex);
CloseHandle(os.hEvent);
return
dwRealRead;
}
}
//ReleaseMutex
(m_HMutex);
CloseHandle(os.hEvent);
return
0;
}