2009-08-25 8 views
12

Stworzyłem skrypt do monitorowania wyjścia portu szeregowego, który otrzymuje 3-4 linie danych co pół godziny - skrypt działa dobrze i łapie wszystko, co wychodzi z portu, który na To, co ma znaczenie, jest najważniejsze ...Python/PySerial i użycie procesora

To, co robię, polega na tym, że użycie procesora wydaje się dość wysokie w przypadku programu, który monitoruje pojedynczy port szeregowy, 1 rdzeń zawsze będzie używany w 100%, podczas gdy skrypt jest uruchomiony.

Ja w zasadzie działa zmodyfikowaną wersję kodu w tej kwestii: pyserial - How to Read Last Line Sent from Serial Device

próbowałem odpytywanie funkcja inWaiting() w regularnych odstępach czasu i po to spać kiedy inWaiting() jest 0 - I” Próbowałem interwałów od 1 sekundy do 0,001 sekundy (w zasadzie, tak często, jak tylko mogę, bez zwiększania użycia procesora) - to uda się złapać pierwszą linię, ale wydaje się, że tęsknię za resztą danych.

Ustawienie limitu czasu portu szeregowego nie wydaje się mieć żadnego wpływu na użycie procesora, ani nie umieszcza funkcji nasłuchiwania we własnym wątku (nie, że naprawdę oczekiwałem różnicy, ale warto było spróbować).

  • Czy python/pyserial powinien używać tak dużej liczby procesorów? (wydaje się to przesadą)
  • Czy marnuję swój czas na to zadanie? Czy powinienem po prostu ukąsić kulę i zaplanować scenariusz snu na okresy, o których wiem, że żadne dane nie nadejdą?

Odpowiedz

13

Być może mógłbyś wykonać blokujące wywołanie read(1), a gdy mu się to uda, użyj read(inWaiting()), aby uzyskać odpowiednią liczbę pozostałych bajtów.

+0

Awesome! To mruczenie jak kociak teraz, obok zerowego użycia procesora i chwyta wszystko, co na niego rzucam. Używałem read (inWaiting()) pod wrażeniem, że będzie on działał tak samo jak read (1) - oczywiście tak nie jest. Dzięki za posprzątanie tego za mnie. –

+0

Fajnie, i dziękuję za umożliwienie mi odkrycia pyserial, Zastanowię się nad następnym razem gram z portami szeregowymi :) – tonfa

+0

Jest doskonały - bezbolesny w konfiguracji i obsłudze, to była jedyna rzecz, z którą miałem problem i ** ja ** był problem. –

0

Czy rozwiązanie stylowe systemu byłoby lepsze? Utworzyć skrypt Pythona i wykonać go za pomocą Cron/Zaplanowane zadanie?

pySerial nie powinien używać tak dużej mocy procesora, ale jeśli tylko siedzi tam przez godzinę, mogę zobaczyć, jak to się dzieje. Spanie może być lepszą opcją w połączeniu z okresowymi przebudzeniami i ankietami.

+2

Jeśli uruchomisz z crona lub uśpienia, przegapisz wyjście szeregowe. Program musi być uruchamiany jako demon lub proces aktywny. – jmanning2k

+0

Doceniam sugestię TheLobster, ale jmanning2k ma prawo do tego - ma to być proces podobny do demona. Będziemy otrzymywać dane co pół godziny, ale to jest mniej więcej tak dokładne, jak to będzie. Cron/zaplanowane podejście do zadania musiało być * szaleńczo * dokładne, jeśli chodzi o czas pracy, a najmniejszy błąd spowodowałby utratę danych. To po prostu nie wystarczy. –