2017-07-16 14 views
0

2つのRaspberry PiをCプログラムと同期させたい。プログラムがPiでのみ動作していればうまくいきますが、開発のために私のPC(デバッグが簡単な場所)を使いたいのですが、timepec構造体を直接バイナリとして送信します。ラズベリーは4bytesをlongとtime_tに使用しています。私のPCはそれぞれ8byteを使用しています...だから彼らは一緒に来ません。longとtime_tのサイズを4bytesに定義する

このCスクリプトの場合のみ、longとtime_tをそれぞれ4byteに設定できますか?

私は長い、短いなどのサイズがシステムによって定義されていることを知っています。

重要:私はスクリプト内で一度だけ定義し、毎回それをuintXXまたはintに変換しないことを望みます。

+3

time_tの代わりにuint32_tを使用しますか? – tilz0R

+3

Cプログラムは「スクリプト」ではありません。通常、基本型のサイズは変更できません。 64ビットのコンパイルではなく32ビットのコンパイルが必要になるかもしれませんが、適切なシリアル化/デシリアライズ操作を構成し、転送されたデータ形式を定義して、ワイヤ転送プロトコルが明確で、プラットフォーム固有ではないようにする必要があります。 –

+0

@ tilz0R timepecはtime_tで定義され、longです。 uint32_tを他のものに使うと何も変わりません!私はそれをuintXXとして両方のvarsを定義する新しいstruct witchにコピーする必要がありますか?これは私がすでに持っていましたが、時間の無駄な解決策を探しています(それほど多くはないが、私はできるだけ少なくしたい) – CordlessWool

答えて

2

プログラミングでは、ネットワークの伝送をメモリ内処理とは別に扱う必要はほとんどありません。実際には、それはかなり一般的です。したがって、適切なバイトオーダーとサイズのネットワークフォーマットに変換することは、実際にお勧めします。また、インターフェイスの抽象化に役立ちます。

タイムリーに重要なデータ交換でない場合は、プレーンテキストに変換することを検討することもできます。これは、デバッグが非常に簡単になります。

+0

はい、通常は構造体を送信しませんが、変換する時間を無駄にしたくありません。ベストはすべてのPiがちょうど最後のナノ秒までのある時間を持つことになります。私はそれが困難であるかどうかは、ネットワークの往復時間の変更のために実現可能であることを知っているが、可能な限りほぼ同じであるべきである – CordlessWool

-3

Cはおそらく、ここで仕事に最適なツールではありません。 JavaScript、Pythonなどの抽象的な言語のような自動データ直列化を提供するには、あまりにも低レベルです。

異なるプラットフォームでtimespecの定義が同一であると仮定することはできません。あるものの、intのサイズは32/64ビットアーキテクチャーによって異なります。エンディアンの問題もあります。

異種プラットフォーム間でデータ構造を交換する場合は、あいまいでないデータと明示的なエンディアン規則で独自のプロトコルを定義する必要があります。

1つの解決策は、数字をASCIIとして送信することです。ひどく効率的ではありませんが、それがほんの2つの価値であれば、誰が気にしますか?

(u)intXX_tフィールドを使用して交換構造を作成することもできます。 標準的なラズベリーのカーネルはあなたのPCのようにリトルエンディアンになると思うかもしれませんが、小さな交換プロトコルを書いているのであれば、適切な手段として、htonl/ntohlを追加することもできます。

+0

最初に私はクライアントを同期するためにPythonスクリプトを書いたが、時間のバラツキが大きかった...それはC言語で、プログラムに関するより詳細な制御を得るためです。私たちは音で屋内のナビゲーションを実現したいので、時間は可能な限り同じでなければなりません。それ以外の場合は、ntp-serverだけを使用します。 – CordlessWool

+0

私は、Pythonがここでの犯人であることを非常に疑っています。 Pythonは、顕著な伝送遅延(すなわち、10msよりも優れている)を引き起こすのに十分なほど遅いわけではない。ほとんどの場合、交換されたデータが処理されるのを待っている間に、あなたのプログラムの一方または両方が他のことをしている可能性があります。リアルタイムでどんなデータを処理したいのであれば、どちらのマシンでもデーモンを優先して作成し、各メッセージが受信されるとすぐに処理されるようにします。デーモンがどの言語で実行されても、目立つ違いはありません。 –

+0

PythonスクリプトはFIFOレベル98で稼動し、コアを取得し、スクリプトは計測往復時間と新しい時間を設定するために何もしませんでした。ネットワーク遅延をほぼ同じレベルにするには、すべてのPiがスイッチに接続されている必要があります。ほとんどの時間、それはうまく動作しますが、毎回ではありません。私は事が起こったことをもっとコントロールしたいので、私はCに移ります...また、PythonとJs抽象的なものを非常に興味深いものにします。 – CordlessWool

関連する問題