我编了一个函数,在接收数据时,comstat.cbinQue有数据,但是ReadFile()没执行,每次读到的数都是0。请各位帮忙看看,这件事比较急,做不出来老师会k我的。
BOOL CComserialApp::OnEditStart() 
{
// TODO: Add your command handler code here
DCB dcb;
//打开串口,得到串口句柄
hCOM=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,              0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(hCOM==INVALID_HANDLE_VALUE)
return false; //初始化串口,READBUFFER,WRITEBUFFER是用户自己定义的
SetupComm(hCOM,1024,1024);
PurgeComm(hCOM,PURGE_TXCLEAR|PURGE_RXCLEAR); //设置DCB参数
if(!GetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
    //设置超时值
COMMTIMEOUTS to;
to.ReadIntervalTimeout=MAXDWORD;
to.ReadTotalTimeoutConstant=0;
to.ReadTotalTimeoutMultiplier=0;
to.WriteTotalTimeoutConstant=0;
to.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(hCOM,&to))
{
CloseHandle(hCOM);
return false;
}
     //用事件驱动方式需设置事件代码
if(!SetCommMask(hCOM,EV_RXCHAR))
{
CloseHandle(hCOM);
return false;
}
              //等待事件触发
                DWORD dwEvent,dwError;
                DWORD nRealRead,i;
OVERLAPPED overlapped;
               dwEvent=dwError=0;
              if(WaitCommEvent(hCOM,&dwEvent,&overlapped))
{

  ClearCommError(hCOM,&dwError,&comstat);
  if((dwEvent&&EV_RXCHAR)&&comstat.cbInQue)   
      ReadFile    (hCOM,inBuffer,comstat.cbInQue,&nRealRead,NULL);
                 }

解决方案 »

  1.   

    WaitCommEvent(hCOM,&dwEvent,&overlapped) 可能会返回false 的
    这个时候需要根据 getlasterror的返回情况进行处理的
      

  2.   

    GetCommEvent 获取消息的精确信息
      

  3.   

    我已经执行到了ReadFile这一步,执行之后inBuffer为空,nRealRead为0
      

  4.   

    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;
    }
      

  5.   

    原来的程序不用了,现在要用mscomm控件编写,可是它传输好像只能是字符串啊,怎样才能是按二进制字节传输呢?也是用SetOutput吗?它的参数定义好像是VARIANT吧
      

  6.   

    我建议不要用mscomm控件,用API是很简单的。
    我决得可以用READFILE一个一个字节的读,而不是一次读一大
    段,你就应该自己知道所受到的缓冲大小。
    把READFILE放在一个WHILE(1)的循环中,
    unsigned inbuff0[1];
    unsigned inbuff[number];
    DWORD len = 1;int ix = 0;
    while(1)
    {
       readfile(hCOM,inbuff0,len,&len,null);
       inbuff[ix] = inbuff[0];
       if(ix++==number)break;
    }当然最好另开一个线程读数据。
    你写的一大段代码都可砍掉。
    设置通讯事件,等待通讯事件,超时,通通砍掉!
      

  7.   

    unsigned inbuff[number];
    number 是你应要接受的数据大小
    inbuff也应动态分配。
      

  8.   

    unsigned inbuff[number];
    number 是你应要接受的数据大小
    inbuff也应动态分配。
      

  9.   

    不要把API全改了,MSCOMM控件可以和api一起使用的