【问题标题】:Pseudo tty set to canonical is not canonical设置为规范的伪 tty 不是规范的
【发布时间】:2019-04-02 10:25:42
【问题描述】:

我正在使用伪 tty(在 Linux 下)为串行设备编写一个简单的模拟器。写入串行设备的程序在仿真器(该程序)在主机端时写入从机端。

我创建了通常的主/从对:

posix_openpt
grantpt
unlockpt

然后我在 /tmp/emulator 中创建一个指向任何 ptsname 返回的软链接。一个小问题是当 slave 关闭时,select 返回并且 read() 返回 EIO。这有点烦人,所以我自己打开 ptsname 来防止这种情况(我通常对管道做同样的事情)。

我使用 tcsetattr 在主机端设置 ICANON,所以我(应该)一次读取一行。该协议是基于行的。

到目前为止一切顺利。除了它没有按预期工作。如果向 PTY 的从端发送一个字节,则 select() 返回并且 read() 读取该字节。这根本不规范!它应该等到收到 \n !

我将使用实际的串行端口和 Arduino 进行测试,看看是否也会发生这种情况。

【问题讨论】:

  • 我写了一个额外的测试程序,用 icanon 设置正常打开端口。如果我随后写入 1 个字节(不是 \r 或 \n),另一方会立即收到它。我不认为这是正常的 - icanon 应该意味着“等到你看到一个 \n - 然后 read() 返回整行”。这不是这里发生的事情。

标签: linux serial-port pty


【解决方案1】:

这似乎是预期的行为。我的实验表明,当设置 icanon 时:

Open /dev/pty/x:
    write() bytes, 1 at a time ---> each appears on master immediately

Master end
    write() bytes, 1 at a time ---> does NOT appear on /dev/pty/x slave until \n

换句话说,从端,在 /dev/pty/x 的那一个就像一个终端。关闭回显、设置线路模式、翻译 cr 和 lf 等或规范模式等所有操作均可用。

主端不是终端。它只允许向/从从端发送和接收数据。

这就是pty(7) 的意思,但您必须仔细阅读字里行间才能意识到主控器的行为也不像终端。

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 2017-05-31
    • 2010-12-29
    • 1970-01-01
    • 2013-07-12
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多