我希望能夠檢測到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