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

And*_*sen 18 macos posix serial-port

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

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Set*_*ble 5

问题可能出在设备驱动程序中.你O_NONBLOCK应该如何表现是正确的,但是由驱动程序正确实现它.了解OS X的哪个版本以及使用哪个USB转串口设备会很有帮助.

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

此外,当open()阻塞时,进程是否可以通过control-c中断?如果你用" ps -aux"阻止查看过程," STAT"字段会说什么?