Вопрос по pyserial, python, while-loop – Эффективный и быстрый цикл Python While при использовании sleep ()

28

Я пытаюсь связаться с устройством через последовательный порт, используя Pyserial. Поскольку команды должны непрерывно отправляться, они должны быть помещены в цикл while в Python.

Я в настоящее время использую этот код, и посмотрел наПроцесс Python занимает 100% процессора:

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

Этот код работает. Однако скорость отправки низкая. Я пытался сделать это быстрее, уменьшивsleep интервал, но, кажется, загружает процессор слишком много.

Короче говоря, есть ли способ эффективно выполнять итерации по циклу while навсегда, сохраняя при этом низкое потребление ресурсов процессора?

Как современный компьютер может перейти в потовую запись в последовательный порт? Не будет ли serial.Serial (). Write () блокироваться во время записи? Это кажется достаточно времени для процессора, чтобы делать другие вещи? Bittrance
основываясь на этомpost, time.sleep имеет очень мало накладных расходов, вы можете проверить вашу часть кода последовательной отправки xvatar
Вы пробовали спать за 0,00001? Это может показаться смешным, но эта задержка может изменить мир вашего процессора. Пожалуйста, попробуйте это. jakebird451
@ jakebird451: Кажется, что он не работает, процессор загружен еще быстрее. Полагаю, я буду придерживаться 0,2 с и реализовать процесс переключения, чтобы уменьшить количество отправляемых команд. Спасибо хоть. jhtong
по-видимому, это проблема зацикливания. @ jakebird451 Я попробую это. Однако при 9600 бод последовательный буфер может быть заполнен. Думаю, мне нужно было бы реализовать код переключения в микропроцессоре. :( Спасибо.. jhtong

Ваш Ответ

3   ответа
47

». Цикл while с коротким сном будет использовать незначительный процессор.

Можете ли вы показать серийный код отправки. Там может быть способ ускорить это.

На этом довольно медленном процессоре я вижу это:

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

Теперь проделайте дополнительную работу в цикле:

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

Я запустил их в интерпретаторе и остановил каждый цикл while с помощью ctrl-C.

В качестве альтернативы, я мог бы ограничить передачу на последовательный порт, используя переключатель, однако это означает и перепрограммирование встроенного устройства. Код выглядит примерно так: command = 'a'; w & apos; в то время как True: if (команда! = x): #pyserial отправить строку & lt; command & gt; здесь, в этом случае ш. & Lt; & команда GT; изменено через внешний обработчик. еще: # расскажите pyserial, чтобы закрыть соединение jhtong
Если вы «микроконтроллер» продолжите обрабатывать текущую команду в своем собственном темпе, то цикл кода НЕ требуется в вашем коде Python. Я сомневаюсь, что какая-либо библиотека для связи через последовательный портrequire Вы называть любой вид цикла. Возможно, перечитайте документацию библиотеки так, как будто вы используете ее неправильно.
Похоже, мне нужно реализовать проверку переключения как на компьютере, так и на стороне микропроцессора, чтобы уменьшить количество отправляемых команд. Затем перейдите в режим сна (0.2), чтобы загрузка процессора была не такой высокой. сохранить последнюю команду и, если она была отправлена, не отправлять снова. тем временем микропроцессор будет ожидать команду остановки 'x'. Если он не получен, он продолжит обрабатывать текущую / предыдущую команду в своем собственном темпе. jhtong
4

Тогда ваш код микроконтроллера нуждается в редизайне. В противном случае вы просто превращаете свой компьютер общего назначения в не более чем тупой «микроконтроллер». это повторяет ненужный код несколько раз, следовательно, 100% процессора. Другим признаком неправильного использования компьютера является тот факт, что скорость вашего аппаратного двигателя зависит от скорости, с которой вы посылаете ему команды через последовательный интерфейс. Вам нужно «командовать» это с компьютером, на котором будет размещена ваша логика высокого уровня. И ваш микроконтроллер должен поддерживать повторяющееся управление двигателем на низком уровне.

+1 за чтение между строк.
3

какой компромисс вы готовы иметь между скоростью и нагрузкой на процессор.

Если вам приходится отправлять короткие пакеты данных, хотя между сообщениями не нужно делать слишком много, то, возможно, вы сможете в течение короткого времени жить с высокой нагрузкой на ЦП, поскольку среднее значение все еще может быть низким.

Спасибо, однако, это может означать перепрограммирование микроконтроллера для использования переключателей. Он должен идти вперед, следовательно, "w" должен быть отправлен. Если нет «w» ключ обнаружен, двигатель не будет двигаться. Следовательно, если оно отправлено слишком медленно, двигатель будет двигаться еще медленнее. jhtong

Похожие вопросы