SSHを使用するのと同じくらい簡単にシリアルポートに接続する方法は?


86

SSHを使用するのと同じように、シリアル端末に接続する方法はありますか?このようなMinicomなどのツールよりも簡単な方法が必要です

$ serial /dev/ttyS0 

cat出力ができることは知っています/dev/ttyS0が、ポートからコンソールへの通信はその方法でのみ可能です。そして、echoポートへの出力ポートに、ちょうど同じですが、周りに他の方法です。

Unix / Linuxで可能な限り簡単な方法でシリアルポートとの双方向通信を実現するにはどうすればよいですか?


2
すばらしい答えは人々!。残念ながら、限られたコマンドセットで組み込みシステムを使用する場合、私の目的に完全に合致する人はいないようです。しかし、シェルスクリップを使用して別の方法を見つけましたが、これを質問の答えの1つとして追加しました。
ihatetoregister

回答:


69

screenとにかく他のものに使用するので、シリアル通信に最も便利なプログラムを見つけます。screen /dev/ttyS0 <speed>デフォルト設定はデバイスによって異なる場合がありますが、通常は単にです。また、コマンドモードを開始してを実行することで、セッションに何でもパイプすることができますexec !! <run some program that generates output>


3
画面の+1!また、以下を参照してください。serverfault.com/q/81544/11086
ジョシュ・

1
noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminalとstty(1)のマニュアルページも参照してください。動作させるために追加のオプション(パリティなど)を追加する必要がありました。
Lekensteyn

3
TX / RXを誤って接続したことを恥ずかしく思います:o
Lekensteyn

screen素晴らしいですが、私はよりそれは単純にそれを考えていないminicom:-)
チロSantilli新疆改造中心法轮功六四事件

1
@CiroSantilli刘晓波死六四事件法轮功-画面はMinicomよりも単純ではないかもしれませんが、私は既にScreenを使用しているため、私にとってはScreenでシリアルスタッフを行うことでMinicomの必要性を完全に排除できます。
イエティ

48

バックグラウンド

あなたが必要とする主な理由の任意のプログラムが好きなminicomシリアルポートを介して通信するためには、ポートがする必要があるということである設定、接続を開始する前に。適切に設定されていなかった場合catechoコマンドとコマンドは期待どおりの結果をもたらさないでしょう。のようなプログラムを実行するminicomと、ポートにはminicom使用した設定が残っていることに注意してください。次のsttyようなプログラムを使用して、通信設定を照会できます。

stty < /dev/ttyS0

あなたがそれを正しくやったなら; コンピューターの起動後minicom,、通信設定などの他のプログラムを実行する前は、デフォルト設定になります。これらはおそらく、接続に必要なものとは異なります。この状況では、コマンドcatまたはechoポートに送信すると、ゴミが生成されるか、まったく機能しません。

を使用sttyした後に再度実行minicomすると、プログラムが使用していた設定が設定されていることがわかります。

最小限のシリアル通信

基本的に、シリアルポートを介した双方向通信には2つのことが必要です。1)シリアルポートを構成し、2)擬似tty読み取り/書き込みを開きます。

私が知っている最も基本的なプログラムはこれですpicocomsetserialポートを設定し、シェルから直接操作するなどのツールを使用することもできます。


5
picocomまた、シリアルポートに再構成せずに接続できるようにし(--noinit)、シリアルポート構成を復元せずに終了できるようにします(--noresetまたはCtrl-A/ Ctrl-Qを使用して終了しますpicocom)。をpicocom使用するよりもはるかに使いやすいことがわかりましたminicom。私が理解していなかった理由のために、minicomはいつか前に機能していたポートやpicocomに問題がないポートでデータを送受信しない場合があります。恐らく難解な設定オプションかもしれませんが、それが何であれ、私はそれを理解することができません(そして、この動作は複数のマシンで起こりました)。
マイケルバー

+1 for picocom!正しい行末なしにコマンドをシリアルデバイスに書き込むことができないことがわかりました。--omap crcrlf --echoオプションを使用する必要がありました
user2561747

24

UUCPがシステムにインストールされている場合、コマンドcuを使用できます。例えば

 $ cu -l /dev/ttyS0 -s 9600

~^Dまたは~.を使用して終了します。
イマン

24

ここでシェルスクリプトを使用してcat、ユーザー入力を読み取りecho、ポートに出力するバックグラウンドプロセスとwhileループを使用する方法を見つけました。私はそれをより一般的なものに修正し、私の目的に完全に適合しました。

#!/bin/sh

# connect.sh

# Usage:
# $ connect.sh <device> <port speed>
# Example: connect.sh /dev/ttyS0 9600

# Set up device
stty -F $1 $2

# Let cat read the device $1 in the background
cat $1 &

# Capture PID of background process so it is possible to terminate it when done
bgPid=$!

# Read commands from user, send them to device $1
while read cmd
do
   echo "$cmd" 
done > $1

# Terminate background read process
kill $bgPid

1
また、下に少し修正したバージョンを作成しました。これは、Ctrl + CとCtrl + Zも送信できます。
フリッツ

@Fritz素敵な発見!したがって、私がこれを正しく行えば、$?何にも拡張されていないようです。
ihatetoregister

1
@ihatetoregister:まったく正しくありません。バックグラウンドプロセスは強制終了されますが、予想される理由ではありません。$?最後の非バックグラウンドコマンド(この場合stty -F $1 $2)の終了コードに展開されるため、エラーが発生しなかった場合は0に展開されます。したがって、最後の行はkill 0、現在のシェルとそのすべての子を殺すように見えます(インタラクティブシェルでは異なる動作をします)。すべての詳細については、次の説明を参照してください。unix.stackexchange.com
Fritz

1
ただし、スクリプトの本当の落とし穴は、Ctrlキーを押しながらDキーを押してスクリプトを終了した場合にのみ、バックグラウンドプロセスが強制終了されるwhileことです。Ctrl + Cまたはkillコマンドを使用して強制終了すると、catプロセスは存続します。これを修正trapするkill $bgPidには、以下のスクリプトのように、シェルが終了したときに実行するコマンドを使用する必要があります。正直なところ、私のスクリプト全体を投稿に追加してもかまいません。私はそれを試みましたが、編集は拒否されました。
フリッツ

接続の出番があなたの答えでコメントアウトされてますが、明確にしてくださいでした
クリスHalcrowを

14

http://tio.github.ioを試してください

「tio」はシンプルなTTY端末アプリケーションで、簡単なコマンドラインインターフェイスを備えており、基本的な入出力のためにTTYデバイスに簡単に接続できます。

通常の使用にはオプションがありません。例えば:

tio /dev/ttyS0

一般的に使用されるオプションに対応します:

tio --baudrate 115200 --databits 8 --flow none --stopbits 1 --parity none /dev/ttyS0

すべてのオプションに対して完全なシェル自動補完サポートが付属しています。


3
私が使用しているmsys2Windows上で、あなたがインストールすることができtiopacman -S tio、それはデフォルトで利用可能なパッケージの中だからです。screenpicocomなどはありません。ありがとう!
コハニーロベルト

12

このスクリプトは別の回答に基づいていますが、単一のコマンドの後に続くだけではなく、すべてをシリアルポート(Ctrl + Qを除く)で送信しますEnter。これにより、リモートホストでCtrl + CまたはCtrl + Zを使用し、aptitudeやalsamixerなどのインタラクティブな「GUI」プログラムを使用できます。Ctrl + Qを押すと終了できます。

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Usage:"
    echo "  femtocom <serial-port> [ <speed> [ <stty-options> ... ] ]"
    echo "  Example: $0 /dev/ttyS0 9600"
    echo "  Press Ctrl+Q to quit"
fi

# Exit when any command fails
set -e

# Save settings of current terminal to restore later
original_settings="$(stty -g)"

# Kill background process and restore terminal when this shell exits
trap 'set +e; kill "$bgPid"; stty "$original_settings"' EXIT

# Remove serial port from parameter list, so only stty settings remain
port="$1"; shift

# Set up serial port, append all remaining parameters from command line
stty -F "$port" raw -echo "$@"

# Set current terminal to pass through everything except Ctrl+Q
# * "quit undef susp undef" will disable Ctrl+\ and Ctrl+Z handling
# * "isig intr ^Q" will make Ctrl+Q send SIGINT to this script
stty raw -echo isig intr ^Q quit undef susp undef

# Let cat read the serial port to the screen in the background
# Capture PID of background process so it is possible to terminate it
cat "$port" & bgPid=$!

# Redirect all keyboard input to serial port
cat >"$port"

7

ところで、パテパッケージ(Linux上で実行されます)にはシリアルサポートが含まれています。


4

発生する可能性がある別の問題は、ユーザーアカウントがシリアルポートにアクセスするために「ダイヤルアウト」グループに設定する必要がある場合があることです。

sudo usermod -a -G dialout $USER

3

PuttyはLinux上でうまく機能し、特にシリアル通信の場合に便利です。私が直接解決できなかった欠点が1つあります。それは、Puttyウィンドウ自体からのコピーアンドペーストができないことです。Windowsバージョンには、ハイライトのクリップボードへの自動コピー、右クリックによる貼り付け動作(および同じ動作を可能にするchromeとfirefoxの両方に優れたプラグインがあります)がありますが、Linuxでは、コピーはあまり好きではありません。

コピーの不足が問題である場合(私にとっては)、パテでのログインをオンにして、標準のターミナルウィンドウを開くと、# tail -f putty.log標準のcopypastaアクションで双方向テキストを使用できます。


1
LinuxでのPuttyは「クリップボード」(control-Cでコピーしたもの)を貼り付けませんが、ミドルマウスで「プライマリ選択」(プログラムで現在選択したもの)を挿入します。同様に、Puttyの画面で文字を選択して、プライマリ選択を定義できます。しかし、Putty画面のテキストを何らかのVMに転送するには、クリップボードにする必要があるため、中間プログラムを使用してメイン選択からテキストを受信し、クリップボードにコピーする必要があります。
カーディフスペースマン


2

何をしたいかによって異なります。端末からシェルまたはアプリケーションをインタラクティブに実行し、シリアル回線を介して別のコンピューターに接続し、シリアルポートを介したデバイスとの通信を自動化しますか?

双方向通信が必要な場合は、端末で人間と対話する何かが必要だと思います。シリアルポートでgetty(1)セッションを設定することにより、シリアルポートを介した端末からのログインを許可するようにシステムを設定できます-getty は端末を設定してログインを許可するツールです。inittab(5)ファイルにエントリを追加して、適切なシリアルポートで実行しrespawnます。

デバイスに接続し、自動化された双方向の会話を開始したい場合は、期待どおりの結果が得られるかどうかを確認できます。使用のstty(1)を右パリティ、ボーレートおよびその他の関連する設定にポートを設定します。

シリアルポートを介して別のコンピューターと対話的に通信する場合は、ターミナルエミュレーションソフトウェアが必要です。これは非常に多くのことを行います-それはポートを設定し、ANSIまたは他の端末コマンドシーケンスを解釈します(ANSIはシリアル端末でサポートされる唯一の標準ではありませんでした)。多くの端末エミュレーターは、kermitやzmodemなどのファイル転送プロトコルもサポートしています。

シリアル通信と端末I / Oの入出力はかなり複雑です。シリアルハウツーのテーマについて知りたいと思った以上のものを読むことができます


1

あなたは見てみたいかもしれません

http://serialconsole.sourceforge.net

プロ:あなたは、ユーザーがアクセス、何の問題をシェル与える問題はありませんが、あなたが最も可能性が高い場合(minicomのかpicocomのような明らかなセキュリティ上の問題を持っていないあなたはターミナルサーバを設定したい場合は、1つを持っています... )


1

デバイスで正しい読み取り/書き込み許可を持っていることを確認する必要があります。次のようにして確認できます。

$ls -l /dev/[serial device]

私はあなたが見つけたスクリプトに依存し、いくつかの変更を加えました。

私が今まで使用した開発システムでは、以前は次のものが必要でした。

  • パリティなし
  • ワンストップビット

これらの値は、スクリプトのデフォルト値です。

したがって、接続するには、次のように簡単に使用できます。

./connect.sh /dev/[serial device] [baud speed]

例:

$./connect.sh /dev/ttyUSB0 19200

脚本:

#!/bin/bash

# connect.sh


#Taken from example modified by: ihatetoregister
# On stack exchange, thread:
# http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh
# Modified by Rafael Karosuo <rafaelkarosuo@gmail.com>
#   - parity enabling and amount of stop bits
#   - no execution without minimum params
#   - exit code for stty
#   - bgPid fix, used $! instead of $? to take the PID of cat proc in background.
#   - exit command to end the program
#   - CR termination and strip of NL added by READ command, in order to make $cmd\r\n format instead of \n$cmd\n


# Usage:
# $./connect.sh <device> <port speed> [# Stop bits] [parity]

# Stop bits 1|2
# Parity even | odd

# If no last two params, then default values stopbits=1, parity=disab

# Example: 
# connect.sh /dev/ttyS0 9600 1 even, this will use 1 stop bit and even parity
# connect.sh /dev/ttyS0 9600, this will take default values for parity and stopbit


#Check if at least port and baud params provided
if [ -z "$1" ] || [ -z "$2" ]; then
    printf "\nusage: ./connect.sh <device> <port speed> [# Stop bits 1|2] [parity even|odd]\n\tNeed to provide at least port and baud speed parameters.\n\texample:connect.sh /dev/ttyS0 9600\n\n"
    exit 1;
else
    case "$3"   in
        2) stopb="cstopb";;
        *) stopb="-cstopb";;
    esac

    if [ "$4" = "even" ]; then
        par="-parodd"
    elif [ "$4" = "odd" ]; then
        par="parodd"
    else
        par="-parity"
    fi
    printf "\nThen stty -F $1 $2 $stopb $par\n";
fi

# Set up device
stty -F "$1" "$2" "$stopb" "$par" -icrnl

# Check if error ocurred
if [ "$?" -ne 0 ]; then
    printf "\n\nError ocurred, stty exited $?\n\n"
    exit 1;
fi

# Let cat read the device $1 in the background
cat -v "$1" &

# Capture PID of background process so it is possible to terminate it when done
bgPid="$!"

# Read commands from user, send them to device $1
while [ "$cmd" != "exit" ]
do
   read cmd
   echo -e "\x08$cmd\x0D" > "$1" #strip off the \n that read puts and adds \r for windows like LF

done

# Terminate background read process
kill "$bgPid"

PS: LFのようなWindowsが必要な場合、コマンドを送信する方法が決定されるため、受信機システムを使用しているラインフィードの種類を知る必要があります。つまり、送信する必要があるということです。

command\r

以下のASCII値

  • LF:0Ah、改行「\ n」
  • CR:0Dh、carrige return "\ r"
  • BS:08h、バックスペース「<-」

1
(1)  #!/bin/shファイルの最初の行でない場合は無視されます。(2)真剣に?偶数パリティと奇数を指定する1ために使用していますか?(3)必須のパラメーターだけでなく、すべてのパラメーターを文書化する「使用法」または「ヘルプ」メッセージを表示するのが一般的です。(4)あなたはいつもあなたのシェル変数の参照を引用すべきである(例えば、、、、、、、、とさえと)あなたがいないのに十分な理由を持っている、とあなたは何をやっている知っている確信している場合を除きます。2"$1""$2""$3""$4""$stopb""$par""$bgPid""$?""$!"
スコット

1

ここではまだ言及されていないためsocathttps://stackoverflow.com/questions/2899180/how-can-i-use-com-and-usb-ports-within-cygwinの詳細も言及します

socat `tty`,raw,echo=0 /dev/ttyS15,raw,echo=0,setsid,sane

または

socat - /dev/ttyS15,raw,echo=0,setsid,sane

(ただし、WindowsのMSYS2で実行を開始すると停止する問題がありました)


1

誰もser2netに言及していないのだろうか。

/etc/ser2net.conf

3000:telnet:600:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT
3001:telnet:600:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT
3002:telnet:600:/dev/ttyUSB2:115200 8DATABITS NONE 1STOPBIT
3003:telnet:600:/dev/ttyUSB3:115200 8DATABITS NONE 1STOPBIT

次のように簡単にシリアルポートに接続できます。

telnet localhost 3000

またはリモートで:

telnet <ip> 3000

または、ルーターにポートフォワーディングを設定してインターネットに公開し、どこからでも接続できるようにします(セキュリティの問題をスキップして、柔軟性について説明します)。


0

別の簡単なオプションは、-Xフラグを使用してssh経由でマシンにアクセスし、puttyやgtktermなどのプログラムを実行することです。

そう:

$ ssh -X <user>@<machine_address>

$ sudo apt-get install gtkterm (if not installed already)

$ gtkterm

クライアントPCでグラフィカルインターフェイスが起動し、そこからホストにいるかのようにシリアルポートにアクセスできます。

免責事項:これはubuntuマシンでのみ試しました。グラフィックインターフェイスのないマシンでは動作しないと思います。

sshマニュアルから:

-バツ

X11転送を有効にします。これは、構成ファイルでホストごとに指定することもできます。X11転送は注意して有効にする必要があります。リモートホスト(ユーザーのX認証データベース用)でファイルアクセス許可をバイパスできるユーザーは、転送された接続を介してローカルX11ディスプレイにアクセスできます。その後、攻撃者はキーストロークモニタリングなどのアクティビティを実行できる可能性があります。このため、X11フォワーディングは、デフォルトでX11 SECURITY拡張の制限を受けます。詳細については、ssh -Yオプションおよびssh_config(5)のForwardX11Trustedディレクティブを参照してください。

-Y

信頼できるX11転送を有効にします。信頼されたX11転送は、X11 SECURITY拡張制御の対象ではありません。

そのため-Y、セキュリティが問題になる場合に使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.