2017-06-13 11 views
0

Raspberry PiでシリアルGPS/GNSSデバイスを使用しているときに問題が発生しました。問題のデバイスは、/dev/gpsにシンボリックリンクされたu-blox GNSSレシーバーです。Linux:1つのプロセスでシリアルポートからデータを読み取り、別のプロセスでデータを書き込む

私は、このデバイスからの出力データのロギングとそれと同時に補正データの送信を試みます。

具体的には、私はRTKLIBs(http://www.rtklib.com/)DGNSS/RTKを使用してより良い位置推定を取得するために、GNSS受信機にNTRIP/RTCM補正データを送信するためstr2strツールを使用します。 受信機の出力データは、GPSデーモン(gpsd)に基づいたpythonスクリプトによって記録されます。

しかし、主な問題はシリアルポート制御に関係していると思います。 書き込み処理(str2str)を最初に実行した後に、読み込み処理(私のpythonスクリプト/ gpsdフロントエンド(eg cgps)/ cat)を同時に実行すると、読み込み処理で数秒間データが出力されてフリーズします。データを読み込むためにどのツールを使用するかは問題ではありません。

この質問が見つかりました:https://superuser.com/questions/488908/sharing-a-serial-port-between-two-processes。そのため、プロセスにはデバイスへのアクセス権が与えられていることを確認し、スーパーユーザーとしてプロセスを実行しようとしました。さらに私はsocatと仮想シリアルポートを見つけましたが、それには何の用途も見つけられませんでした。 (Virtual Serial Port for Linux

1つのプロセスでシリアルポートからデータを読み込んで別のプロセスに書き込む方法はありますか?私が今知っている唯一の解決策は、pySerialを使ってPythonで読み書きプロセスを書き直すことです。これにより、シリアルデバイスにアクセスするプロセスは1つだけになりますが、多くの作業が必要になります。

答えて

0

最後に、私はこれに何とか同様の構成を用いてsoultionが見つかりました:https://serverfault.com/questions/453032/socat-to-share-a-serial-link-between-multiple-processes

第socatに関するインスタンス(A)はB. socatに関するBをsocatに関するにパイプ処理されたTCP接続からGNSS補正データを取得する接続を管理しますシリアルデバイスに接続し、別のインスタンスインスタンスCにデータを出力します。これにより、gpsdなどの他のプロセスが接続し、TCPポートから受信者の出力を取得できます。

は合計で、これは次のようになります。一つだけのプロセスがシリアル接続を管理して

socat -d -d -d -u -lpA TCP4:127.0.0.1:10030 - 2>>log.txt | 
socat -d -d -d -t3 -lpB - /dev/gps,raw 2>>log.txt| 
socat -d -d -d -u -lpC - TCP4-LISTEN:10031,forever,reuseaddr,fork 2>>log.txt 

、それはもうブロックされません。

関連する問題