为什么open()永不返回?

问题描述 投票:0回答:1

我正在Fedora环境中操作,使用c代码打开USB端口以与串行设备进行通信。

在大多数情况下,我的程序运行正常。但是,作为测试的一部分,我定期打开终端窗口并运行screen命令,然后手动将命令发送到串行设备。那也很好,但是之后,c程序将无法再访问该端口。我用ctrl-a k或ctrl-a d以及适当的sudo kill -9关闭了屏幕实例。之后,似乎没有证据表明该屏幕实例(sudo lsof / dev / tty *没有显示“屏幕”),但是,运行我的c程序失败。据我所知,open(...)命令只是挂起。恢复连接的唯一方法是拔下USB电缆并将其重新插入设备。

所以,

  • 1)是否有比我一直使用的两个更好的方法来关闭“屏幕”实例?
  • 2)为什么“打开”不返回?
c serial-port screen
1个回答
0
投票

1)是否有比我一直使用的两个更好的方法来关闭“屏幕”实例?

如果您的程序独立于任何先前的配置并执行其自己的完全初始化,那么这应该无关紧要。


2)为什么“打开”不返回?

open()之后的printf永远不会在此模式下锁定端口时触发

如果未声明来自调制解调器的DCD(数据载波检测)线路,则对串行终端的

open )系统调用可能会阻塞。通过指定O_NDELAY(或O_NONBLOCK)选项,例如:,您的程序可以在open()

期间忽略DCD行的状态。fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
但是,该选项也会使串行终端处于非阻塞模式,这将迫使您的应用程序(低效率)轮询系统以读取数据,而不是使用首选的事件驱动功能。您的程序可以通过发出

fcntl()

调用来清除非阻塞选项,例如:,从而返回到阻塞模式。fcntl(fd, F_SETFL, 0);
上面实际上清除了五个可修改的文件状态标志,即O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME和O_NONBLOCK标志。


阻止串行终端

open()

继续运行的Linux内核代码是while (1)中的tty_port_block_til_ready()循环。请注意,如果先前打开的串行终端设置了CLOCAL termios标志,则假定没有调制解调器连接,并且放弃了对DCD的检查。
© www.soinside.com 2019 - 2024. All rights reserved.