DWORD WINAPI CommWatchProc1(LPVOID lpParameter)
{
while(m_bCom1Open==true)
{
DWORD dwBytesRead=1024;
DWORD dwEvtMask=0;
OVERLAPPED READ_OS;
//存储读到的数据
char lpInBuffer[1024];
COMSTAT ComStat; 
DWORD dwErrorFlags;
//保存串口数据的长度
DWORD dwLength;
SetCommMask( hCom1, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
WaitCommEvent( hCom1, &dwEvtMask, 0 );// 等待串口通信事件的发生
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
::ClearCommError(hCom1,&dwErrorFlags,&ComStat);
dwLength=ComStat.cbInQue; //输入缓冲区有多少数据?
    if (dwLength> 0) 
{
BOOL fReadStat;
dwBytesRead=min(dwBytesRead,dwLength);
fReadStat=ReadFile(hCom1,lpInBuffer,dwLength,&dwBytesRead,&READ_OS);
if (!fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(hCom1,&READ_OS,&dwBytesRead,TRUE);

}
} }
}
} return 0;
}检测得到写入串口数据的长度,但是没法写进lpInBuffer,希望有人能解

解决方案 »

  1.   

    SetCommMask串口设置不应该放在这里吧
      

  2.   

    要吧,不然你怎么知道等待那些消息呢,那个ReadFile 的返回类型是false,我不知道是那种问题
      

  3.   

    使用READ_OS前要memset(&READ_OS,0,sizeof(OVERLAPPED));
      

  4.   

    当读取不成功时,是不是要用一个循环等待一下,直到读取完成呢?
    BOOL f;
    f = ReadFile(p->m_hCom,buffer,comState.cbInQue,&data,&over);
    if(!f)
    {
    BOOL m;
    m = GetOverlappedResult(p->m_hCom,&over,&written,true);
    while(!m)
    {
    if(GetLastError() == ERROR_IO_PENDING)
    {
    m = GetOverlappedResult(p->m_hCom,&over,&written,true);
    }
    }

    }