我遇到了一个问题,当我尝试打开串口时,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()
挂起...... 答案 0 :(得分:6)
问题可能在设备驱动程序中。您对O_NONBLOCK
的行为方式是正确的,但是由驱动程序正确实现。了解哪个版本的OS X以及使用哪个USB转串口设备会很有帮助。
标准程序是确保将设备直接插入CPU USB端口(不是集线器),检查电缆,并检查更新的驱动程序。
此外,当open()
阻止时,进程是否可以通过control-c中断?
如果您在阻止“ps -aux
”的过程中查看该过程,“STAT
”字段会说什么?