在异步方式的串口通信中,调用WriteFile的操作后,执行GetOverlappedResult(hComm, &m_ov, &nBytesSent, TRUE)。但是当每次发送的字节数超过几十个字节时,每次得到的nBytesSent都为4,并且函数的返回值为TRUE, 根据MSDN上的说明:当GetOverlappedResult传入TRUE时,应该把数据发送完才返回呀! 不解,请赐教!!!!

解决方案 »

  1.   

    我也是新手,不过把书上的一段话让你看看:如果规定了读/写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的。因此在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。
      

  2.   

    我的WriteFile做的是异步操作,应该没有超时的概念吧?代码结构是这样:
    WriteFile(); //返回FLASH
    dwError = GetLastError();
    if (ERROR_IO_PENDING == dwError)
    {
       GetOverlappedResult();
    }
      

  3.   

    超时是在COMMTIMEOUTS结构体中设置的,包括读超时和写超时
    commtimeouts.ReadIntervalTimeout         = 100;//读数据超时(当100毫秒内没有数据到达串口时串口置overlappedRead.hEvent为有信号)
    commtimeouts.ReadTotalTimeoutMultiplier  = 0;
    commtimeouts.ReadTotalTimeoutConstant    = 0;
    commtimeouts.WriteTotalTimeoutMultiplier = 0;
    commtimeouts.WriteTotalTimeoutConstant   = 0;
    而不是在WriteFile里设置读写超时的.
    你上面的情况我也遇到过.一般我都是通过循环来控制
    nBytesToSent(需要发送字节数),nBytesSend(已经发送字节数)这两个变量.
    循环条件为while(nBytesToSent>nBytesSend)
    每次GetOverlappedResult后nBytesToSend = nBytesToSend - nBytesSend;
    nBytesSend = 0;