在Linux串行端口上接收/读取BREAK条件

时间:2013-02-10 22:38:37

标签: linux serial-port

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

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

如果我这样做,我希望如此:

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

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

我在termios.h中找到了tcsendbreak() 发送休息时间。我还找到了描述如何发送休息的tty_ioctl man page。但接受休息呢?

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

  • 在多串口方案中,我无法分辨它来自哪个串口。
  • 在终端上运行程序时,我也可以通过用户按Ctrl-C获取SIGINT
  • 如果我将我的程序作为守护程序运行,那么条件是“如果终端是前台进程组的控制终端”将不成立,是吗?
  • 无法知道BREAK状况持续多久以及何时停止。

1 个答案:

答案 0 :(得分:1)

到目前为止,我能够找到的最佳答案来自IGNBRK BRKINT c_iflag termios常量IGNBRK BRKINT结构体。它说:

  

'\0'PARMRK都未设置时,BREAK读取为空字节(\377 \0 \0),除非设置了0xFF 0x00 0x00,在这种情况下,它读取为序列PARMRK

(即0xFF 0x00 0x00

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

但请注意,我发现tcsendbreak() man page,这似乎暗示旧内核存在危险,即在使用{{1}}时可能会丢弃串行字节。

只要BREAK条件持续,或者仅在BREAK条件开始时发送一次,这些字节是否连续发送也不清楚。因此,不清楚是否可以通过此方法检测到BREAK条件的 end