答え1
シリアル接続を介して双方向にバイトをそのまま転送するには、システムからttyラインルールを切り離すか、次を実行して端末デバイスとして使用されないことをシステムに通知する必要があります。
stty raw -echo < /dev/ttyS2
あなたの場合、onlcr
出力からLFをCRLFに変換することは、ttyデバイスでデフォルトで有効になっている属性です。無効にできます。みんな出力処理ocrnl
にはが含まれますが、stty -opost
これによりデータへのすべての入力処理が異なる方向に送信されます。
echo
どのシェルまたは実装を使用しているかは表示されませんが、オプションは標準ではなく、引数printf
に含まれる項目や時期に対する動作が指定されていません。-n
-e
printf
echo
\x
printf
型パラメータのいくつかの実装は、\xHH
値が0xHHのバイトに拡張されます。
その中で
printf "\xAA\xEE\x0A\x%02x" $i
\xAA
はバイト0xAAに拡張され、forは文字通りまたは欠落している16進数について文句を言い、\x
バイト0に拡張されます。\x
たとえば、あなたはinで終わります<0xaa><0xee><LF>\x01
。$a
一部echo
の実装では\xHH
シーケンスを解釈することもあります(一部はオプションを渡すときのみ-e
)。
ここで移植性が必要な場合は、次のようにします。
a=$(printf '\\252\\356\\012\\%03o' "$i")
printf "$a" > /dev/ttyS2
または:
a=$(printf '\\0252\\0356\\0012\\0%03o' "$i")
printf %b "$a" > /dev/ttyS2
(標準は、フォーマットの8進数シーケンスだけでなく、一部の実装で使用または使用されない可能性がある拡張タイプをエミュレートするように設計されたフォーマットをサポートし、printf
8進数シーケンスはで表されます。)\ooo
%b
echo
-e
\0ooo
また、最初の項目がNULバイトを印刷していないことを確認したいと思いますprintf
。なぜなら、シェルはそれ以外の変数にNULバイトを格納できないからです(例えば、zsh
そうしないでください)。a=$(printf '\0 or \x00 or \u0000')
そしてzsh
:
bytes=(0xaa 0xee 0x0a $i)
set +o multibyte
printf %s ${(#)bytes} > /dev/ttyS2
このデータは、次のいずれかの方法で変数に保存できます。
printf -v data %s ${(#)bytes}
または
data=${(#j[])bytes}
しかし、より一般的には、任意のバイト値でデータを操作するには、おそらく適切なプログラミング言語を使用する必要がありますperl
。python
。
xxd
別の方法は、バイナリ形式とテキストの16進ダンプの間を前後に変換するための同様のツールを使用することです。
printf aaee0a%02d "$i" | xxd -p -r > /dev/ttyS1