在波特率115200下、接收对方0.01秒间隔发送的数据(数据大约30字节),发现接收到的数据丢失的很厉害(只收到约30%多)。接收是如下方式的:
         HANDLE h = CreateEvent(NULL,TRUE,FALSE,NULL);
while (true)
{
memset(&o,0,sizeof(o));
o.hEvent = h;
if (WaitCommEvent(hComm, &flag, &o)) 
{
}
WaitForSingleObject(o.hEvent,INFINITE);   //5000
ClearCommError(hComm,&dwErr,&comstat);
size = comstat.cbInQue;
if (size == 0)
return 0;
if(!ReadFile(hComm,&data[index],size,&dw, &o))
{
GetOverlappedResult(hComm,&o,&dw,TRUE);
ResetEvent(o.hEvent);
CloseHandle(o.hEvent);
//index++;
}
else
index+=dw; //读到指定的内容
if (dw > 0) break;
ResetEvent(o.hEvent);
}
CloseHandle(o.hEvent);
因为发送方不是我写的,无法使用流控,请问大家有什么方法可以解决?

解决方案 »

  1.   

    一次接收一个字节最后再连起来.

    再读之前Sleep一下.
      

  2.   

    BOOL  bRead     = TRUE;  
    BOOL  bResult   = TRUE;
    DWORD dwError   = 0;
    DWORD BytesRead = 0;
    unsigned char RXBuff; //串口通讯设备文件读如数据存储缓冲单元。(一次只读一个字符) for(;;) //串口通讯设备读数据循环(死循环)

    //进入临界区。
    EnterCriticalSection(&port->m_csCommunicationSync);
    //ClearCommError()函数将修改COMSTAT结构和清除其他错误。
    bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
    //退出临界区。
    LeaveCriticalSection(&port->m_csCommunicationSync); //如果接收队列空,则退出读取(接收)数据循环。 
    if(comstat.cbInQue==0) break; //再次进入临界区。
    EnterCriticalSection(&port->m_csCommunicationSync);
    if(bRead)
    {
    //读串口通讯设备文件。
    bResult=ReadFile(port->m_hComm, //串口通讯设备文件句柄。 
     &RXBuff, //接收数据的缓冲区指针。
     1, //指定要从文件中读取的字节数。
     &BytesRead, //返回本次操作实际读入的字节数。
     &port->m_ov); // pointer to the m_ov structure
    if(!bResult) //读数据失败

    switch(dwError=GetLastError()) 
    { //根据读数据错误码进行处理。
    case ERROR_IO_PENDING: 

    // asynchronous i/o is still in progress 
    // Proceed on to GetOverlappedResults();
    bRead = FALSE;
    break;
    }
    default:
    {
    // Another error has occured.  Process this error.
    port->ProcessErrorMessage("ReadFile()");
    break;

    }
    }
    else //读数据正确。
    bRead = TRUE;
    } if(!bRead) //读数据不正确。
    {
    bRead=TRUE;
    //取得最后的操作错误结果。
    bResult=GetOverlappedResult(port->m_hComm, //串口通讯设备文件句柄。 
    &port->m_ov, // Overlapped 结构。
    &BytesRead, //返回该操作的字节数。
    TRUE);  //操作是否仍在进行中。
    //失败。
    if(!bResult) port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");
    }
    //离开临界区。
    LeaveCriticalSection(&port->m_csCommunicationSync); //向〈父窗口〉发送接收一个字符消息,   串口接收字符消息,接收的字符数据, 串口号。                        
    ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM)RXBuff, (LPARAM)port->m_nPortNr);
    }//结束死循环
    我这么写的。从来没有出过任何差错。与波特率关系不大。关键是代码不能有漏洞
      

  3.   

    目前我程序的接收速度大概是3.17 bytes/ms,如果对方发的速度超过这,就会丢失数据了。 大家看能从什么方面再提高一点吗?感谢。
      

  4.   

    我最近刚做的一个程序,串口通信,115200的波特率,间隔0.015秒发送数据(一次最大256bytes),起初也有丢失数据,后来换了一条串口线就好了,你看看是否也有同样问题
      

  5.   

    忘了说了,我用的是微软的串口通信控件mscomm
      

  6.   

    有没有试过CSerialPort类,你上网去找找,找不到的话留个mail,我发给你