当前位置: 技术问答>linux和unix
关于串口数据读取丢失问题
来源: 互联网 发布时间:2016-02-06
本文导语: 我向一个串口对象发送了一个指定,串口对象返回了相关的数据(通过监控窗口看到数据完整返回了),但是在读取串口对象时,无法读完正确的数据,在读到部分数据之后(多次循环调用input方法后),select调用返回0,...
我向一个串口对象发送了一个指定,串口对象返回了相关的数据(通过监控窗口看到数据完整返回了),但是在读取串口对象时,无法读完正确的数据,在读到部分数据之后(多次循环调用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 %dn",retval);
if (retval) {
retval = read (fd, data, datalength);
printf("CSerial::input. retval=%d datalength=%dn", retval,datalength);
return (retval);
}
else
return (-1);
}
以下是专门读取串口数据的函数
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 %dn",retval);
if (retval) {
retval = read (fd, data, datalength);
printf("CSerial::input. retval=%d datalength=%dn", 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 %dn",nbytes);
while(received != nbytes) {
n = ReadComPort((INT32)com, (void *)((char *)data + received),
nbytes - received);
// printf("get %dn",n);
if(n == -1)
return TIME_OUT;
received += n;
}
return SUCCESS;
} /* do_get_data */
我是这样处理的.
你那也可以用循环来处理
int received = 0, n;
assert(data != NULL && nbytes > 0);
//printf("do_get_data %dn",nbytes);
while(received != nbytes) {
n = ReadComPort((INT32)com, (void *)((char *)data + received),
nbytes - received);
// printf("get %dn",n);
if(n == -1)
return TIME_OUT;
received += n;
}
return SUCCESS;
} /* do_get_data */
我是这样处理的.
你那也可以用循环来处理