編集:ここにいくつかの提案と追加の調査を行った後、現在の状況は次のとおりです。
4バイトのグループで入力を受け取り、4〜8バイトのグループで応答を出力するシリアルデバイスがあります。
0x01010000は、シリアルデバイスに送信する最初のコマンドです。
0x01fef40b0201080bが正しい出力であることを知っています。走れば
echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp
シリアルデバイスを接続した後、私はいつも次のような結果を得ます。
0000000 01fe f40b 0201 080b
出力に(0の最初のバッチはから来るhexdump
)すべてがうまく動作します。
しかし、私が走ると
socat -,raw /dev/ttyUSB0,raw,echo=0,b19200
Raspberry Piのターミナルから直接
echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp
他の端末では(やはりRaspberry Piに直接あるので、ここで問題が発生する可能性のあるSSHはありません!)出力はありません。
0000000 01fe f40b 0201 080b
これ以上ではありません。代わりに私も
- 出力なし
0000000 01fe 0002
or0000000 0b02 0008
またはor ...のようなものを取得します0000000 01fe 08f4
。 (したがって常に間違っており、予想よりも短い)- 次のようなものが得られます
0000000 01fe 0b02 0008
(同じですが、今回は3バイト)。 - または似ていますが、短すぎて間違ったものを入手してください。
したがって、シリアルデバイスに何も送信せず(少なくとも明示的に)ブートすると、何かが中断され、socat -,raw /dev/ttyUSB0,raw,echo=0,b19200
間違った出力が出るようです。まるで何かが送信され、一種のオフセットを引き起こしたようなものです。 (これがすぐに応答が突然なった理由です。短すぎます)。
しかし、私は実行しましたが、strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200
出力にどのコマンドも見つからないので、write
何を期待するのかわかりません。
だからこれは状況を破るように見えますが、socat
それが何であるかはまったくわかりません。そしてsocat
WindowsプログラムやSSHの介入なしに純粋に見えます。
socat
編集2:入力せずに実行すると、開いているstrace
代わりに終了することがわかりました。
strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200 > strace3
だから私が走るとき
echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp
今回もすべてがうまくいくようです。したがって、socat
何かが破壊されない場合は、入力が提供されたためではなく、開いている状態を維持せずに終了するためです。
次のシナリオを考えてみましょう。
- 私たちはWindows PCを持っています(心配しないでください。これは方程式の最も小さい部分ですが、見てわかるようにまだ重要な詳細です)。
- シリアルデバイスがあります。
- かなり最近のRaspbianを実行しているRaspberry Piがあります。
私たちは、Windows PC上のプログラムがSSHを介してシリアルデバイスに接続されることを望んでいます。つまり、デバイスがCOM経由で接続されているかのようにSSHを介して同じデータを送信し、デバイスがデバイスが接続されているかのようにSSHを介して同じデータを受信する必要があります。 COM接続を介した接続は同じです。
私のソリューションのアイデアにはRaspberry Piが含まれます。 Raspberry Piに接続されたシリアルデバイス。 Raspberry PiにはSSHユーザーに表示されるプロンプトはなく、直接実行できるログインbashスクリプトがあります。画面事前にコンソール出力なしで接続するときにシリアル端子を直接起動するように、シリアルポートに端末を接続します。このように、SSH接続はシリアルデバイスへの直接トンネルとして機能できると考えました。
ただし、この構成では、シリアルデバイスにコマンドを送信したときに返される内容は、期待したものとは異なることがわかりました。
今私の質問は次のとおりです。
- SSHはとにかくテキスト文字を予想してバイト文字列を処理できないため、これは失敗しますか?0x0000入力として?これが本当かどうかはわかりませんが、私が持っていた考えだけです。
- WindowsシステムでSSHを実行しています。-ttバナー。そうしないと、sshのstdoutから読み込み、そのstdinに書き込むことができるように、sshプロセスと私のプログラムプロセスでstdinとstdoutをパイプできません。 -ttが問題を引き起こす可能性がありますか?
- それとも、これを行う方法についての私の考えは最初から完全に間違っていましたか?
次の解決策に頼ることはできないことに注意してください。再直列化PCがWindows上で動作するため、トンネリングのためのものです(これがこの詳細が重要な理由です)。
時間をかけてこの記事を読んでくれてありがとう。この記事を他の場所に投稿する必要があるかどうか教えてください。