伪终端和串行设备之间奇怪的字符替换

时间:2014-02-27 17:23:10

标签: c++ serial-port modem pty

我有一个应用程序,我打开一个串行设备(GSM调制解调器),我创建一个伪终端。我想从串行设备读取,过滤数据并通过伪终端发送,因此另一个进程可以读取它,就像它是一个简单的“原始”串行线。 ptFd - 伪终端文件描述符
devFd - 串行设备文件描述符

我正在使用posix_openpt( O_RDWR | O_NOCTTY )grantpt(ptFd)unlockpt(ptFd)作为伪终端,并为串行线路提供了大量自定义设置。首先尝试我不会在这里发布,但如果它可以帮助任何人解决这个问题,我会这样做。 我的问题如下:

阅读devFd:
056405c0020001009e59
阅读ptFd:
5e45645e45c05e425e405e415e409e59
阅读devFd:
056405c0020001009e59
阅读ptFd:
5e45645e45c05e425e405e415e409e59

我正在编写伪终端上从设备获得的字节,并且:
05改为5e45
00变为5e40
01更改为5e41
02更改为5e42
但是所有不以十六进制的0开头的字节(> =十进制的16)都可以正常传输。

首先......当我在一个伪终端上写字并在同一个过程中读取它时,它不应该反映我刚才写的字节,对吧? 我不熟悉这些终端,但我想当我打开一个终端,用ptsname函数获取slave的名字。在另一个过程中,我可以打开该名称(例如/ dev / pts / 3),从那时起它就像'stream'一样。

最有可能是我错了,但是你可以给我一个简短的澄清吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

这类似于在终端上按Ctrl + C时,^C被回显的方式。 pty的等效行为是,如果由Ctrl + C,,0x03生成的ASCII字符写入端,则它将回显为{{ 1}}, ie ,0x5E 0x03。

通过取消终端属性的^C字段中的ECHOCTL标记,可以为Ctrl + C和其他控制字符关闭此行为。

您还可以通过取消设置c_lflag标志来完全禁用回显。 (我不确定你是否想这样做;我不清楚你在做什么)