2009-08-25 59 views
12

30分ごとに3〜4行のデータを受け取るシリアルポートの出力を監視するためのスクリプトを作成しました。このスクリプトはうまく動作し、その日の終わりは重要です...Python/PySerialとCPUの使用

しかし、私はCPUの使用量は、単一のシリアルポートを監視しているプログラムではかなり高いようですが、1コアは常に100%の使用率になりますスクリプトが実行中です。

が、私は基本的にこの質問にコードの修正版を実行しています:私は定期的にinWaiting()関数のポーリングを試してみたpyserial - How to Read Last Line Sent from Serial Device

と)(inWaitingとき、それは寝たことは0である - 私は」 1秒から0.001秒までの間隔を試しました(基本的に、CPU使用量を増やすことなくできるだけ頻繁に) - これは最初の行を取得するのには成功しますが、残りのデータは欠落しているようです。

シリアルポートのタイムアウトを調整しても、CPU使用率に影響はなく、リスニング機能も独自のスレッドに入れているわけではありません。

  • python/pyserialはこの多くのCPUを使用する必要がありますか? (これは過度のようです)
  • 私はこのクエストで時間を無駄にしていますか?私は弾丸を噛んで、スクリプトがデータが到着しないことがわかっている時間に寝るようスケジュールする必要がありますか?

答えて

13

ブロッキングread(1)コールを発行し、成功した場合はread(inWaiting())を使用して、残りのバイト数を正しく取得することができます。

+0

恐ろしい!それは今、ネコのCPU使用量の隣に子猫のようなものがあり、私がそれを投げ捨てるものはすべて掴みます。 私はread(1)と同じように機能するという印象のもとでread(inWaiting())を使用していましたが、明らかにそうではありません。私のためにそれをクリアしてくれてありがとう。 –

+0

クールで、私はpyserialを発見してくれてありがとう、私はシリアルポートで遊ぶ次回に検討するでしょう:) – tonfa

+0

これは素晴らしいです - セットアップと使用に苦労します、これは私が問題を抱えていた** I **問題だった。 –

0

システムスタイルのソリューションは良いでしょうか? Pythonスクリプトを作成し、それをCron/Scheduled Task経由で実行させますか?

pySerialはそれほど多くのCPUを使用すべきではありませんが、ただ1時間ポーリングしていれば、どうなるか分かります。スリープは、定期的な起床とポーリングと併用して、より良い選択肢になるかもしれません。

+2

cronまたはsleepから実行すると、シリアル出力が欠落します。プログラムは、デーモンまたはアクティブなプロセスとして実行する必要があります。 – jmanning2k

+0

TheLobsterの提案に感謝しますが、jmanning2kはその権利を持っています - これはプロセスのようなデーモンであることを意図しています。 30分ごとにデータが取得されますが、それはほぼ正確です。 cron /スケジュールされたタスクのアプローチは、それが働くタイミングが間違いない*正確でなければならず、最小の不調がデータを失う結果となります。それは単にしません。 –