我现在对一个串口进行读写,串口连着GSM模块,当收数据时,有时是收到数据的
一半就返回,不能保证收完数据之才返回,这是为什么?

解决方案 »

  1.   

    是这样的: 
      我采用的是API函数,代码如下,
       1>. 可是我ReadFile 返回的数据不能保证是完整的: 如,本来要收到的数据是"+CMTI: "SM", 11", 可有时分两次才能收到这数据,第一次收到的是"+CMTI:", 第二次收到的"SM", 11"请问这是怎么回事,我怎样才能确保一次收到完整的数据?
       2>. ReadFile返回的值怎么总是为 TRUE ,如果出现上面请况,相当于没有收完数据,应该返回为FALSE 的, 这又是为什么? 
      打开方式:
    hCom=CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
    NULL);
    UINT CommProc(LPVOID pParam)
    {
        OVERLAPPED os;
        DWORD dwMask;
        DWORD dwErrorFlags;    memset(&os, 0, sizeof(OVERLAPPED));
        os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
        if(os.hEvent==NULL)
        {
      return (UINT)-1;
         }
         while(bConnected)
         {
    dwMask=0;
    WaitCommEvent( hCom, &dwMask, &os);

    if( (dwMask & EV_RXCHAR ) == EV_RXCHAR)// 缓冲区中有数据到达
    {
        COMSTAT ComStat;
        ClearCommError( hCom, &dwErrorFlags, &ComStat ); 
        if( ComStat.cbInQue > 0) //输入缓冲区有多少数据?
        {
    char buf[MAXBLOCK] = "";
    DWORD length = 0;
    BOOL bReadStat ; 
    bReadStat = ReadFile( hCom, buf, MAXBLOCK, &length, &pComEntry->osRead); //读数据
    if (!bReadStat)
    {
           if (GetLastError() == ERROR_IO_PENDING)
        {
    while( !GetOverlappedResult( hCom, &os, &length, TRUE))
    {
        DWORD dwError = GetLastError();
        if( dwError == ERROR_IO_INCOMPLETE) 
            continue;  // 缓冲区数据没有读完,继续
         //分析收到的数据
           InfoProcess( buf );
     }
          }
    }
    else
    {
        InfoProcess( pComEntry, buf );
    }
         }
             }
        }
        CloseHandle(os.hEvent);
        return 0;
    }
    感谢 关心这个问题的所有朋友, 谢谢 !