我选择了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”部分停止。用屏幕连接到设备后,它可以正常工作。
有什么想法吗?
答案 0 :(得分:1)
有没有人知道为什么我必须首先通过屏幕连接到设备?
此类行为几乎总是与程序初始化的termios初始化有关。
理想的程序会为其目的配置串行终端,并在退出时将termios配置恢复为找到它的方式。
但大多数程序,包括终端仿真程序,如 minicom ,显然屏幕,只需保留其termios配置,而不是恢复它。
幸运的是,这个剩余的termios配置填补了缺少的部分,允许您的程序按预期访问串行终端。
回顾"你的"代码表明它是从this question的接受答案中复制的。根据向上投票的数量,这个代码显然适用于很多人。然而,作者承认它是在POSIX标准之前编写的,因此代码不应被视为可移植的。换句话说,您的里程可能会有所不同。
显然你忽略了符合POSIX的alternative answer。用于阻止非规范模式的经过测试的termios配置在该程序中 如果您希望使用 cfmakeraw()宏进行简化,那么这里有另一个code example。