2009-08-25 32 views
12

Her yarım saatte 3-4 satırlık veri alan bir seri bağlantı noktasının çıkışını izlemek için bir komut dosyası oluşturdum - komut dosyası düzgün çalışıyor ve bağlantı noktasından çıkan her şeyi günün sonunda ...Python/PySerial ve CPU kullanımı

Ancak, sadece bir seri portu izleyen bir program için cpu kullanımı oldukça yüksek gibi görünüyor, ancak bu durumda 1 çekirdekli her zaman% 100 kullanımda olacak komut dosyası çalışıyor.

Temelde bu, söz konusu kodun değiştirilmiş bir versiyonunu koşuyorum: Ben düzenli aralıklarla inWaiting() fonksiyonu yoklama denedim pyserial - How to Read Last Line Sent from Serial Device

ve) (inWaiting zaman uyku sahip 0'dır - Ben 1 saniyeden 0,001 saniyeye kadar aralıklarla denedim (temel olarak, cpu kullanımını kullanmadan olabildiğince sık sık) - bu ilk satırı yakalamayı başarır ancak verilerin geri kalanını kaçırır gibi görünüyor.

Seri bağlantı noktasının zaman aşımını ayarlamak, cpu kullanımı üzerinde herhangi bir etkiye sahip görünmüyor ve dinleme işlevini kendi iş parçacığı haline getirmiyor (gerçekten bir fark beklediğimden değil, denemeye değerdi).

  • Python/pyserial bu kadar CPU kullanıyor mu? (bu overkill gibi gözüküyor)
  • Zamanımı bu görev için harcıyorum/Mermiyi ısırmalı mıyım ve senaryoyu hiçbir veri gelmeyeceğini bildiğim dönemler için uyumaya mıyım?

cevap

13

Belki bir engelleme read(1) çağrı verebilir ve başarılı olduğunda kalan sayıda bayt almak için read(inWaiting()) kullanın.

+0

Harika! Şimdi bir yavru kedi gibi cüret ediyor, Nil CPU kullanımının yanında ve ona attığım her şeyi ele geçiriyor. Oku (1) ile aynı şekilde çalışacağı izlenimi altında read (inWaiting()) kullanıyordum - açıkçası böyle değil. Bunu temizlediğin için teşekkürler. –

+0

Cool, ve bana serpantini keşfettirdiğin için teşekkürler, seri portlarla bir dahaki sefere oynayacağımı düşüneceğim :) – tonfa

+0

Mükemmel - kurulum ve kullanım için acısız, bu benim için sorun olan tek şeydi ve ** Ben ** sorun oldu. –

0

Sistem stili bir çözüm daha iyi olur mu? Python betiğini oluşturun ve Cron/Scheduled Task ile çalıştırılsın mı?

pySerial bu kadar CPU kullanmamalı, ancak sadece bir saatliğine yoklama varsa nasıl olabileceğini görebiliyorum. Uyku periyodik uyandırma ve anketlerle birlikte daha iyi bir seçenek olabilir.

+2

Cron veya uykudan çalıştırırsanız seri çıkışı kaçırırsınız. Program bir daemon veya aktif işlem olarak çalıştırılmalıdır. – jmanning2k

+0

TheLobster öneriyi takdir ediyorum ama jmanning2k bunun hakkını aldı - bu bir süreç gibi bir süreçtir. Her yarım saatte bir veri alırız, ancak olması gerektiği kadar hassastır. Bir cron/planlı görev yaklaşımı çalışmak için zamanlamada * delice * doğru olmalı ve en küçük üzüntü veri kaybına yol açacaktır. Bu sadece yapmayacak. –

İlgili konular