除非您先通过屏幕连接,否则通过 C++ 连接到 tty 端口会失败

Connecting to tty port through C++ fails unless you've connected through screen first

我选择了一个 AUPS-A10-R11 DC UPS,并正在与他们 API 合作为我的 xen 主机构建一些监控软件。它们的 API 通过设备上的 USB 连接运行,在主机上显示为 /dev/ttyUSB#。

除了一件让我感到困惑的事情外,我的一切都很好。当我第一次打开或重新启动它所连接的主机时,我无法与设备通信。但是,如果我打开一个屏幕连接到它:

screen /dev/ttyUSB0 9600

然后关闭它 (ctrl+a, k) 然后它会很好地工作,直到您下次重新启动主机。

有人知道为什么我必须先通过屏幕连接到设备吗?我在这里粘贴了我的代码:http://susepaste.org/0b8bb37f。重新启动连接时,它会在 if...else 子句的 "Read Nothing" 部分停止。连接带屏设备后,正常使用

有什么想法吗??

Does anyone have any idea as to why I would have to connect to the device over screen first?

这种行为几乎总是与您的程序不完整的 termios 初始化有关。

理想的程序会为其目的配置一个串行终端,并在退出时将 termios 配置恢复到它找到它的方式。
但是大多数程序,包括 minicom 和显然 screen 等终端仿真程序,只是简单地保留它们的 termios 配置而不是恢复它。
幸运的是,这个剩余的 termios 配置填补了缺失的部分,使您的程序可以按预期访问串行终端。

查看 "your" 代码表明它是从 this question 的已接受答案中复制的。根据赞成票的数量,这段代码显然适用于很多人。然而,作者承认它是在 POSIX 标准之前编写的,因此不应将代码视为可移植的。换句话说,您的里程可能会有所不同。

显然您忽略了 alternative answer,它是 POSIX 兼容的。用于阻止非规范模式的经过测试的 termios 配置在该程序中。
如果您更喜欢使用 cfmakeraw() 宏来简化,那么这里是另一个 code example.