我希望能够在Linux中的串行端口上检测到BREAK条件。这是怎么做到的?
我想检测BREAK条件何时开始和何时停止。
如果我这样做,我希望如此:
int serial_status;
ioctl(serial_fd, TIOCMGET, &serial_status);
然后会有一个显示BREAK条件的值 - 但似乎没有这样的事情。
我在termios.h
中找到了tcsendbreak()
发送休息时间。我还找到了描述如何发送休息的tty_ioctl
man page。但接受休息呢?
注意: BRKINT
已被建议(在发生中断时生成信号SIGINT
)。但是获得SIGINT
并不是一个有用的API,原因如下:
SIGINT
。答案 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 。