2009-08-25 110 views
12

我已經創建了一個腳本來監視每半小時接收3-4行數據的串行端口的輸出 - 腳本運行正常,並抓取從端口出來的所有內容結束的一天是至關重要的...Python/PySerial和CPU使用情況

但是,什麼錯誤的是,對於一個程序,只是監視一個串行端口的CPU使用率似乎相當高,1核心將始終在100%的使用率,而這腳本正在運行。

基本上,我在這個問題上運行代碼的修改版本:pyserial - How to Read Last Line Sent from Serial Device

我已經試過輪詢定期的inWaiting()功能,並且inWaiting()時,它的睡眠是0 - 我我已經嘗試了從1秒到0.001秒的時間間隔(基本上,儘可能多的時候不用提高CPU使用率) - 這將成功抓取第一行,但似乎錯過了其餘的數據。

調整串口的超時時間似乎對CPU使用率沒有任何影響,也沒有將監聽功能放到它自己的線程中(不是我真的認爲它有差異,但值得嘗試)。

  • python/pyserial應該使用這麼多的cpu? (這看起來像是矯枉過正)
  • 我在這個任務上浪費了我的時間/我是否應該咬下子彈並安排腳本在我知道沒有數據將要來臨的時間內睡覺?

回答

13

也許你可以發出阻止read(1)呼叫,並且當它成功使用read(inWaiting())獲得正確的剩餘字節數時。

+0

太棒了!它現在像一隻小貓一樣咕嚕咕嚕,旁邊沒有CPU的使用,它抓住了我所扔的一切。 我一直在使用read(inWaiting()),它的功能與read(1)的功能相同 - 顯然情況並非如此。感謝您爲我清理。 – 2009-08-25 15:32:23

+0

很酷,並感謝讓我發現pyserial,我會考慮它下一次我玩串行端口:) – tonfa 2009-08-25 16:28:01

+0

這是非常好的 - 無痛設置和使用,這是我唯一遇到麻煩和**我**是問題。 – 2009-08-25 17:33:34

0

系統風格的解決方案會更好嗎?創建python腳本並通過Cron/Scheduled Task執行它?

pySerial不應該使用那麼多的CPU,但如果它坐在那裏輪詢一個小時,我可以看到它是如何發生的。睡眠可能是定期喚醒和民意調查的更好選擇。

+2

如果您從cron或睡眠運行,您將錯過串行輸出。程序必須作爲守護進程或活動進程運行。 – jmanning2k 2009-08-25 14:45:32

+0

我很欣賞TheLobster的建議,但是jmanning2k已經有了它的權利 - 這意味着像過程一樣的守護進程。我們將每隔半小時獲取一次數據,但是這個數據大概和它一樣精確。計劃任務/計劃任務方法必須*精確*準確地工作,最小的不正常會導致數據丟失。那根本不會。 – 2009-08-25 15:39:23