2012-06-07 8 views
21

Próbuję komunikować się z urządzeniem przez szeregowy przy użyciu Pyserial. Ponieważ polecenia muszą być nieustannie wysyłane, muszą być umieszczone w pętli while w Pythonie.Wydajny i szybki Python Podczas gdy pętla podczas używania trybu uśpienia()

Obecnie używam tego kodu, i podjęły spojrzeć na python process takes 100% CPU:

while True: 
    #do some serial sending here 
    time.sleep(0.2) 

Ten kod działa. Jednak prędkość wysyłania jest wolna. Próbowałem przyspieszyć działanie, zmniejszając interwał sleep, ale wydaje się, że obciążenie CPU jest zbyt duże.

Krótko mówiąc, czy istnieje sposób efektywnego iterowania w pętli na zawsze, przy jednoczesnym zachowaniu niskiego zużycia zasobów procesora?

+0

na podstawie [post] (http://stackoverflow.com/questions/529034/python-pass-or-sleep-for-long-running-processes), time.sleep ma bardzo mały narzut, możesz chcieć sprawdzić numer seryjny wysyłania części kodu – xvatar

+1

Czy próbowałeś spać za 0.00001? Może się to wydawać niedorzeczne, ale to opóźnienie może sprawić, że cały procesor będzie różnił się od świata. Proszę, spróbuj tego. – jakebird451

+0

W jaki sposób współczesny komputer może się włamać do portu szeregowego? Czy nie byłoby seryjny.Serial(). Write() podczas pisania? Wydaje się, że CPU ma dużo czasu na robienie innych rzeczy? – Bittrance

Odpowiedz

37

Powolna część marnowania procesora to "wykonaj seryjne wysyłanie". Pętla while z krótkim uśpieniem będzie wykorzystywać pomijalny procesor.

Czy możesz pokazać kod seryjnego wysyłania. Może być sposób na przyspieszenie tego.

Na tej raczej powolny CPU widzę to:

import time 
while True: time.sleep(0.2)  # 0% CPU 
while True: time.sleep(0.02)  # 0% CPU 
while True: time.sleep(0.002) # 0.5% CPU 
while True: time.sleep(0.0002) # 6% CPU 
while True: time.sleep(0.00002) # 18% CPU 

teraz zrobić trochę dodatkowej pracy w pętli:

import time 
while True: range(10000) and None; time.sleep(0.2)  # 1% CPU 
while True: range(10000) and None; time.sleep(0.02)  # 15% CPU 
while True: range(10000) and None; time.sleep(0.002) # 60% CPU 
while True: range(10000) and None; time.sleep(0.0002) # 86% CPU 

wpadłem tych w tłumacza i zatrzymał każdą pętli while z CTRL- DO.

+0

Alternatywnie, mogę ograniczyć przekazywanie do portu szeregowego za pomocą przełącznika, jednak środki przeprogramowują również urządzenie wbudowane. Kod wyglądał \t polecenia = 'w' \t podczas Prawda: \t \t if (polecenie = x!): \t \t \t #pyserial wysłać ciąg tutaj, w tym przypadku w. zmieniona za pomocą zewnętrznego programu obsługi. \t \t else: \t \t \t #tell pyserial zamknąć połączenie – jhtong

+0

Wygląda muszę wdrożyć kontrolę włączeniem komputera i strony mikroprocesora, aby zmniejszyć liczbę poleceń wysyłanych. Następnie pozostań w trybie uśpienia (0,2), aby zużycie procesora nie było tak wysokie. tj. zapisz ostatnie polecenie, a jeśli zostało wysłane, nie wysyłaj go ponownie. tymczasem mikroprocesor czeka na polecenie zatrzymania "x". Jeśli nie zostanie odebrany, będzie kontynuować przetwarzanie bieżącego/poprzedniego polecenia we własnym tempie. – jhtong

+0

Jeśli mikrokontroler "będzie kontynuował przetwarzanie bieżącego polecenia we własnym tempie", wtedy pętla while nie jest potrzebna w kodzie Pythona. Wątpię, aby jakikolwiek rodzaj biblioteki do komunikacji z portem szeregowym wymagał od ciebie wywołania jakiejkolwiek pętli while. Być może ponownie przeczytaj dokumentację biblioteki, ponieważ wygląda na to, że źle jej używasz. –

3

Musisz obliczyć kompromis między szybkością i obciążeniem procesora.

Jeśli musisz wysyłać krótkie serie danych, ale nie robi się tak wiele między wiadomościami, to możesz żyć z dużym obciążeniem procesora przez krótki czas, ponieważ średnia może być wciąż niska.

+0

Dzięki, że może to oznaczać przeprogramowanie mikrokontrolera w celu użycia przełączników. Musi iść naprzód, stąd "w" musi zostać wysłane. Jeśli nie zostanie wykryty klucz "w", silnik nie ruszy się. W związku z tym, jeśli jest on wysyłany zbyt wolno, silnik będzie poruszał się jeszcze wolniej. – jhtong

4

W odniesieniu do Twojego komentarza Joachima odpowiedź:

Następnie kod mikrokontroler potrzebuje przebudowy. W przeciwnym razie zamieniasz komputer ogólnego przeznaczenia w głupi "mikrokontroler", który wielokrotnie przetwarza niepotrzebny kod, stąd 100% procesora. Innym symptomem niewłaściwego używania twojego komputera jest fakt, że prędkość twojego silnika sprzętowego zależy od szybkości wysyłania do niego poleceń przez interfejs szeregowy. Musisz "wydać polecenie" przy pomocy komputera, który będzie obsługiwał Twoją logikę wysokiego poziomu. A mikrokontroler musi obsługiwać niskopoziomowe, powtarzalne sterowanie silnika.

+1

+1 do czytania między wierszami. – Vorac

Powiązane problemy