打开串口时使用FILE_FLAG_OVERLAPPED。在发送一串数据后必须立即将波特率改掉。但是WriteFile似乎只把数据发到缓冲(用PurgeComm也没用)。我如果在WriteFile之后立即修改波特率,则发送缓冲区内容会被清调,而对方也没有受到完整数据。所以需要知道缓冲区的数据已经发出我才能修改波特率。请问怎么办?

解决方案 »

  1.   

    判断缓冲区是EV_TXEMPTY事件,但是似乎数据发出后很久才启动此事件(有可能新的接收数据进来时)
      

  2.   

    使用单独一个线程处理串口通讯,在线程里面WaitCommEvent。
      

  3.   

    WriteFile后用FlushFileBuffers()来强制刷新缓冲区
      

  4.   

    用线程操作。
    例如,用重叠I/O打开文件,
    然后在线程中用例如 
    OVERLAPPED o;
    o.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    WriteFile(hCom,lpBuff,dwSizetoWrite,&dwWrite,&o);
    if( WaitForSingleObject(o.hEvent,2000) == WAIT_OBJECT_0) // 写返回
    {
       DWORD dwRes = GetOverlappedResult(hCom,&o,&dwFinalWrite,FALSE);
       if( dwRes )
        {
         //写完成,
         } 
     }//返回