rt,请各位大虾赐教。

解决方案 »

  1.   

    HANDLE hCom;void openComClose() 
    { if(hCom)
    {CloseHandle(hCom);
    hCom=NULL;
    return;
    }

    HANDLE hCommWatchThread ;//辅助线程的全局函数 

    hCom =CreateFile("COM4",GENERIC_READ | GENERIC_WRITE,
    0,// 此项必须为0 
    NULL,// no security attrs 
    OPEN_EXISTING,//设置产生方式 
    FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信 
    NULL ); 
    ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功 
    SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型 
    SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小 
    PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR 
    | PURGE_RXCLEAR ); //清干净输入、输出缓冲区 

    // COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构 
    // CommTimeOuts.
    // SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时 
    DCB dcb;// 定义数据控制块结构 
    GetCommState(hCom, &dcb ) ; //读串口原来的参数设置 
    dcb.BaudRate =CBR_9600; dcb.ByteSize =8; dcb.Parity = NOPARITY; 
    dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE; 
    BOOL ff=SetCommState(hCom, &dcb ) ; //串口参数配置 
    /*
    hCommWatchThread=CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性 
    0,//初始化线程栈的大小,缺省为与主线程大小相同 
    (LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局
    GetSafeHwnd(), //此处传入了主框架的句柄 
    0, &dwThreadID ); 
    ASSERT(hCommWatchThread!=NULL); 

    */

    //OVERLAPPED os;
    //DWORD dwEvtMask=0 ; 
    //SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视? 
    //WaitCommEvent( hCom, &dwEvtMask, &os );// 等待串口通信事件的发生
    }void read() 
    { OVERLAPPED osRead;
    memset(&osRead,0,sizeof(OVERLAPPED));
    COMSTAT ComStat; 
    DWORD dwLength, dwBytesRead;
    DWORD dwErrorFlags;
    osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    ::ClearCommError(hCom, &dwErrorFlags, &ComStat ) ; 
    dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据? 

    if(dwLength>0)
    {
    LPBYTE lpBuffer = new BYTE[dwLength];
    BOOL fReadStat;
    fReadStat = ReadFile( hCom,
    lpBuffer,
    dwLength, 
    &dwBytesRead,
    &osRead); //读数据  DWORD dwError;
    if (!fReadStat)

    dwError=GetLastError();
     if (GetLastError() == ERROR_IO_PENDING)
     { 
    while(!GetOverlappedResult(hCom, 
    &osRead, & dwBytesRead, TRUE ))

    dwError = GetLastError(); 
    if(dwError == ERROR_IO_INCOMPLETE) 
    continue; //缓冲区数据没有读完,继续 
    }
     }
    }
    delete[] lpBuffer;
    } void Write(LPBYTE buf)
    {
    fReadStat = WriteFile( hCom,
    buf,
    dwLength, 
    &dwBytesWrite,
    &osWrite); //读数据 
    }
      

  2.   

    to:netfyee(VC <VS> DELPHI)
    如果可行,立即揭贴。谢谢!