web-dev-qa-db-ja.com

screenを使用してシリアルポートにアクセスするときにパリティビットを設定する方法

通常、screen(1)を使用して、次のコマンドでシリアルポートを開きます。

Sudo screen /dev/ttyUSB2 115200

次のコマンドを使用して、parenb(およびその他の多くのもの)を設定してみました。

Sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

ただし、システムはこれを尊重していないようです。上記のコマンドでscreenにいるときにsttyによって報告される設定は次のとおりです。

$ Sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

コマンドラインで有効にしたにもかかわらず、-parenbに注意してください。

TtyUSB2を手動で変更した場合、screenを実行した後(または実行中)は尊重されません。

括弧を設定:

$ Sudo stty -F /dev/ttyUSB2 parenb

その値を確認します。

$ Sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Parenbが正しく設定されていることがわかります。

実行画面

$ Sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

もう一度parenbを確認します。

$ Sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

エラー:-parenbに戻りました。

どうしたの?

偶数パリティ(具体的にはデフォルトの8n1ではなく8e1)を使用するようにこのコマンドをどのように変更しますか?

OSはUbuntu 12.04.5 LTSで、最新のHWEが搭載されています。

5
Tom Hennen

要するに、screenがこれらのフラグの設定をサポートしていないように見えます。代わりに、sttyを実行して、画面がポートに接続されている間にフラグを設定します。または、画面をシリアルポートに直接接続する代わりに、従来の画面コマンドラインセッション内で Kermit または別の端末エミュレータプログラムを実行することもできます。

screenソースコードは http://git.savannah.gnu.org/cgit/screen.git にあります。対象のファイルは tty.sh のようです。これは、ビルドプロセス中に「tty.c」を生成するために実行されるシェルスクリプトです。 tty.cには、シリアルポートにアクセスするためのコードが含まれています。

関数SttyMode()は、ttyオプションを解析してttyモードを設定するもののようです。それは小さな、固定されたオプションのセットを扱うように私には思えます。 「parenb」と「parodd」はそれらの中にありません。

Cの経験がある開発者がこれらのオプションのサポートを追加するのは、それがオプションである場合は簡単なようです。

3
Kenster

Sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopbをお試しください

From sttyのmanページ

  • csN-文字サイズをNビットに設定、[5..8]のN
  • [-] parenb-出力にパリティビットを生成し、入力にパリティビットを期待します
  • [-] parodd-奇数パリティを設定します( '-'を使用しても)
  • [-] cstopb-文字ごとに2つのストップビットを使用(1つは「-」付き)
6