【问题标题】:Understanding UNIX termios VMIN and VTIME了解 UNIX termios VMIN 和 VTIME
【发布时间】:2015-10-22 15:45:04
【问题描述】:

我目前正在基于 UNIX 的设备上开发一个简单的串行接口,但无法找到以下问题的明确答案:

我目前正在尝试确定“纯时间读取”(VMIN = 0, VTIME >0) 是否会在读取到 n_bytes 的过程中返回,因为计时器是在调用读取时启动的,而不是在第一个字符是收到了。

例如,如果我向串行接口另一端的设备发送消息并且我想要响应,我会尝试以下操作(伪代码):

m_tty.c_cc[VMIN] = 0;
m_tty.c_cc[VTIME] = 5;                              //i.e. > 0

write(myFileHandle, myData, sizeof(myData));
usleep(sizeof(myData) * 100);                      //assuming 100 us per char to Tx.
read(myFileHandle, myRxData, expectedMinNumBytes);

我不清楚如果第一个字节在计时器即将到期时到达,read() 是否会返回,或者一旦收到第一个字节,它是否会一直持续到 'expectedMinNumBytes'?

提前感谢您的帮助!

【问题讨论】:

  • "... 如果收到第一个后它会一直持续到 'expectedMinNumBytes'?" -- 这个问题没有意义,因为您已将 VMIN 指定为 0。第一个字节已经使接收到的计数超过最小值!
  • 关于 VMIN 和 VTIME 的精彩文章:Understanding UNIX termios VMIN and VTIME

标签: unix termios


【解决方案1】:

这是一个纯定时阅读。如果有可用数据,则立即满足读取。如果没有数据,则在调用 read 时启动计时器,并且 read 返回:因为计时器到期(返回 0)或单个字节可用。

【讨论】:

  • 所以要明确一点:如果调用 read() 时没有可用数据,则启动计时器,并且在此期间只有一个字节到达 one 字节是否返回,无论随后是否收到其他字节?我假设这些后续字节存储在接收缓冲区中,并且可以通过另一个读取访问?
  • 假设波特率快且时序条件有利,您可以返回一个以上的字节。不会丢失任何数据(除非发生溢出),因为后续的 read() 将返回数据。 .
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
相关资源
最近更新 更多