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