我希望能够检测到Linux中串行端口的BREAK条件。这是如何完成的?Linux串行端口接收/读取BREAK条件
我想要检测何时停止BREAK条件开始和。
我希望,如果我这样做:
int serial_status;
ioctl(serial_fd, TIOCMGET, &serial_status);
则会有呈现出BREAK位值条件,但它似乎没有这样的事情。
我发现tcsendbreak()
在termios.h
为发送休息。我还发现了描述如何发送休息的tty_ioctl
man page。但是如何获得休息?
注意:BRKINT
已被建议(它产生中断发生时的信号SIGINT
)。但是,让SIGINT
是不是这样一个有用的API,有几个原因:
- 我不能告诉它来自哪个串口从,在多串口方案。
- 在终端运行程序时,我也可以从用户按Ctrl-C获得
SIGINT
。 - 如果我将我的程序作为守护程序运行,那么条件“如果终端是前台进程组的控制终端”将不是真的,是吗?
- 不可能知道BREAK条件持续多久,何时停止。
看看你连接到的'termios'手册中的'BRKINT'。 – 2013-02-10 22:44:08
@AntonKovalenko:我为我的问题添加了一个注释,说明为什么我不认为'BRKINT'(生成'SIGINT')是有用的。 – 2013-02-10 22:52:13
查看USART/UART驱动程序的源代码,标志为'TTY_BREAK',当异常接收条件(例如奇偶校验错误,成帧错误,溢出或中断)发生时,标志通常填充到接收缓冲区中。然而,*行规则*(userland获取Rx数据之前的下一个处理阶段)通常会过滤掉Rx数据中的标志。我隐约想起一个* line的*版本,它插入了20个NUL作为休息条件。或者可能是3个字节的'0xff'和'0x00'和'0x00' - http://lxr.free-electrons.com/source/drivers/char/n_tty.c?v=2.6.36#L1002 – sawdust 2013-02-11 00:07:14