15

30 分ごとに 3 ~ 4 行のデータを受信するシリアル ポートの出力を監視するスクリプトを作成しました。 .

ただし、1 つのシリアル ポートを監視しているだけのプログラムでは、CPU 使用率がかなり高いように見えます。このスクリプトの実行中は、1 つのコアが常に 100% 使用されます。

基本的に、この質問のコードの修正版を実行しています: pyserial - シリアル デバイスから送信された最後の行を読み取る方法

inWaiting() 関数を定期的にポーリングし、inWaiting() が 0 のときにスリープ状態にしようとしました - 1 秒から 0.001 秒までの間隔を試しました (基本的に、CPU 使用率を上げずにできるだけ頻繁に) ) - これは最初の行を取得することに成功しますが、残りのデータを見逃しているようです。

シリアル ポートのタイムアウトを調整しても、CPU の使用率には影響がないようです。また、リッスン機能を独自のスレッドに配置しても影響はないようです (実際に違いを期待したわけではありませんが、試してみる価値はありました)。

  • python/pyserial はこれほど多くの CPU を使用する必要がありますか? (これはやり過ぎのようです)
  • このクエストで時間を無駄にしているのでしょうか / データが来ないことがわかっている期間、スクリプトをスリープ状態にするようにスケジュールを設定する必要がありますか?
4

2 に答える 2

16

おそらく、ブロッキングread(1)呼び出しを発行し、それが成功したときにread(inWaiting())残りの正しいバイト数を取得するために使用できます。

于 2009-08-25T14:31:57.003 に答える
0

システム スタイルのソリューションの方が優れているでしょうか。Python スクリプトを作成し、Cron/Scheduled Task を介して実行しますか?

pySerial はそれほど多くの CPU を使用するべきではありませんが、そこに座って 1 時間ポーリングするだけで、どのように発生するかがわかります。スリープは、定期的なウェイクアップとポーリングと組み合わせて使用​​することをお勧めします。

于 2009-08-25T14:25:48.980 に答える