日期:2014-05-16  浏览次数:20699 次

关于串口数据读取丢失问题
我向一个串口对象发送了一个指定,串口对象返回了相关的数据(通过监控窗口看到数据完整返回了),但是在读取串口对象时,无法读完正确的数据,在读到部分数据之后(多次循环调用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 */

我是这样处理的.

你那也可以用循环来处理