当前位置: 技术问答>linux和unix
Linux read 超时
来源: 互联网 发布时间:2016-09-12
本文导语: 我要完成的功能是进入read 读串口信息,有一定时间内读不到数据就跳出来,不在read阻塞,该怎么做 | int readPort(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间 { int ...
我要完成的功能是进入read 读串口信息,有一定时间内读不到数据就跳出来,不在read阻塞,该怎么做
|
int readPort(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
int no= 0;int rc;int rcnum = len;
struct timeval tv;
fd_set readfd;
tv.tv_sec=maxwaittime; //SECOND
tv.tv_usec=0; //USECOND
FD_ZERO(&readfd);
FD_SET(fd,&readfd);
rc=select(fd+1,&readfd,NULL,NULL,&tv);
if(rc>0)
{
while(len)
{
rc=read(fd,&buf[no],1);
if(rc>0)
no=no+1;
len=len-1;
}
//if(no!=rcnum)
// return -1; //如果收到的长度与期望长度不一样,返回-1
return rcnum; //收到长度与期望长度一样,返回长度
}
else
{
return -1;
}
return rc;
}
|
代码有个小问题,注意select被信号中断的处理不能等同于出错返回,而应该继续select
|
to2楼:
这个就是c的,把读串口的read封装了下。
这个就是c的,把读串口的read封装了下。
|
恩,如果按照lz的要求应该还要把select和tv.tv_sec稍微修改下。
1楼代码我是从程序里直接copy的,不是很符合lz的要求。
1楼代码我是从程序里直接copy的,不是很符合lz的要求。
|
路过 用select UNIX高级环境编程里面有详细介绍
|
3L很仔细啊。。。我前面用都没考虑。。。不管鸟,这样要改很多很多。。。
|
实现非阻塞大概有以下几种方式
(1)在open时使用O_NONBLOCK标志如果读取不到立即返回
(2)使用select延时机制。具体使用方法网上很多都可以借鉴一下。
注意你要读取的设备是哪类,如果是串口,注意一下串口参数的设置。
(1)在open时使用O_NONBLOCK标志如果读取不到立即返回
(2)使用select延时机制。具体使用方法网上很多都可以借鉴一下。
注意你要读取的设备是哪类,如果是串口,注意一下串口参数的设置。