シリアル-USBアダプターを介してPCに接続されているこれらのシリアルポートからの遅延を減らすにはどうすればよいですか?


8

組み込みシステムの必要性を誤って見つけたと思います。すごい!そしてちょっと怖い。そして、私は助けが必要です。

背景:2つのSICK LMS-291からスキャンを取得し、それらをサブインチ精度のGPSと統合するGUIアプリケーションの構築を依頼されたため、各スキャンがどこで発生したかがわかります。私はナイーブWebプログラマーとして、タイミングが重要であることを理解していましたが、それが難しいことにも気付きませんでした。各GPSポイントと各スキャンがいつ発生したのかわからない場合、スキャンがどこで発生したのか把握できません。おっとっと。

彼らはプラットフォームとしてWindows 7を指定し、センサーとGPSを接続するためにSeaLevel RS422 to USBボックスを購入しましたが、すぐに私の愚かさを発見しました。センサーと私のコンピュータープログラムの間のどこかで、何かがスキャンがタイムリーに到着しないようにしていました。LMSは1秒あたり75スキャン、つまり13.32 ms /スキャンで吐き出します。私のプログラムはそれらをタイムリーに取得しません。100ミリ秒ごとに7、8、10などのグループで取得します。また、十分なスキャンが表示されない場合や、スキャンが破損している場合もあります。このSeaPortアダプターは1秒に10回しか送信していない(それは可能ですか?USBの仕組みがわからない)か、Windowsがバッファーをチェックしていません(どこかにバッファーがあるはずですよね?)。

今日:これは、クライアントが基本的に大丈夫であるいくつかの不正確さにつながります。私はそうではありませんが、クライアントに対して同様の作業を行う機会があるので(より多くのセンサー入力を統合する!)、たとえばGPSの精度を考慮して、それを正しく行う方法を見つけたいと思います、スキャン位置の精度と正確性を保証できる。

それはどのように見えますか?UIが必要で、これらの3つのデバイスからの入力を13.32ミリ秒ごとにチェックできるようにする必要があります。たとえば、GUIにNano-Xを使ってFreeRTOSを使用し、それらが提供するラップトップで実行した場合、それは正気なソリューションのように聞こえますか?RS-422-USBアダプターがこれらの遅延を引き起こしている可能性はありますか?Windowsを使用しても実際にはこの目的で問題ありませんか?


2
あなたはそれらのレーザー距離計を手に入れるために誰を殺さなければなりませんでしたか、そして彼はいくつかを持っているかもしれない友人がいましたか?
コナーウルフ

@ConnorWolfハァッ!所有して欲しいです。これはag(作物の量を決定する)のためのものであり、ハードウェア(トラクターは75,000ドルかかる可能性があります)を喜んで採用しましたが、プログラミングの才能のために採用することを望んでいません。
canisrufus 2014年

Windowsのバッファサイズはわかりませんが、確認する必要があります。Linuxでは、これらのバッファーのサイズは4kBであり、送信するデータと使用するシステムコールに応じて、プログラムは4kBのデータチャンクしか受信できない場合があります。それが問題である場合は、バッファーからの読み取りに使用するシステムコールを慎重に確認してください。
ジッピー2014年

1
直接シリアル接続を検討することをお勧めします。PCおよびラップトップ用のシリアルポートカードを入手できます(ほとんどのPanasonicタフブックには、標準としてシリアルポートがまだあることに注意してください)。これにより、USBシリアルインターフェイスのバッファリングの問題が回避されます。Windows 7は十分に優れたリアルタイム機能を備えているため、おそらくそれを止める必要はありません。
ConcernedOfTunbridgeWells

ただのコメント:タイトルはおかしいですが、質問の内容を理解するのにあまり役立ちません。それを明確にできますか?
clabacchio

回答:


6

問題はほぼ間違いなく、USB-RS422コンバーターに関連するUSB​​バッファリングにあります。USBのレイテンシは変動が大きく、かなり長くなっています。

最も簡単な解決策は、より優れたRS422インターフェイス、理想的にはPCI / PCI-eベースのソリューションです。それは待ち時間の問題を解決します。

USBポーリングレートを変更することもできますが、これはホストOSにかなり依存しています(使用しているプラ​​ットフォームは?)。


その価値について、私はsealevel systemのWebサイトを見て、マーケティングのでたらめに大規模に感染しています。彼らは文字通り、「MCUの多重化を行うのではなく、内部でUSBハブを使用する」と言って、10ページと複数のホワイトペーパーのように費やしています。

ちょっとシーレベル!それが私が中国からe-bayで買った安い50ドルの4ポートUSBシリアルインターフェースです。あなたがそれをあなたのように聞こえるようにしようとする6ダースの退屈なホワイトペーパーを書いても、あなたは特別ではありません!

それらにFTDIドライバーを使用するように強制しようとしましたか?私は彼らが沼地の標準的なFTDI FT232または類似のものを使っているだけでそれにお金をかけます。開いているボックスの1つを開けて、写真を撮ることができますか?


楽しみや教育の機会のために、自分のハードウェアを本当に回転させたい場合は、ハードウェアですべてを実行しようとしないことを強くお勧めします。3つの信号すべてを単純に時間相関させる必要があるので、本当に必要なのは、3つのシリアルライン(2つのRS422、1つのRS232(GPS))でリッスンし、データにタイムスタンプを付けて、メインコンピューターに転送できるものだけです。 。

データにタイムスタンプを付けると、いつでもタイムスタンプを確認できるため、必要なすべてのバッファ待機時間を自由に使用できます。

現実的には、ハードウェアに基盤がない場合、素晴らしいGUIを描画するのに十分なクランチを備えた何かを設計することはかなりの仕事です。

個人的には、バッファリングの問題でかなり分厚いARM MCUを投げて、それで終わらせるでしょう。それがArduinoであるという事実にもかかわらず、Arduino Dueは十分なSRAMを備えており、必要なものに対して十分に高速です(そして、常に素晴らしいサポートがたくさんあります)。
または、STM32シリーズは同様のパフォーマンスを備え、「上級」ユーザー向けです(参照、参照する例が少ない、またはない)。STは、非常に優れた、非常に安価な評価ボードも数多く提供しています。

Dueを使用すると、ネイティブUSBポートを取得できます。必要に応じて、このポートで独自のCDCドライバーをロールできます。一部のSTM32ボードにもネイティブUSBが搭載されています。


OSについて:現在、シングルコアタブレットでWindows 7を使用しています。ラップトップを使用して、好きなものをインストールすることもできます。
canisrufus 2014年

7
マイクロコントローラーをデータの関連付け専用にしてから、表示のためにウィンドウボックスに転送することも、私が行う方法です。+1
JustJeff

1
リンクしたカードはおそらく機能するでしょうが、他の場所でのSeaLevelのでこぼこの満杯からは、私がそれらを信頼できるかどうかはわかりません。その価値について、彼ら、PCI-eカードが16C954ハードウェアクワッドクォートICを使用していることを述べています(おそらく、カードには2つあります)。
コナーウルフ2014年

1
本当に、唯一の適切な解決策は、それらを呼び出して、待ち時間の問題があるかどうかを尋ねることだけだと思います。ドライバーで調整できるものがあるかもしれません!
コナーウルフ2014年

2
STM32F4ソリューションで+1。STM32F4-ディスカバリーボードはコミカルで -priced、6 UARTの、およびUSB OTG FSポートまで持っています。組み込み設計に慣れていない場合は、USBを実行するのが非常に難しいと感じるでしょう。FTDIケーブルでUARTを介して接続するのが最も簡単です。Coocox IDEは無料で、コードサイズの制限がなく、ディスカバリーボードを適切にサポートしています。
markt '19年

3

質問を理解すれば、これは、1つのシリアルラインを介してGPSからの時間/場所メッセージを取得し、他のシリアルラインを介して受信した距離データメッセージを関連付けることです。理想的には、レンジファインダーメッセージは、独自のタイムスタンプを持っているでしょう、そしてあなたはすべてのクロックを同期させることができれば、あなたは場所突き止めることができるだろう範囲を持つ2つのGPSメッセージとの間の範囲のタイムスタンプを補間することによって撮影されたが最も近いタイムスタンプ。しかし、もちろん、それはありません。

マイクロコントローラーを使用してリアルタイムのデータ相関を実行し、その出力をPPCに表示して表示するためのいくつかのソリューションが思い浮かびます。基本的に、マイクロコントローラーはタイトなタイミングの問題に対処するために存在します。

したがって、より単純なソリューションの場合、必要なのは、いくつかの異なるシリアルラインからすべてのメッセージを収集し、受信した順序でそれらを1つのストリームに結合し、それをPCに送り込む方法です。2つのGPSメッセージ間の距離計メッセージが、これら2つのメッセージの間に発生したと推測できます。

もちろん、GPSメッセージの頻度に応じて、ある程度の不確実性が得られます。トレードオフは、GPSメッセージの頻度を上げると(より正確な相関を取得するため)、マイクロコントローラーの要求とPCへのシリアルリンクの要求が増えることです。極端な場合、シリアルリンクはGPSメッセージで飽和し、時々範囲メッセージがスローされます。明らかに、これらのGPSメッセージのほとんどは必要ありません。ただし、このソリューションの利点は、ソフトウェアの観点から見ると、microがほとんど実行できないことです。すべてをアセンブリ言語の単純なループで行うことができ、OSは必要ありません。

より複雑なソリューションの場合、マイクロでローカルクロックを形成し、GPSを使用してそのクロックを同期することができます。これにより、範囲メッセージを取得したときに、マイクロのクロックを使用してタイムスタンプを取得できます。クリスタルタイムベースのマイクロを使用すると、おそらく1HzのGPSメッセージで問題なく、範囲メッセージに刻印されたミリ秒の精度時間よりもはるかに優れています。有能な組み込みシステム担当者は、おそらくこれをローエンドマイクロのアセンブラーで引き出すこともできますが、あなたはまだ始まったばかりだと述べました。Linuxを実行できるより強力なマイクロを見て、おそらくLinuxクロックをGPSに同期させるための既存のソリューションを見つけることができます。


MCUでリアルタイムクロックを構築し、GPSを使用して同期するよりも簡単なのは、タイマー/カウンターペリフェラルのいずれかを使用してGPSメッセージとレンジファインダーメッセージ間のサイクル数を測定し、そのデルタタイム情報をデータストリーム。
Ben Voigt 2014年

3

おそらく、静的インターリーブを使用して、シリアルデータを高速で新しいシリアルデータストリームに多重化します。次に、USB-UARTを介してデータストリームをコンピューターに供給します。これにより、最初のバイトがデバイス1から、2番目のバイトがデバイス2から、3番目のバイトがデバイス3から、そしてこの場合は4番目のバイトがCRCまたはシーケンス番号であることがわかります。フレームマーカーの開始の数バイトをスローしてデータストリームで同期し、データが利用できない場合はバイトをパディングして完了します。絶対時間はわかりませんが、さまざまなデータチャンク間の相対時間がわかっています。


1

また、マイクロコントローラーを使用して、RSデータを受信し、タイムスタンプを付けて、PCに転送します。ドライバーが背後で更新されると、ソフトウェアとドライバーが常に変化するため、Windows PCでは(おそらくサウンドカードを除いて)I / Oタイミングの重要な作業を実行できません。

しかし、私が最初にすることは、USBロジックアナライザーを入手することです。USD100未満でUSBロジックアナライザーを購入し、GPSレシーバーからいくつかのメッセージを取得して、各バイトが受信されたときに正確に確認できます。その情報を使用して、最初にデータのタイミングがどれほど正確であるかを試してみる/正確に計算します。たとえば、GPSボックスが何をいつ送信するかを正確に示します。次に、達成可能な精度と、特定のレベルの精度に到達するためにどれだけの労力を費やすことができるかを調べることができます。

ここに画像の説明を入力してください

上に、いくつかの(Saleae?)USBロジックアナライザーの写真。


[編集]ハハ、サウンドカードを使用するのは、実際に機能させる面白い方法かもしれません。UARTデータをサウンドカード入力に接続し(抵抗とコンデンサを介して)、シリアルストリームの各エッジを検出するソフトウェアを作成して、美しいタイミング精度を実現できます!。わかりました、私はこれを真剣に提案しているわけではありませ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.