关于串口数据读取丢失问题
我向一个串口对象发送了一个指定,串口对象返回了相关的数据(通过监控窗口看到数据完整返回了),但是在读取串口对象时,无法读完正确的数据,在读到部分数据之后(多次循环调用input方法后),select调用返回0,说没设备准备就绪,请问是什么问题,应该怎么做,才能保证读到完整的数据? 
 以下是专门读取串口数据的函数 
 int   CSerial::input   (char   *   data,   int   datalength) 
 { 
             int   retval   =   0;               
             FD_ZERO   (&fs_read);               //用0初始化文件描述符集 
             FD_SET   (fd,   &fs_read);      //将串口对象加入文件描述符集中 
             tv_timeout.tv_sec   =   TIMEOUT_SEC   (datalength,   GetBaudrate   ()); 
             tv_timeout.tv_usec   =   TIMEOUT_USEC;               
             //通过select监控指定的文件描述符 
             retval   =   select   (fd   +   1,   &fs_read,   NULL,   NULL,   &tv_timeout); 
             printf( "CSerial::input.      select   return   %d\n ",retval); 
             if   (retval)   { 
                         retval   =   read   (fd,   data,   datalength); 
 		printf( "CSerial::input.      retval=%d      datalength=%d\n ",   retval,datalength); 
                         return   (retval); 
             } 
             else 
                         return   (-1); 
 } 
------解决方案--------------------TError do_get_data(TCom com, void *data, short int nbytes) {   
     int received = 0, n;   
     assert(data != NULL && nbytes >  0); 
     //printf( "do_get_data %d\n ",nbytes); 
     while(received != nbytes) { 
        n = ReadComPort((INT32)com, (void *)((char *)data + received), 
                        nbytes - received); 
        // printf( "get %d\n ",n); 
        if(n == -1) 
          return TIME_OUT; 
        received += n; 
     } 
     return SUCCESS; 
 } /* do_get_data */   
 我是这样处理的.   
 你那也可以用循环来处理