質問: linuxでハードウェアdtr / dsrフロー制御を行う方法(シリアルポートプログラミング)? rts/ctsピン(tcsetattrのcrtsctsフラグ)を使用したハードウェアフロー制御を使用してシリアルポート通信をセットアップすることは可能ですが、信頼性が高く効率的な方法でフロー制御にdtr/dsrピンを使用する方法はありません。tiocmget ioctl()を使用してピンの状態を確認できますが、一度に1バイトを送信する必要があるため、非常に遅くなります。より良い方法はありませんか?独自のケーブルを作成することは拡張性がなく、dtr/dsrフロー制御のみを使用する多くのposシリアルプリンターが市場に出回っています。p.s.- xon/xoffを忘れて、信頼できる8ビット通信が必要です。
回答: 私自身の質問に答えると、@ 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