web-dev-qa-db-ja.com

Screenを使用してシリアル端末に接続するローカルエコー

「ワイヤレスセンサーネットワークの構築」という本を読んで、Screenユーティリティを使用してシリアルコンソールに接続できることを学びました。 XBeeモジュールに接続するためにそれを使用しようとしましたが、ターミナルでローカルに入力された文字をエコーし​​ないことを除いて、正常に動作しているように見えました。私がこれまでに見つけた唯一の助けになると思われるのは、sttyユーティリティを使用してttyデバイスの「echo」オプションを設定することでしたが、変更は有効になっていないようです。 ttyデバイスでsttyを実行し、「echo」を渡しました。 sttyを再度実行して現在のオプションを出力すると、「-echo」が設定されていることが表示されます。構文の理解が正しければ、ダッシュはオプションがオフであることを示し、ダッシュがない場合はオプションがオンであることを示します。また、Sudoでechoオプションを設定してみましたが、それでも違いはありませんでした。

私は明らかにこの分野の知識があまりないので、助けていただければ幸いです。

7
Pak

115200ボーでシリアルデバイスに接続しようとすると、まったく同じ問題が発生しました。 RHELV5を実行しています。

uname -a

与える:

Linux localhost.localdomain 2.6.32-100.0.19.el5 
#1 SMP Fri Sep 17 17:51:41 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

いくつか掘った後、私はこれを見つけました:

Sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo

またはこれ:

Sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,inlcr,onlret,echo

ただし、ご指摘のとおり、screenコマンドを実行すると、選択したシリアルポート(この場合は/ dev/ttyS0)のエコー属性は次のように戻ります。

-echo  

これはコマンドで確認できます

Sudo stty -F /dev/ttyS0 -a

別のターミナルウィンドウ。

さらに、を使用して画面セッションから切り離すことを発見しました

ctrl-A d

再接続できないため、これは悪い考えです。典型的な呼び出しを見てみましょう::

[iceman@localhost ~]$ Sudo stty -F /dev/ttyS0 echo
[iceman@localhost ~]$ Sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
[detached]
[iceman@localhost ~]$ ps aux | grep SCREEN
root      3779  0.0  0.1  78476  2876 ?        Ss   11:05   0:00 SCREEN       /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
iceman    3781  0.0  0.0  61152   740 pts/6    S+   11:05   0:00 grep SCREEN
[iceman@localhost ~]$ screen -ls
No Sockets found in /var/run/screen/S-iceman.
[iceman@localhost ~]$ 

したがって、デタッチした画面セッションはまだ実行されていますが、screen-lsにはNADAが表示されます。/dev/ttyS0に接続された画面セッションがまだ稼働している間に、エコーの状態(上記でアクティブに設定されていた)を見てみましょう。/dev/ttyS0のステータスを確認すると、エコーがオフになっていることがわかります。

[iceman@localhost ~]$ Sudo stty -F /dev/ttyS0 -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 -cdtrdsr
-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
[iceman@localhost ~]$ 

そして最後に、他の方法で再接続を試みます。

[iceman@localhost ~]$ screen -x
There is no screen to be attached.
[iceman@localhost ~]$ screen -r
There is no screen to be resumed.
[iceman@localhost ~]$ 

小文字の「画面」を検索しても何も表示されないため、これは多くの無駄な時間の原因となる可能性があります。

重要:同じシリアルポートに複数の画面セッションがある場合、何が起こっているかを判断しようとすると、どのプロセスがシリアルポート割り込みを「キャッチ」するかに応じて、ランダムな結果になります。

Pakが言ったように、画面のエコーオプションは、何らかの理由でsttyに渡されません。実際、-echoまたはechoのどちらを使用するかに関係なく、/ dev /を使用して画面から呼び出されるとsttyは-echoに設定されます。指定されたシリアルポートとしてのttyS0。 (私はこれを確認しました)

私は次のようにミニコムを使用して解決策を見つけました:

Sudo minicom -s

次に、シリアルポートメニューで次のようにシリアルポートを設定します。

A -    Serial Device      : /dev/ttyS0
B - Lockfile Location     : /var/lock
C -   Callin Program      : 
D -  Callout Program      :  
E -    Bps/Par/Bits       : 115200 8N1
F - Hardware Flow Control : No 
G - Software Flow Control : No

次に、「ser1」として保存し、次のコマンドを使用します。

Sudo minicom ser1

これによりミニコムが起動し、次のものを使用できます。

ctrl-A E

ローカルエコーをオンにして

ctrl-A A

シリアルポートに到着するCR終了ASCIIにラインフィードを追加します。

Minicomは、そのバージョンを次のように報告します。

Welcome to minicom 2.1  

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n      
Compiled on Jun  6 2007, 06:02:15.

これがお役に立てば幸いです。少なくとも1人の他の人の時間と労力を節約できます。 LinuxでHyperTermに相当するものを設定するのがとても苦痛だと誰が思っただろうか?

7
Bob

picocom --baud 115200 --echo /dev/ttyUSB0をお試しください。

GUIツールが必要な場合は、PuTTYを試してください。[ターミナル]構成画面の[ラインディシプリンオプション]で、[ローカルエコー]を[強制オン]に設定します。

0
Markus Kuhn