web-dev-qa-db-ja.com

LinuxでハードウェアDTR / DSRフロー制御を行う方法(シリアルポートプログラミング)?

RTS/CTSピン(tcsetattrのCRTSCTSフラグ)を使用したハードウェアフロー制御を使用してシリアルポート通信をセットアップすることは可能ですが、信頼性が高く効率的な方法でフロー制御にDTR/DSRピンを使用する方法はありません。

TIOCMGET ioctl()を使用してピンの状態を確認できますが、一度に1バイトを送信する必要があるため、非常に遅くなります。

より良い方法はありませんか?独自のケーブルを作成することは拡張性がなく、DTR/DSRフロー制御のみを使用する多くのPOSシリアルプリンターが市場に出回っています。

P.S.- XON/XOFFを忘れて、信頼できる8ビット通信が必要です。

4
nlucas

私自身の質問に答えると、@ ktfからのヒントのおかげで、少なくとも2.6.28 [1]以降、拡張属性を設定するためのIOCTL(TCGETX、TCSETX、TCSETXF、およびTCSETXW)があることがわかりました。

これらは2008年10月13日にアップストリームカーネルに追加されたようです[2]。

これらの追加のIOCTL(SYS5と互換性があります)を使用すると、追加の各ピンを個別に処理するように構成できます。

元のRHELパッチ[3]のリンクを参照し、その使用方法の例については、添付のテストケースを参照してください。

IOCTL定義は「asm-generic/ioctls.h」ファイルにあり、構造とフラグ定数は「linux/termios.h」(もちろん「/ usr/include」内)で定義されています。

[〜#〜]更新[〜#〜]

さらなる調査によると、このIOCTLの汎用シリアルサポートはアップストリームカーネルソースにマージされていません。 RHEL 5.3にはそれがありますが、アップストリーム3.0.6カーネルにはありません。
これは、RHELパッチを移植しなかった他のカーネルではioctl()呼び出しが失敗することを意味します[4]。

[1] http://lxr.free-electrons.com/ident?v=2.6.28;i=TCGETX
[2] https://lkml.org/lkml/2008/10/13/12
[3] https://bugzilla.redhat.com/show_bug.cgi?id=445211
[4] https://bugzilla.redhat.com/attachment.cgi?id=315300&action=diff

3
nlucas