macOS阻止串行I / O

时间:2019-05-16 13:13:28

标签: macos serial-port blocking

我正在编写一个作为测试套件一部分的工具,该套件需要通过串行端口与某些硬件进行通讯,以便所测试的代码能够看到环境的变化。

所以,我这样做:

open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY);

只有它挂在那里。如果我将通话替换为

open("/dev/tty.usbmodem14141", O_RDWR | O_NOCTTY | O_NONBLOCK);

然后它可以工作-但我不想不必摆弄select()和朋友,也不必写忙循环的轮询,这样我就可以从串行端口读取数据了;这就是阻塞I / O的目的。

我需要做一些特别的事情吗?

1 个答案:

答案 0 :(得分:0)

在非阻塞模式下打开串行终端后,可以清除文件状态标志以在阻塞模式下执行I / O。

要清除非阻塞状态标志,您可以使用fcntl(),例如:

int flags;

flags = fcntl(fd, F_GETFL);
flags &= ~O_NONBLOCK;
fcntl(fd, F_SETFL, flags);

由于Linux版本的F_SETFL只能更改O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME和O_NONBLOCK标志,因此通常的做法是将代码简化为

fcntl(fd, F_SETFL, 0);

(是的,单衬里的可移植性与Setting Terminal Modes Properly中提倡的程度不同。)