私はおそらくあなたがすでに知っている多くのことをあなたに話しているでしょうが、そのような状況をデバッグすることは通常全体像を歓迎します。
問題1:従来のシリアル通信(純粋なRS-232)
シリアルポートのウィキペディアから:
コンピューティングでは、シリアルポートはシリアル通信の物理インターフェイスであり、情報は一度に1ビットずつ転送されます(パラレルポートとは対照的です)(...)「シリアルポート」という用語は通常、ハードウェアを多かれ少なかれ準拠していることを示しますモデムまたは同様の通信デバイスとのインターフェースを目的としたRS-232規格に準拠しています。(...)
RS-232のウィキペディアから:
電気通信では、RS-232は、DTE(データ端末装置)とDCE (データ回線終端装置)の間を接続するシリアルバイナリシングルエンドデータおよび制御信号の一連の規格の伝統的な名前です(...)
つまり、DTEはMacであり、DCEは「ハードウェアの一部」です。シリアル接続を設定するには、次のパラメータを設定する必要があります。
- ボーレート-達成可能な最大データ送信速度
- データビット-その多くのビットが1文字を構成します
- ストップビット-ストリーム同期
- パリティ-エラーチェック
たとえば、一部のPOSペリフェラルの一般的な値は9600/8/1 / noneですが、関連する唯一のことは、意図したとおりに動作するには、 DCEとDTEの両方がこれらのパラメータに対して同じ値を持っている必要があるということです。Mac / PCは事前定義された値のいずれかを使用できるため、選択する値を確認するには、「ハードウェア」のマニュアルを確認する必要があります。
これら2つの機器のいずれかに大きなボーレートセットがある場合は、反対側にゴミデータが表示されます。また、受信したゴミデータのサイズは、元の送信データのサイズよりも小さくなります。データビットが同じに設定されていない場合は、同じサイズのゴミデータも表示されます。ストップビットまたはパリティが同じでない場合はどうなるかわかりません。
そして、最も重要なこと-ハードウェアのプロトコルを-おそらく詳細に-意図したとおりに動作させるために知る必要があります。一般的に、RS-232通信とは、DCEとDTEの両方が一部のデータを処理してから、シリアルケーブルを介して一部のデータを送信することを意味します(双方向通信)。
ただし、現在、DCE側では当てはまらない可能性のあるDTE側でのマルチタスクに慣れていますが、データの処理中に「ハードウェア」がシリアルポートでリッスンできない可能性があります。その逆も同様です。つまり、他のデータの処理でビジー状態のときにデータを送信しようとすると、データを受信しません。
RS-232はマルチタスクよりも古いため(広く使用された時期を考えると、はるかに古い)、正しいアプローチはRS-232同期メカニズムを使用することです。双方向通信を2つの方向に分解してみましょう。
セットアップ(minicom、socat)から判断すると、おそらく何らかのシェル配管/リダイレクトを使用しているため、シェルからワイヤの状態を読み取る方法がわかりません(ただし、可能である必要があります)。私のようなシェル/OSアーキテクチャの素人にとって、それは本当に甘い問題ですが、残念ながら私にはそれを試すためのDCEがありません:(
Javaの単純なシリアルコネクタのようなプログラムライブラリを使用すると、ブール変数の値を読み取るのと同じくらい簡単になります。
問題2:適応シリアル通信(RS-232からUSB)
私はこれらのうちの2つ(異なるベンダー)、RS-232およびUSBコネクタ付きのケーブルとハードウェアアダプタ(通常はシリアルコネクタ側)を見ました。マニュアルも、動作の説明もありませんが、「serial-to-usb」というフレーズが付属しています。それらの1つは期待どおりに機能しませんでした。たとえば、「シリアルからUSB」であるにもかかわらず、ワイヤの状態が正しく転送されていませんでした。この状況で行うことはあまりありませんが、機能するものを取得するためです。
結論
バイトがTCPポートに到達すると、正しく転送されます。socatは非常に複雑なプログラムであるため、設定を誤った可能性があります。繰り返される行と文字は、シリアル接続の設定ミスよりもそれを示しています。ただし、TCPポートへの「ハードウェアの一部」が機能していると述べているため、TCPポートからのデータが正しく構成されていない可能性もあります。
ただし、最初に「ハードウェアの一部」と通信するためのプロトコルを知っていることを確認する必要があるため、TCPポートからのデータをシミュレートし、シリアルポートに直接送信することをお勧めします。たとえば、シリアルポートを介して「ハードウェアの一部」と直接通信するいくつかの基本的なコマンドを使用してシェルスクリプトまたはプログラムを作成します。それが意図したとおりに動作することが判明した場合は、問題がsocatにあるか、おそらくTCPポートからのデータにあることがわかります。私はあなたがあなたの「ハードウェアの一部」のためのマニュアルを持っていることを望みます:)
pls、フィードバック。