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

标签 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
但是所有不以十六进制(>=16 十进制)0 开头的字节都可以正常传输。

首先...当我在一个伪终端上写入并在同一进程中从它读取时,它不应该反射(reflect)我刚刚在上面写入的那些字节,对吗?
我不熟悉这些终端,但我想象当我打开一个终端时,使用 ptsname 函数获取奴隶的名字。从另一个进程中,我可以打开该名称(如/dev/pts/3 ),从那时起它就作为一个“流”。

很可能我错了,但你能给我一个简短的澄清吗?提前致谢。

最佳答案

这类似于当您在终端按下 Ctrl+C 时,^C 被回显。 pty 的等效行为是,如果 Ctrl+C 生成的 ASCII 字符,,0x03,被写入到 master 端,然后它被回显为 ^C,0x5E 0x03。

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

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

关于c++ - 伪终端和串行设备之间奇怪的字符替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22075741/

相关文章:

python - 在 python 中通过调制解调器发送 wav 声音

c++ - 为什么 Makefile 找不到包含目录

c++ - 使用模板类时出现内部编译错误

c - 串行通信中获取错误数据

linux - Linux 中的 GSM 调制解调器映射

php - 授予 PHP 访问 COM 端口的权限

c++ - while 无符号整数条件循环

c++ - 打印 std::string 的字节表示

c - 打开并配置串口

windows - 如何获取 VCOM 设备 (Windows) 的 USB 字符串描述符?