一尘不染

如何在读取函数调用中实现超时?

linux

我想使用串行com端口进行通信,并且每次调用read函数调用时都想实现超时。

int filedesc = open( "dev/ttyS0", O_RDWR );

read( filedesc, buff, len );

编辑:

我正在使用Linux OS。如何使用选择函数调用实现?


阅读 339

收藏
2020-06-02

共1个答案

一尘不染

select()有5个参数,首先是最高的文件描述符+ 1,然后是fd_set用于读取,一个用于写入,一个用于异常。最后一个参数是struct
timeval,用于超时。错误时返回-1,超时时返回0或设置的集合中文件描述符的数量。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>

int main(void)
{
  fd_set set;
  struct timeval timeout;
  int rv;
  char buff[100];
  int len = 100;
  int filedesc = open( "dev/ttyS0", O_RDWR );

  FD_ZERO(&set); /* clear the set */
  FD_SET(filedesc, &set); /* add our file descriptor to the set */

  timeout.tv_sec = 0;
  timeout.tv_usec = 10000;

  rv = select(filedesc + 1, &set, NULL, NULL, &timeout);
  if(rv == -1)
    perror("select"); /* an error accured */
  else if(rv == 0)
    printf("timeout"); /* a timeout occured */
  else
    read( filedesc, buff, len ); /* there was data to read */
}
2020-06-02