シリアル接続を介したファイルのコピー

シリアル接続を介したファイルのコピー

したがって、私が達成しようとしているのは単純なようですが、プリインストールされていない外部ユーティリティやライブラリを使用せずにこれを行う方法を見つけることができないようです。

Linux(モデルに応じてカーネル3.x)を実行する組み込みシステムがあります。ここでは、ほとんどのGNUコアユーティリティ(cat、sed、ls、tarなど)にアクセスできます。たとえば、screenを使用して
シェルセッションにアクセスできます。/dev/ttyUSBx

screen /dev/ttyUSB0 9600 

私がscreenを実行しているコンピュータ(私たちと呼ばれるsource)にはArchLinuxがインストールされており、インターネットにアクセスできます。私がアクセスしようとしている組み込みシステム(私たちが呼ぶ)
は、ネットワークアクセスがなくシリアルポートのみを持つLinuxボックスです。バイナリをターゲットの特定の場所にコピーし、cron操作で一部のハードウェア(この場合はFPGA)を自動的にフラッシュできる必要があります。実際にソフトウェアをインストールすることはできず、小さなシェルスクリプトしか作成できません。 scpと同じ動作を達成するためにPOSIXシェル方式を使用できますが、sshの代わりにインターフェイスを介して使用できることをご存知ですか?target/dev/ttyUSBx

target
/dev/ttyUSBx

私はパイプとファイルのリダイレクトを使って次のことを考えました。 -
上記のバイナリcatファイルをリダイレクトし、ストリームをファイルにリダイレクトします。どのように始めるべきかさえわかりません。私が使用しなければならないプロジェクトは明日の締め切りですが、今は迷子になり、どんなアイデアでも歓迎します。シェルスクリプトで直接使用できる標準のPOSIXツールが望ましいです。/dev/ttyUSBxsource
target

ソリューションをコンパイルする必要がある場合に備えて、ターゲットからgccにアクセスできますが、コンパイルがtarget非常に遅く、複数のコンピュータに展開するにはより多くの労力が必要であるため、まだシェルソリューションを好みます。

私の目標は、このワークフローを自動化することです(ユーザーの対話をできるだけ少なくします)。targetファイルシステムをNFSとしてマウントするのと同じことがありますか?

答え1

1つの可能性は、バイナリファイルをASCIIテキストにエンコードするか、従来の方法を使用することです。ユーエンコーディング、または少しより現代的なものbase64。プログラムはソフトウェアパッケージでuuencode提供されます。uudecodeサルティスbase64位置は次のとおりです。コアツールbase64最新のGNU / Linuxディストリビューションにすでに登場している可能性が高くなります。

バイナリファイルをエンコードした結果は大量のテキストであり、原則として端末接続を介してデコーダにコピー/貼り付けることができますtarget。大容量データの場合、クリップボードを使用することは実用的ではないかもしれませんが、ツールを使用してscreenファイルの内容を端末に貼り付けることができます。

  1. 立ち上がりsource、走りなさいbase64 FILE > FILE.b64
  2. screenリンクされたセッションでtargetCtrl-Aと入力します:readreg p /path/to/FILE.b64。 (screenコントロールキーがCtrl-Aでない場合は、そのキーを入力してください。)FILE.b64へのフルパスを提供する必要があるようです。 ~が動作しません。画面には、「バッファに26665052文字を入れている」などの内容を報告する必要があります。
  3. コンソールからをtarget実行しますbase64 -d > FILE
  4. Ctrl-Aと入力します:paste p
  5. Ctrl-Dと入力します。

この問題に対するもう一つの長期的な解決策は次のとおりです。モデム、端末接続を介してファイルを転送する古代の方法です。多くのターミナルエミュレータには、lrzszパッケージがインストールされている限り、KonsoleなどのZModemのサポートが組み込まれています。しかし、lrzszがインストールされていない可能性が高いので、base64を使用する方が良いでしょう。

これらの方法はすべて、当時コンソールで使用されているシリアルリンクを介してファイルを転送する問題を解決します。コンソールが必要ない場合は、targetリンクの内容をファイルにダンプする方が簡単です。しかし、シリアルコンソールがデバイスと対話する唯一の方法であれば問題になります。

答え2

これまでのすべての応答に基づいて、インストールされているユーティリティを考慮してスクリプトをtarget実行するだけで機能するソリューションを見つけましたsource。スクリプトは次のとおりです。

dest="/dev/$(dmesg | grep "now attached to ttyUSB" | awk '{print$NF}' | tail -1)"
cat binfile | gzip | base64 > binfile.64.gz
md5=$(md5sum binfile | awk '{print $1}')
printf "\necho \"[ \\\$(md5sum <target-dir>/binfile | awk '{print \\\$1}') == %s ] &&\\ 
<flashing commands>\" > <target-dir>/flash.sh\n" \
    "$md5" \
    > "$dest"
printf " echo \"%s\" | base64 -d | gunzip > <target-dir>/binfile &&\\
/bin/sh <target-dir>/flash.sh
" "$(cat binfile.64.gz)" \
    > "$dest"

リフレッシャーを送信し、ソースとターゲットのbinファイルのチェックサムが同じであることを確認し、
binファイルを圧縮してエンコードして
送信し、
リフレッシャーを使用してカードを更新します。エンコード/デコードに中断がある場合は、ターゲットをフラッシュしないでください。単純な再起動だけでシステムをデフォルト状態に戻すため、他の問題が原因でシステムに問題が発生する可能性はほとんどありません。

以下は、プロセスの完全な実装へのリンクです。
https://github.com/Soulthym/cycloneV-serial-flasher

関連情報