gpt4 book ai didi

macos - 尝试在MacOS中打开串行端口时,open(2)函数挂起

转载 作者:行者123 更新时间:2023-12-03 13:37:13 25 4
gpt4 key购买 nike

我遇到了一个问题,当我尝试打开串行端口时,打开功能永远不会返回。它不会一直发生,并且如果我将USB拔出到串行适配器并重新插入,问题会消失一会儿。我的代码如下所示:

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);


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

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

使用最新版本的Prolific PL-2303驱动程序和10.7.2上基于PL-2303的USB到串行适配器,我今天能够再次重现此问题。一些注意事项:


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

最佳答案

该问题可能是在设备驱动程序中。您对O_NONBLOCK的行为是正确的,但是要由驱动程序来正确实现。了解使用哪个版本的OS X和哪个USB到串行设备将很有帮助。

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

另外,当open()被阻止时,进程是否可以被control-c中断?
如果您在阻止过程中使用“ ps -aux”查看该过程,那么“ STAT”字段表示什么?

关于macos - 尝试在MacOS中打开串行端口时,open(2)函数挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com