5

我希望能够在 Linux 的串行端口上检测到 BREAK 条件。这是怎么做到的?

我想检测 BREAK 条件何时开始以及何时停止。

我希望如果我这样做:

int serial_status;
ioctl(serial_fd, TIOCMGET, &serial_status);

然后会有一个显示 BREAK 条件的位值 - 但似乎没有这样的事情。

我找到tcsendbreak()termios.h发送休息时间。我还找到了描述如何发送中断的tty_ioctl手册页。但是休息一下呢?

注意: BRKINT已建议(SIGINT在发生中断时生成信号)。但是获取 aSIGINT并不是一个有用的 API,原因如下:

  • 在多串口场景中,我无法分辨它来自哪个串口。
  • SIGINT在终端上运行程序时,我也可以从按 Ctrl-C 的用户那里获得。
  • 如果我将我的程序作为守护进程运行,那么“如果终端是前台进程组的控制终端”的附带条件就不会是真的,不是吗?
  • 无法知道 BREAK 条件持续多长时间以及何时停止。
4

1 回答 1

3

到目前为止,我能找到的最佳答案来自结构中的手册tcsendbreak()描述IGNBRKBRKINT常量。它说:c_iflagtermios

当既不设置IGNBRK也不BRKINT设置时,BREAK 读取为空字节 ( '\0'),但PARMRK设置时除外,在这种情况下,它读取为序列\377 \0 \0

(即0xFF 0x00 0x00

所以我想我可能应该设置PARMRK并准备对读取的字节进行一些处理。这提供了关于奇偶校验/成帧错误的明确信息(尽管它是否0xFF 0x00 0x00代表 BREAK 或其他一些奇偶校验/成帧错误仍然不是完全明确的)。

但是请注意,我发现了这个补丁PARMRK,这似乎暗示旧内核中存在串行字节在PARMRK使用时可能被丢弃的危险。

也不清楚这些字节是在 BREAK 条件持续时连续发送,还是在 BREAK 条件开始时只发送一次。所以不清楚是否可以通过这种方法检测到 BREAK 条件的结束。

于 2013-02-12T02:09:05.440 回答