我正在使用伪tty (在Linux下)为串行设备编写一个简单的仿真器。写入串行设备的程序在仿真器(此程序)位于主机端时写入从机端。
我使用以下命令创建通常的主/从对:
posix_openpt
grantpt
unlockpt然后,我在/tmp/模拟器中创建了一个软链接,指向任何ptsname返回的内容。一个小问题是,当从进程关闭时,select return和read()返回EIO。这有点恼人,所以我自己打开ptsname来防止这种情况(我通常对管道做同样的事情)。
我使用tcsetattr将ICANON设置在主端,因此我(应该)一次读取一行。该协议是基于线路的。
到目前一切尚好。只是它并不像预期的那样工作。如果向PTY的从机端发送一个字节,则select()返回,read()读取该字节。这一点也不规范!它应该等待直到接收到\n!
我将使用一个实际的串口和一个Arduino进行测试,看看在那里是否也会发生这种情况。
发布于 2018-11-01 06:27:01
这似乎是意料之中的行为。我的实验表明,当设置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)所说的,但你必须理解字里行间的意思,才能意识到主机并不同时充当终端。
https://stackoverflow.com/questions/53046340
复制相似问题