// 写函数
int CRead_MaterDlg::WriteCom(DWORD m_length)
{
COMSTAT ComStat;
DWORD dwBytesSent=0;
DWORD dwErrorFlags;
DWORD dwBytesWrite;
DWORD dwError=0;
OVERLAPPED Write_Os;
Write_Os.Offset=0;
Write_Os.OffsetHigh=0;
Write_Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD fWriteStat;
fWriteStat = WriteFile(hCom,lpSendBuffer,m_length,&dwBytesWrite,&Write_Os);
if (!fWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&Write_Os,
&dwBytesWrite,TRUE))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
dwBytesSent+=dwBytesWrite;
continue;
}
else
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
break;
}
}
dwBytesSent+=dwBytesWrite;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
}
else
dwBytesSent+=dwBytesWrite;
CloseHandle(Write_Os.hEvent);
return dwBytesSent;
}// 读串口数据函数
int CRead_MaterDlg::readcom()
{
ASSERT(hCom);
// 缓冲区中有数据到达
COMSTAT ComStat;
DWORD dwLength;
DWORD dwErrorFlags;
DWORD dwBytesRead=0;
DWORD dwError=0;
OVERLAPPED Read_Os;
Read_Os.Offset=0;
Read_Os.OffsetHigh=0;
Read_Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
// 输入缓冲区有多少数据?
dwLength = ComStat.cbInQue;
if(dwLength > 0)
{
DWORD fReadStat;
//读数据
fReadStat = ReadFile(hCom,lpRecieveBuffer,dwLength,
&dwLength,&Read_Os);
if (!fReadStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&Read_Os,
&dwLength,TRUE))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
dwBytesRead+=dwLength;
continue;
}
else
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
break;
}
}
dwBytesRead+=dwLength;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
}
else
dwBytesRead+=dwLength;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
CloseHandle(Read_Os.hEvent);
return dwBytesRead;
}
// 线程过程
UINT CRead_MaterDlg::CommWatchProc(LPVOID pParam)
{
DWORD dwEvtMask=0;
DWORD mError;
DWORD mwaitflags;
OVERLAPPED Os;
Os.Offset=0;
Os.OffsetHigh=0;
Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
// 等待串口通信事件的发生
while(ThreadStop)
{
mwaitflags=WaitCommEvent(hCom,&dwEvtMask,&Os);
mError=GetLastError();
if(mError==ERROR_IO_PENDING)
mwaitflags=(WaitForSingleObject(Os.hEvent,0)
==WAIT_OBJECT_0);
if(mwaitflags>0)
ResetEvent(Os.hEvent);
}
CloseHandle(Os.hEvent);
PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
return 1;
}
线程我是在初始化时创建的(afxbeginthread());为何我写后,再读老是慢一拍呢????
读
this->WriteCom();
Sleep(100);
this->readcom();
为何啊!请多多指教。还有怎么能把cstring类型转换为float类型呢??多谢!!
int CRead_MaterDlg::WriteCom(DWORD m_length)
{
COMSTAT ComStat;
DWORD dwBytesSent=0;
DWORD dwErrorFlags;
DWORD dwBytesWrite;
DWORD dwError=0;
OVERLAPPED Write_Os;
Write_Os.Offset=0;
Write_Os.OffsetHigh=0;
Write_Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD fWriteStat;
fWriteStat = WriteFile(hCom,lpSendBuffer,m_length,&dwBytesWrite,&Write_Os);
if (!fWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&Write_Os,
&dwBytesWrite,TRUE))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
dwBytesSent+=dwBytesWrite;
continue;
}
else
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
break;
}
}
dwBytesSent+=dwBytesWrite;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
}
else
dwBytesSent+=dwBytesWrite;
CloseHandle(Write_Os.hEvent);
return dwBytesSent;
}// 读串口数据函数
int CRead_MaterDlg::readcom()
{
ASSERT(hCom);
// 缓冲区中有数据到达
COMSTAT ComStat;
DWORD dwLength;
DWORD dwErrorFlags;
DWORD dwBytesRead=0;
DWORD dwError=0;
OVERLAPPED Read_Os;
Read_Os.Offset=0;
Read_Os.OffsetHigh=0;
Read_Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
// 输入缓冲区有多少数据?
dwLength = ComStat.cbInQue;
if(dwLength > 0)
{
DWORD fReadStat;
//读数据
fReadStat = ReadFile(hCom,lpRecieveBuffer,dwLength,
&dwLength,&Read_Os);
if (!fReadStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&Read_Os,
&dwLength,TRUE))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
dwBytesRead+=dwLength;
continue;
}
else
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
break;
}
}
dwBytesRead+=dwLength;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
}
else
dwBytesRead+=dwLength;
}
else
ClearCommError(hCom,&dwErrorFlags,&ComStat);
CloseHandle(Read_Os.hEvent);
return dwBytesRead;
}
// 线程过程
UINT CRead_MaterDlg::CommWatchProc(LPVOID pParam)
{
DWORD dwEvtMask=0;
DWORD mError;
DWORD mwaitflags;
OVERLAPPED Os;
Os.Offset=0;
Os.OffsetHigh=0;
Os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
// 等待串口通信事件的发生
while(ThreadStop)
{
mwaitflags=WaitCommEvent(hCom,&dwEvtMask,&Os);
mError=GetLastError();
if(mError==ERROR_IO_PENDING)
mwaitflags=(WaitForSingleObject(Os.hEvent,0)
==WAIT_OBJECT_0);
if(mwaitflags>0)
ResetEvent(Os.hEvent);
}
CloseHandle(Os.hEvent);
PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
return 1;
}
线程我是在初始化时创建的(afxbeginthread());为何我写后,再读老是慢一拍呢????
读
this->WriteCom();
Sleep(100);
this->readcom();
为何啊!请多多指教。还有怎么能把cstring类型转换为float类型呢??多谢!!
{ CSerialPort *port = (CSerialPort*)pParam;
port->m_bThreadAlive = TRUE;
DWORD BytesTransfered = 0;
DWORD Event = 0;
DWORD CommEvent = 0;
DWORD dwError = 0;
COMSTAT comstat;
BOOL bResult = TRUE;
DWORD ByteRead;
if (port->m_hComm) // check if the port is opened
PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); for (;;)
{ bResult = WaitCommEvent(port->m_hComm, &CommEvent, &port->m_ov); if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_IO_PENDING:
{
break;
}
case 87:
{
// Under Windows NT, this value is returned for some reason.
// I have not investigated why, but it is also a valid reply
// Also do nothing and continue.
break;
}
default:
{
port->ProcessErrorMessage("WaitCommEvent()");
break;
}
}
}
else
{
bResult = ClearCommError(port->m_hComm, &dwError, &comstat); if (comstat.cbInQue == 0)
continue;
} // end if bResult // Main wait function. This function will normally block the thread
// until one of nine events occur that require action.
Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE); switch (Event)
{
case 0://exit
{
}
case 1://// read event
{
}
case 2: // write event
{
WriteChar(port);
break;
} } // end switch } // close forever loop return 0;
}