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

时间:2018-05-17 13:02:30

标签: usb uart tty usbserial

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

除了一件令我困惑的事情外,我的工作正常。当我第一次打开电源或重启它连接的主机时,我无法与设备通信。但是,如果我打开一个屏幕连接:

screen /dev/ttyUSB0 9600

然后关闭它(ctrl + a,k)然后它将完全正常,直到你下次重启主机。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

有没有人知道为什么我必须首先通过屏幕连接到设备?

此类行为几乎总是与程序初始化的termios初始化有关。

理想的程序会为其目的配置串行终端,并在退出时将termios配置恢复为找到它的方式。
但大多数程序,包括终端仿真程序,如 minicom ,显然屏幕,只需保留其termios配置,而不是恢复它。
幸运的是,这个剩余的termios配置填补了缺少的部分,允许您的程序按预期访问串行终端。

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

显然你忽略了符合POSIX的alternative answer。用于阻止非规范模式的经过测试的termios配置在该程序中 如果您希望使用 cfmakeraw()宏进行简化,那么这里有另一个code example