我正在使用伪tty(在Linux下)为串行设备编写一个简单的模拟器。当仿真器(此程序)在主机侧时,写入串行设备的程序将写入从机侧。
我用以下方法创建通常的主/从对:
posix_openpt
grantpt
unlockpt
然后我在/ tmp / emulator中创建一个指向ptsname返回的软链接。一个较小的问题是,当从属服务器关闭时,select返回,而read()返回EIO。这有点烦人,所以我自己打开ptsname来防止这种情况发生(通常对管道也是如此)。
我使用tcsetattr在主端设置ICANON,所以我(应该)一次读取一行。该协议基于行。
到目前为止,一切都很好。除非它不能按预期工作。如果将单个字节发送到PTY的从属端,则select()返回,而read()读取该字节。这根本不规范!应该等到收到\ n!
我将使用实际的串行端口和Arduino进行测试,以查看是否也发生这种情况。
答案 0 :(得分:0)
这似乎是预期的行为。我的实验表明,设置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)在说的,但是您必须在两行之间阅读,以了解主服务器也不像终端一样。