shスクリプトを使用して16進データを/ dev / ttyUSB0に送信する方法は?

shスクリプトを使用して16進データを/ dev / ttyUSB0に送信する方法は?

私はbashをサポートせず、sshターミナルでshだけをサポートするペアである組み込みLinuxインストールを使用しています。接続したUSBデバイスに16進データを送信する必要があります/dev/ttyUSB0。 bash(Ubuntu 18.04デスクトップインストール)では簡単にこれを行うことができますが、echo -en '\x01\x02\x03' > /dev/ttyUSB0shはバックスラッシュエスケープをサポートしていないようです。 shを使用してこれを行う比較的単純な(またはそれほど簡単ではない)別の方法はありますか?

残念ながら$SHELL --version何も返されません。カーネルバージョンは4.1.0です。

答え1

これが理由の一つですprintfがechoより良い理由echoオプションとバックスラッシュエスケープをサポートするかどうかは実装によって異なりますが、すべてのバージョンはprintfバックスラッシュエスケープをサポートする必要があります。

唯一の問題は、標準のような8進数のエスケープ\001しか\x01ないのでprintfprintf "\x01"

それでも機能しない場合は、8進数に切り替える必要があります。プログラマの電卓を使用してオフラインで変換を実行するか、printf "%o\n" "0x61"変換などを使用するか、次のものを使用して文字列を一括変換します。

echo 'foo\x01\x61' | perl -pe 's/\\x([0-9a-fA-F]{2})/sprintf("\\%03o", hex($1))/ge'

(それは与えなければならないfoo\001\141

答え2

/スラッシュとバックスラッシュを混ぜています\

エスケープはバックスラッシュを通して行われます。

echo -en '\x01\x02\x03' > /dev/ttyUSB0

答え3

最後に、Ubuntuデスクトップを使用してバイナリを作成しました。

echo -en '\x01\x02\x03' > binary.file

その後、Ash Shellを実行しているシステムにバイナリをコピーし、スクリプトのファイルをUSBにコピーしました。

cat binary.file > /dev/ttyUSB0

バイナリセットを作成する中間ステップなしでこれを行うためのより良い方法があると思いますが、現在は可能です。

関連情報