64,637
社区成员
发帖
与我相关
我的任务
分享
int CMsComm::ReadData(unsigned char *lpBuf, DWORD *dwToRec)
{
int returnValue=0;//返回值
DWORD dwRead;
DWORD dwRes;
//错误标志
COMSTAT ComStat;
//错误
DWORD dwErrorFlags;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
//读之前清除缓冲区
//清除错误
ClearCommError(m_hComm,&dwErrorFlags,&ComStat);
//if(ClearCommError(m_hComm,&dwErrorFlags,&ComStat) || dwErrorFlags !=0)
//{
// //清空缓冲区
// PurgeComm(m_hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
// //return -1;
//}
//创建一个事件
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL)
{
AfxMessageBox(_T("创建事件失败!!!"));
}
//如果并没有阻塞在读上面,那么执行以下代码
if (!fWaitingOnRead)
{
//从串口中读入数据
BOOL bk = ReadFile(m_hComm,lpBuf,*dwToRec,&dwRead,&osReader);
//如果读取不成功
if(!bk)
{
//如果读入不成功是因为阻塞了
if(GetLastError() == ERROR_IO_PENDING)
{
//fWaitingOnRead = TRUE;
dwRes = WaitForSingleObject(osReader.hEvent,INFINITE);
switch (dwRes)
{
case WAIT_OBJECT_0:
{
if (!GetOverlappedResult(m_hComm, &osReader, &dwRead, TRUE))
{
AfxMessageBox(_T("读数据产生错误!!!"));
returnValue = 1;
}
else
{
// AfxMessageBox(_T("读数据成功!!!");
returnValue = 0;
*dwToRec = dwRead;
}
break;
}
//读写超时
case WAIT_TIMEOUT:
{
AfxMessageBox(_T("读超时!!"));
returnValue = 2;
}
break;
default:
{
AfxMessageBox(_T("出现不可预知错误!!!"));
returnValue = 3;
}
break;
}
}
}
}
//返回读入的字节
CloseHandle(osReader.hEvent);
//清空缓冲区
PurgeComm(m_hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
*dwToRec = dwRead;
return returnValue;
}
//设置串行口的输入和输出缓冲区的大小
SetupComm(m_hComm,1024,1024);
//从串口中读入数据
BOOL bk = ReadFile(m_hComm,lpBuf,*dwToRec,&dwRead,&osReader);
这里,既然读取数据不完全,那么我用了一个蠢办法
在这句话之后,加个判定
while(读取数据不完全)
ReadFile(......) // 再读取一次
//循环读取,一直到
if(读取数据==我想要的数据)
break;//跳出循环
//继续其他操作...