5

Linux のシリアル ポートで BREAK 状態を検出できるようにしたいと考えています。これはどのように行われますか?

BREAK 条件がいつ開始され、いつ停止するかを検出したいと思います。

もしそうなら、私はそれを望んでいました:

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

その場合、BREAK 状態を示すビット値が表示されますが、そのようなことはないようです。

休憩を送るために見つけましtcsendbreak()た。また、ブレークの送信方法を説明しているマニュアル ページも見つけました。しかし、休憩を取るのはどうですか?termios.htty_ioctl

注: BRKINTが提案されています (SIGINTブレークが発生したときに信号を生成します)。しかしSIGINT、いくつかの理由から、 を取得することはそれほど有用な API ではありません。

  • 複数のシリアルポートのシナリオでは、どのシリアルポートからのものかわかりません。
  • SIGINT端末でプログラムを実行しているときに、ユーザーが Ctrl-C を押して取得することもできます。
  • プログラムをデーモンとして実行している場合、「端末がフォアグラウンド プロセス グループの制御端末である場合」という但し書きは当てはまりませんね。
  • BREAK 状態がどのくらい続くか、いつ停止するかを知ることはできません。
4

1 に答える 1

3

私がこれまでに見つけた最良の答えは、構造内ののtcsendbreak()マニュアルページの説明IGNBRKBRKINT定数からです。それは言う:c_iflagtermios

どちらも設定されていない場合IGNBRKBRKINTBREAKはnullバイト('\0')として読み取られます。ただし、PARMRKが設定されている場合は、シーケンスとして読み取られます\377 \0 \0

(つまり、0xFF 0x00 0x00

したがって、おそらくPARMRK、読み取ったバイトを少し処理するように設定して準備する必要があると思います。0xFF 0x00 0x00これにより、パリティ/フレーミングエラーに関する明示的な情報が提供されます(ただし、BREAKを表すか、その他のパリティ/フレーミングエラーを表すかは完全に明確ではありません)。

ただし、このパッチPARMRKを見つけたので、古いカーネルでは、PARMRKが使用されているときにシリアルバイトがドロップされる可能性があることを示唆しているようです。

また、これらのバイトがBREAK条件が続く限り継続的に送信されるのか、それともBREAK条件の開始時に1回だけ送信されるのかは明確ではありません。したがって、この方法でBREAK状態の終了を検出できるかどうかは明確ではありません。

于 2013-02-12T02:09:05.440 に答える