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).ps -avx显示进程的进程状态代码U. 我不确定这段代码是什么意思.它不会出现在ps由Google搜索找到的手册页中.ps我的机器上的手册页中没有过程状态代码列表.也许它特定于Mac(10.4+?)版本ps?ioctl()将端口上的选项重置回状态,然后我将其更改为在我的程序中使用挂起.我不得不杀死程序(通过Xcode的调试器).紧接着,在下一次推出该计划后,open()鸿...问题可能出在设备驱动程序中.你O_NONBLOCK应该如何表现是正确的,但是由驱动程序正确实现它.了解OS X的哪个版本以及使用哪个USB转串口设备会很有帮助.
标准程序是确保将设备直接插入CPU USB端口(不是集线器),检查电缆,并检查更新的驱动程序.
此外,当open()阻塞时,进程是否可以通过control-c中断?如果你用" ps -aux"阻止查看过程," STAT"字段会说什么?