为什么fcntl(fd,F_SETFL,0)用于串口编程

时间:2016-01-22 09:55:40

标签: c linux serial-port fcntl

我正在Linux中启动串口编程。在网上阅读了几个例子后,我不明白Error: Target id 'android--1' is not valid. Use 'android.bat list targets' to get the target ids. 的确切效果?它正在清除位,但它会影响哪些标志?它设定或清楚了什么?

2 个答案:

答案 0 :(得分:4)

逐一采取

1)使用函数调用

fcntl() - 它对参数中传递的文件描述符执行操作。

2)电话中的第二个参数

F_SETFL(int)

  

将文件状态标志设置为arg指定的值。文件访问权限   模式(O_RDONLY,O_WRONLY,O_RDWR)和文件创建标志(即,   arg中的O_CREAT,O_EXCL,O_NOCTTY,O_TRUNC)将被忽略。在Linux上这个   命令只能更改O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME,   和O_NONBLOCK标志。

3)电话中的第3个参数

它是0表示,它将file status flag设置为零。 正如Jean-BaptisteYunès在评论中所说。

  

忽略文件访问模式和文件创建标志。这个命令   重置所有其他标志:没有追加,没有异步,没有直接,没有时间,和   没有非阻塞

最后

fcntl(fd, F_SETFL, 0)

此调用将打开文件desciptor的file status标志设置为值0.

但理想的是这样我们不应该改变文件状态标志。 最好的方法是首先使用F_GETFL获取当前文件状态标志,然后只更改所需的位。 见例:

如果要修改文件状态标志,则应使用F_GETFL获取当前标志并修改该值。不要认为这里列出的标志是唯一实现的标志;你的程序可能会在几年后运行,然后可能存在更多标志。例如,这是一个设置或清除标志O_NONBLOCK而不改变任何其他标志的函数:

/* Set the O_NONBLOCK flag of desc if value is nonzero,
   or clear the flag if value is 0.
   Return 0 on success, or -1 on error with errno set. */

int
set_nonblock_flag (int desc, int value)
{
  int oldflags = fcntl (desc, F_GETFL, 0);
  /* If reading the flags failed, return error indication now. */
  if (oldflags == -1)
    return -1;
  /* Set just the flag we want to set. */
  if (value != 0)
    oldflags |= O_NONBLOCK;
  else
    oldflags &= ~O_NONBLOCK;
  /* Store modified flag word in the descriptor. */
  return fcntl (desc, F_SETFL, oldflags);
}

答案 1 :(得分:-2)

每个fcntl()的手册页

  

F_SETFL(int)

     

将文件状态标志设置为arg指定的值。文件                 访问模式(O_RDONLY,O_WRONLY,O_RDWR)和文件创建                 arg中的标志(即O_CREAT,O_EXCL,O_NOCTTY,O_TRUNC)是                 忽略。在Linux上,此命令只能更改O_APPEND,                 O_ASYNC,O_DIRECT,O_NOATIME和O_NONBLOCK标志。它不是                 可以更改O_DSYNC和O_SYNC标志;看BUGS,                 下方。

这来自man page