Linux termios 串口编程之 VTIME与VMIN

时间:2022-04-30 21:03:12

在Linux TTY编程时会涉及到 termios 结构,其中c_cc数组里面,有 VTIME 和 VMIN 下标。关于他们的使用经常令人迷惑,查阅了不少博客,上面的讲解也有不少误区。

在这里重新对这二者关系进行介绍。结合实验会令人记忆更深刻。

VTIME 和 VMIN 的值只能用于非标准模式,两者结合起来共同控制对输入的读取。此外,两者结合使用还能控制在一个程序试图读取与一个终端关联的文件描述符时将发生的情况。

两者结合使用分为下面4种情况:

  • VMIN = 0 和 VTIME = 0 :在这种情况下,read 调用总是立刻返回。如果有等待处理的字符,read 就会立刻返回;如果没有字符等待处理,read 调用返回0,并且不读取任何字符;
  • VMIN = 0 和 VTIME > 0 :在这种情况下,只要有字符可以处理或者是经过 VTIME 个十分之一秒的时间间隔,read 调用就返回。如果因为超时而未读到任何字符,read 返回0,否则 read 返回读取的字符数目。
  • VMIN > 0 和 VTIME = 0 :在这种情况下,read 调用将一直等待,直到有 MIN 个字符可以读取时才返回,返回值是读取的字符数量。到达文件尾时返回0。
  • VMIN > 0 和 VTIME > 0 :在这种情况下,当 read 被调用时,它会等待接收一个字符。在接收到第一个字符及后续的每个字符后,一个字符间隔定时器被启动(如果定时器已经运行,则重启它)。当有 MIN 个字符可读或两个字符之间的时间间隔超过 TIME 个十分之一秒时,read 调用返回。这个功能可用于区分是单独按下了 Escape 键还是按下一个 Escape 键开始的功能组合键。但要注意的是,网络通信或处理器的高负载将使得类似这样的定时器失去作用。

通过设置非标准模式与使用的 VMIN 和 VTIME 值,程序可以逐个字符地处理输入。