可能是你的程序有问题,没有细看你的程序,但是WriteFile是可以在2000下很好的运行。

解决方案 »

  1.   

    writefile应该是没错的,查查其他的错,2000下对句柄的检查比98更严格
      

  2.   

    兄弟,串口通讯在2000/NT下CreateFile()一定要设置OVERLAPPED结构呀
      

  3.   

    如果在CreateFile()指定了OVERLAPPED结构,那WriteFile也应该指定OVERLAPPED
    但却NULL,肯定不行的(特别在win2000/NT下)
    我以前也碰到同样的问题,开始在98下没有考虑OVERLAPPED结构,能正确发送和接收,但在2000下,就无办法通过,后来仔细一看CSDN才醒悟过来最好,把CreateFile()的代码也拿来看看如果指定了OVERLAPPED结构,就要用GetLastError()来确定操作的结果
    请看:void CSerialPort::WriteChar()
    {
    // 将m_szWriteBuff里的字符发送到输入缓冲区
    BOOL bWrite=TRUE; // 
    BOOL bResult=TRUE; // 函数操作情况 DWORD BytesSend=0; // 发送字节数
    DWORD dwError=0;

    ResetEvent(m_hWriteEvents); EnterCriticalSection(&m_csCommunicationSync); if (bWrite)
    {
    // 初始化异步结构:进行端口操作时这两个参数被忽略
    m_ov.Offset=0;
    m_ov.OffsetHigh=0; // 清空缓冲区
    // PURGE_TXABORT: 既使发送操作没有完成,也终止所有的重叠发送操作,立即返回
    // PURGE_RXABORT: 既使接收操作没有完成,也终止所有的重叠发送操作,立即返回
    // PRUGE_TXCLEAR: 清除发送缓冲区
    // PRUGE_RXCLEAR: 清除接收缓冲区
    PurgeComm(m_hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); bResult = WriteFile(m_hCom,
    m_szWriteBuff,
    strlen((char*)m_szWriteBuff),
    &BytesSend,
    &m_ov
    );
    if (!bResult)
    {  //出错
    switch(dwError = GetLastError())
    {
    case ERROR_IO_PENDING:
    {
    BytesSend=0;
    bWrite=FALSE;
    break;
    }
    default:
    {
    ProcessErrorMsg("WriteFile()");
    break;
    }
    } //end switch(dwError == GetLastError())
    }
    else
    {
    LeaveCriticalSection(&m_csCommunicationSync);
    }
    } // end if (bWrite) if (!bWrite)
    {
    bWrite=true; bResult=GetOverlappedResult(m_hCom,
    &m_ov,
    &BytesSend,
    true); LeaveCriticalSection(&m_csCommunicationSync); if (!bResult)
    {
    ProcessErrorMsg("GetOverlappedResutl()");
    }
    } // end if (!bWrite) if (BytesSend != strlen((char*)m_szWriteBuff))
    {
    TRACE("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSend, strlen((char*)m_szWriteBuff));
    }
    }希望对你有帮助。
      

  4.   

    OVERLAPPED overlapped; //OVERLAPPED structure
    OVERLAPPED overlappedwrite;
    OVERLAPPED overlappedread;overlapped.Internal=0;
    overlapped.InternalHigh=0;
    overlapped.Offset=0;
    overlapped.OffsetHigh=0;
    overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //这个很重要,不信你可以注释掉,看看结果会怎样。FHandle = CreateFile(
                                    PortName,
                                    GENERIC_READ || GENERIC_WRITE,
                                    0, // Not shared
                                    NULL, // No security attributes
                                    OPEN_EXISTING,
                                    FILE_FLAG_OVERLAPPED||FILE_ATTRIBUTE_NORMAL ,
                                    0
                                  );.........overlappedwrite.Internal=0;
    overlappedwrite.InternalHigh=0;
    overlappedwrite.Offset=0;
    overlappedwrite.OffsetHigh=0;
    overlappedwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    //这个很重要,不信你可以注释掉,看看结果会怎样。WriteFile( FHandle,&csp,dwDataSize,&nSent, &overlappedwrite);
    {
       error=GetLastError();
       if (error==ERROR_IO_PENDING)//写成功
       {
    //以下是读,可不管
           GetOverlappedResult(com_handle,&overlappedwrite,&dwNumBytesWritten,TRUE);
           overlappedread.Internal=0;
           overlappedread.InternalHigh=0;
           overlappedread.Offset=0; overlappedread.OffsetHigh=0; overlappedread.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
    COMSTAT comstat;
    DWORD dwLength;
    DWORD dwError;
    DWORD dwEvtMask=0;
    BOOL serive=TRUE;
    Sleep(delaytime);
    while (serive)
    {
    WaitCommEvent(com_handle,&dwEvtMask,&overlappedread);
    ClearCommError(com_handle,&dwError,&comstat);
    dwLength=comstat.cbInQue;
    if (dwLength<1)
    {
               break;
    }
    BOOL fReadStat=FALSE;
    memset(Bytes,0,sizeof(dwLength));
    fReadStat=::ReadFile(com_handle,&Bytes,dwLength,&dwBytesTransferred,&overlappedread);
      }
    }系统是win2000
    //一定要考虑OVERLAPPED,不然没法做。
      

  5.   

    qiuanhong(练从难处练,用从易处用) :
    大哥,“系统是win2000一定要考虑OVERLAPPED,不然没法做。”真的这样吗?
    我因为比较讨厌OVERLAPPED时的WriteFile的操作才没有使用OVERLAPPED的方式来操作。
    这下我惨了,还是得用这个讨厌的东西!
    不过真的很感谢你。
      

  6.   

    做好了,别忘了再来这里跟贴,大家学习学习!!!!!
    呵呵~~~~fei