婦人声明:長くて詳細な問題の説明+実際にはわかりませんが、socat
非常に奇妙な問題に固執しました。最後の tl;dr に似ています。
現在、Ubuntu 18.04をシリアルで(RS232)実行しているコンピュータをINS(特にEllipse-D)に接続してRTKレベルのGPS精度を達成するためにRTCM補正データを送信しようとしています。
これを行うには、BKG Ntripクライアント(BNC)がマイコンピュータで実行されており、NMEA文字列がシリアルインターフェイスを介してINSから送信され、インターネットを介してNTRIPブロードキャスターに送信され、NTRIPブロードキャスターはRTCM修正データを再送信します。 NTRIPクライアントがシリアルインターフェイスを介して受信した変更データをINSに渡すことを許可します。 (下の写真は一例です。)
残念ながら、INSは常に修正データを受信していないことを示しますが、BNCは常にINSからNMEA文字列を受信し、NTRIPキャスターからRTCMデータを受信します。そのため、RTCMデータがコンピュータから出ていることを確認するために、シリアルポート(私の場合は/ dev / ttyUSB0)でトラフィックを監視することにしました。だから、次の項目が見つかりました。
シリアルポートトラフィックを監視する方法は?socat
したがって、上記のように、次のコマンドを実行する他の端末を開く間にシステムを実行するソリューションを変換しました。
socat /dev/ttyUSB0,raw,echo=0 \
SYSTEM:'tee in.txt |socat - "PTY,link=/tmp/ttyV0,raw,echo=0,waitslave" |tee out.txt'
私は着信トラフィックが最終的に到着しin.txt
、発信トラフィックが最終的に到着すると予想しますout.txt
。in.txt
INSのNMEA文字列がありますが、out.txt
そこには何もありません。私のINSが突然RTKレベルのGNSS位置を推定するように指示されたので、突然RTCM補正データがINSに到着したことがわかるまで、最初は失望しました。さらに驚くべきことは、socat
端末コマンドをキャンセルすると、RTKレベルの精度はもはや存在しなくなり、RTCMデータがINSに到達しなくなることです。このプロセスを何度も繰り返しましたが、結果は常に同じだったので、偶然の一致は排除できます。 (唯一の興味深いのは、一定時間が経過するとRTK水平精度は達成されなくなりましたが、socatコマンドを再起動した直後に再び達成されることです。)
簡単に言うと:socat
問題の長い説明を終わらせるために、上記のコマンドのいずれかの副作用が原因で、socat(ここではBNC)以外のプログラムがシリアルインタフェースを介してのみ外部デバイス(ここではデータを送信できるかどうか)を知ることができるかどうかを尋ねます。 INS)このインタフェース(ここでは/ dev / ttyUSB0)を監視している場合、私のアプリケーションで常に並列に実行したくsocat
ないからです。socat
BNCはUbuntu 18.04システムで動作しており、ここのGNSSローバーはEllipse-D INSです。シリアルに送信される参照観測値は、socat
上記のコマンドが同時に実行されたときにのみ到着するように見えるため、問題になります。一方、NMEA座標は関係なく常に到着しますsocat
。