readfile 有兩種讀取模式, 一種是阻塞型的, 實現比較簡單, 但要做到線程中;
一種是非阻塞的;我估計你是使用了 阻塞的通信方式

解决方案 »

  1.   

    to aiirii(ari-爱的眼睛) ( )public byte[] Read(int NumBytes) 
    {
    byte[] BufBytes;
    byte[] OutBytes;
    BufBytes = new byte[NumBytes];
    if (hComm!=INVALID_HANDLE_VALUE) 
    {
    OVERLAPPED ovlCommPort = new OVERLAPPED();
    int BytesRead=0;
    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);

    OutBytes = new byte[BytesRead];
    Array.Copy(BufBytes,OutBytes,BytesRead);

    else 
    {
    throw(new ApplicationException("串口未打开!")); }
    return OutBytes;
    }就是这段代码!
    怎么区分阻塞与非阻塞呢?
    如果是阻塞的话当我运行串口精灵程序以后怎么再用这段代码没有问题呢?
      

  2.   

    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
    ->
    ReadFile(hComm,ref BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);试试
      

  3.   

    to  The123(铁拳 2004)
    还是不行啊!运行到readfile就停住了,这是咋回事呢?
      

  4.   

    public int  Open()
    {

    DCB dcbCommPort = new DCB();
    COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
       
    // 打开串口 OPEN THE COMM PORT.
    hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
    // 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
    if(hComm == INVALID_HANDLE_VALUE) 
    {
                        throw(new ApplicationException("非法操作,不能打开串口!"));
    }

    // 设置通信超时时间 SET THE COMM TIMEOUTS.
    GetCommTimeouts(hComm,ref ctoCommPort);
    ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
    ctoCommPort.ReadTotalTimeoutMultiplier = 0;
    ctoCommPort.WriteTotalTimeoutMultiplier = 0;
    ctoCommPort.WriteTotalTimeoutConstant = 0;  
    SetCommTimeouts(hComm,ref ctoCommPort);

    // 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
    GetCommState(hComm, ref dcbCommPort);
    dcbCommPort.BaudRate=BaudRate;
    dcbCommPort.flags=0;
    //dcb.fBinary=1;
    dcbCommPort.flags|=1;
    if (Parity>0)
    {
    //dcb.fParity=1
    dcbCommPort.flags|=2;
    }
    dcbCommPort.Parity=Parity;
    dcbCommPort.ByteSize=ByteSize;
    dcbCommPort.StopBits=StopBits;
    if (!SetCommState(hComm, ref dcbCommPort))
    {
    //uint ErrorNum=GetLastError();
                             throw(new ApplicationException("非法操作,不能打开串口!"));
    }
    //unre to see if setting took correctly
    //DCB dcbCommPort2 = new DCB();
    //GetCommState(hComm, ref dcbCommPort2);
    Opened = true;
    return CClassConst.MM_COMMUNICATION_SUCESS;
    }俺是这样定义的
      

  5.   

    help!不然国庆也没法休息呀,呜呜
      

  6.   

    看你的代碼, CreateFile 是用阻塞的方式通信的, 所以, 會停止在那里, 具體看看MSDN中 createfile 的幫助
      

  7.   

    try
    hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
    ->
    hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE, 0,OPEN_EXISTING,0,0);
      

  8.   

    哦,readfilehComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
    ->
    hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 0,OPEN_EXISTING,0,0);
      

  9.   

    还是不行呢?
    奇怪的是,就算是用阻塞方式的话,当我用WizPort.exe这样的串口程序运行以后再使用这段代码就没有问题呢?
    真是奇怪!奇怪!
      

  10.   

    hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 0,OPEN_ALWAYS,0,0);
      

  11.   

    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/fileio/base/createfile.htm自己慢慢试
      

  12.   

    在我重启机器以后,运行WizPort.exe前,我creatfile生成的返回值为0x9b0
    运行WizPort.exe后,creatfile返回值为0x9b4这有什么关系吗?