代码之家  ›  专栏  ›  技术社区  ›  Andrew Madsen

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

  •  17
  • Andrew Madsen  · 技术社区  · 14 年前

    fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);
    

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

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

    • 当被挂在 open() 调用,进程不可使用命令中断-。(控制-C)。
    • 跑步 ps -avx 显示进程的进程状态代码U。我不知道这段代码是什么意思。它不会出现在手册页中 ps 通过谷歌找到的。手册页中没有进程状态代码的列表 在我的机器上。也许它是针对Mac(10.4+?)版本 聚苯乙烯 ?
    • 我注意到,在这个问题第一次出现之前,我在逃亡途中 ioctl() 将端口上的选项重置回其状态,然后再将其更改为在挂起的程序中使用。我不得不终止程序(通过Xcode的调试器)。紧接着,在下一次启动程序时, 打开()
    1 回复  |  直到 5 年前
        1
  •  5
  •   Seth Noble    13 年前

    问题可能出在设备驱动程序中。你说得对 O_NONBLOCK 应该有行为,但这取决于驱动程序能否正确实现。这将有助于了解哪个版本的OS X和哪个USB到串行设备正在使用。

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

    还有,当 open() 如果你看这个过程 ps -aux 当它被阻止时 STAT