char * sendstring="hello world!";
    char readstring[100];
    unsigned long int len,fact_len,fact_send_len;
    DCB dcb;
    HANDLE hCom;
     COMMTIMEOUTS timeout;
     OVERLAPPED Write_OverLapped,Read_OverLapped;
     len=fact_len=fact_send_len=0;
  hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    if( hCom == INVALID_HANDLE_VALUE )
    {
        ShowMessage( "串口打开失败" );
    }
    else
    {
            GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
            dcb.BaudRate=9600;
            dcb.ByteSize=8;
            dcb.Parity = NOPARITY;
            dcb.StopBits=ONESTOPBIT;
            if(SetCommState(hCom,&dcb))
                    ShowMessage("OK");            SetupComm(hCom,1024,1024);
            timeout.ReadIntervalTimeout=20;
            timeout.ReadTotalTimeoutMultiplier=1000;
            timeout.ReadTotalTimeoutConstant=1000;
            timeout.WriteTotalTimeoutMultiplier=1000;
            timeout.WriteTotalTimeoutConstant=1000;
           SetCommTimeouts(hCom,&timeout);
            PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区
            len=strlen(sendstring);       bool fWriteState=WriteFile(hCom,sendstring,len,&fact_len,&Write_OverLapped);
             if (!fWriteState) {
                                  while(!GetOverlappedResult(hCom,&Write_OverLapped,&fact_send_len,true))
                                                      continue;
                               }
              
               if(Write_OverLapped.hEvent!=NULL)
                        ShowMessage("发送完");
         
    }      CloseHandle(hCom);  
------------------------
fact_send_len始终为0. 
请问有什么错误?不要多线程.

解决方案 »

  1.   

    你的write_overlapped 要初始化,并且要赋一个信号量给它,
    MemorySet(&write_overlapped,sizeof(write_overlapped);
    HANLE hEvent = CreateEvent(NULL, FALSE, FALSE,"");
    write_overlapped.hEvent = hEvent;
    就可以了,呵呵,我也正在做这个,也是这个问题.
      

  2.   

    bool CCommDlg::WriteCommBlock(LPVOID lpstr, DWORD dwBytesToWrite)
    {
    DWORD dwBytesWritten, dwBytesSent = 0;
    OVERLAPPED os; memset(&os, 0, sizeof(os));
    os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if(!WriteFile(m_hComm, lpstr, dwBytesToWrite,
    &dwBytesWritten, &os)) {
    if(GetLastError() == ERROR_IO_PENDING) {
    while(!GetOverlappedResult(m_hComm, &os, &dwBytesWritten, TRUE)) {
    if(GetLastError() == ERROR_IO_INCOMPLETE) {
    dwBytesSent += dwBytesWritten;
    continue;
    }
    else {
    ShowError();
    break;
    }
    }
    dwBytesSent += dwBytesWritten;
    if(dwBytesSent != dwBytesToWrite) {
    CloseHandle(os.hEvent);
    return false;
    }
    } else { //不是ERROR_IO_PENDING,出错
    ShowError();
    CloseHandle(os.hEvent);
    return false;
    }
    } CloseHandle(os.hEvent);
    return true;
    }
      

  3.   

    多谢二位!可以发送啦!可是却无法读出数据来!
    if(Write_OverLapped.hEvent!=NULL)
                   //发送完
                   {
                     Read_OverLapped.hEvent=CreateEvent(NULL,true,NULL,NULL);
                     ReadFile(hCom,readstring,100,&fact_len,&Read_OverLapped);
                     while(!GetOverlappedResult(hCom,&Read_OverLapped,&fact_read_len,true))
                        continue;               }