尝试在Mac OS X中打开串行端口时,open()函数挂起(永不返回)

时间:2010-10-31 19:54:16

标签: macos serial-port posix

我遇到了一个问题,当我尝试打开串口时,open函数永远不会返回。它不会一直发生,如果我拔掉USB到串口适配器并将其重新插入,问题就会消失一段时间。我的代码如下所示:

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);

其中bsdPath是/dev/cu.KeySerial1。我已经尝试将O_NONBLOCK选项添加到open命令,但它仍然挂起。

当然,我想了解为什么会这样。我的信念是,无论问题是什么,在指定O_NONBLOCK的情况下,即使无法打开端口,open也应该返回。如果它无法打开端口,则fileDescriptor应该为-1并且应该设置errno(我在调用open之后立即检查)。当然,这不会发生。我的假设不正确吗?是否有一些已知的原因,即使在遇到错误时指定了O_NONBLOCK,open()也永远不会返回?

在10.7.2上使用最新版本的Prolific PL-2303驱动程序和基于PL-2303的USB转串口适配器,我今天能够再次重现这个问题。几点说明:

  • 挂起open()电话时,使用命令 - 不能中断该过程。 (控制-C)。
  • 运行ps -avx显示进程的进程状态代码U.我不确定这段代码是什么意思。它不会出现在谷歌搜索找到的ps的手册页中。我的机器上ps的手册页中没有过程状态代码列表。也许它特定于Mac(10.4 +?)版本的ps
  • 我注意到在第一次出现此问题之前的运行中,我调用ioctl()将端口上的选项重置回状态,然后我将其更改为在我的程序中使用挂起。我不得不杀死程序(通过Xcode的调试器)。紧接着,在下一次启动该计划时,open()挂起......

1 个答案:

答案 0 :(得分:6)

问题可能在设备驱动程序中。您对O_NONBLOCK的行为方式是正确的,但是由驱动程序正确实现。了解哪个版本的OS X以及使用哪个USB转串口设备会很有帮助。

标准程序是确保将设备直接插入CPU USB端口(不是集线器),检查电缆,并检查更新的驱动程序。

此外,当open()阻止时,进程是否可以通过control-c中断? 如果您在阻止“ps -aux”的过程中查看该过程,“STAT”字段会说什么?