4

Prolific Serial to USBケーブルで接続されたハードウェアがあり、socatを使用してこれとTCPポートとの間でトラフィックを送受信する必要があります。これまでのところ、インストールされており、以下を使用してminicomで正常に動作します。

minicom -D /dev/tty.usbserial -b 9600

Socatは、以下を使用してTCPポートに対して一方向に機能します。

socat /dev/tty.usbserial,clocal=1,nonblock=1,cread=1,cs8,ixon=1,ixoff=1 TCP4:localhost:8080

どうすれば双方向で動作させることができますか?シリアル設定が正しくないことを示唆する文字の繰り返しや二重線がよく見られますか?

ありがとう!クリス

編集:いくつかのサンプルコード(実際には双方向では機能しません)。

Chris-MacBookAir:~ chrisbridges$ socat -d -d - /dev/tty.usbserial,clocal=1,nonblock=1,cs8,ixon=1,ixoff=1,ispeed=9600,ospeed=9600,icanon=1
2013/01/09 13:13:34 socat[8501] N reading from and writing to stdio
2013/01/09 13:13:34 socat[8501] N opening character device "/dev/tty.usbserial" for reading and writing
2013/01/09 13:13:34 socat[8501] N starting data transfer loop with FDs [0,1] and [3,3]
4

2 に答える 2

4

私はおそらくあなたがすでに知っている多くのことをあなたに話しているでしょうが、そのような状況をデバッグすることは通常全体像を歓迎します。

問題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つの方向に分解してみましょう。

  • DTE(Mac)=> DCE(hwの一部):DTEはRTS(送信要求)ワイヤーをアクティブにし、DCEがCTS(送信許可)ワイヤーをアクティブにするまで待機します。次に、データを送信します。

  • DCE(hwの一部)=> DTE(Mac):DCEはDSR(データセット対応)ワイヤをアクティブにし、DTEがDTR(データ端末対応)ワイヤをアクティブにするまで待機します。次に、データを送信します。

セットアップ(minicomsocat)から判断すると、おそらく何らかのシェル配管/リダイレクトを使用しているため、シェルからワイヤの状態を読み取る方法がわかりません(ただし、可能である必要があります)。私のようなシェル/OSアーキテクチャの素人にとって、それは本当に甘い問題ですが、残念ながら私にはそれを試すためのDCEがありません:(

Javaの単純なシリアルコネクタのようなプログラムライブラリを使用すると、ブール変数の値を読み取るのと同じくらい簡単になります。

問題2:適応シリアル通信(RS-232からUSB)

私はこれらのうちの2つ(異なるベンダー)、RS-232およびUSBコネクタ付きのケーブルとハードウェアアダプタ(通常はシリアルコネクタ側)を見ました。マニュアルも、動作の説明もありませんが、「serial-to-usb」というフレーズが付属しています。それらの1つは期待どおりに機能しませんでした。たとえば、「シリアルからUSB」であるにもかかわらず、ワイヤの状態が正しく転送されていませんでした。この状況で行うことはあまりありませんが、機能するものを取得するためです。

結論

バイトがTCPポートに到達すると、正しく転送されます。socatは非常に複雑なプログラムであるため、設定を誤った可能性があります。繰り返される行と文字は、シリアル接続の設定ミスよりもそれを示しています。ただし、TCPポートへの「ハードウェアの一部」が機能していると述べているため、TCPポートからのデータが正しく構成されていない可能性もあります。

ただし、最初に「ハードウェアの一部」と通信するためのプロトコルを知っていることを確認する必要があるため、TCPポートからのデータをシミュレートし、シリアルポートに直接送信することをお勧めします。たとえば、シリアルポートを介して「ハードウェアの一部」と直接通信するいくつかの基本的なコマンドを使用してシェルスクリプトまたはプログラムを作成します。それが意図したとおりに動作することが判明した場合は、問題がsocatにあるか、おそらくTCPポートからのデータにあることがわかります。私はあなたがあなたの「ハードウェアの一部」のためのマニュアルを持っていることを望みます:)

pls、フィードバック。

于 2013-01-10T00:40:32.000 に答える
4

助けてくれてありがとう。私は今それを解決し、うまく通信することができます。Socatは確かに複雑なツールです。これが私の最終設定です:

sudo socat -U -d -d -d /dev/tty.usbserial,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,raw,echo=0,crtscts=0 FILE:tnc-start.hex

「ixon」がXON/XOFFフロー制御を有効にする場合、「ixoff」は開始/停止文字の送信を有効にします。興味深いことに、「echo」はコンソールに出力されませんが、送信者に返送されるものは何でもエコーします...奇妙です!

于 2013-03-27T15:06:11.870 に答える