Как передать CTRL + C на терминал Raspberry Pi от Node-RED? - PullRequest
0 голосов
/ 16 мая 2018

Я создаю учебник для учеников старших классов.

Использование Node-RED У меня есть Raspberry Pi, который запускает скрипт, написанный на python.Я пытаюсь завершить скрипт Python из node-RED, передавая KeyInterrupt (CTRL + C), чтобы скрипт завершился корректно и очистился GPIO для следующего запуска.

Я могу запустить скрипт простохорошо, используя блок EXEC в node-RED и передавая "sudo python Documents / python / blinker.py" в терминал.Проблема в том, что я не работаю напрямую в терминале, я не могу просто использовать CTRL + C для выхода из цикла while.Есть ли способ передать CTRL + C на терминал от узла-RED?

Я прикрепил код Python для тех, кто заинтересован:

import RPi.GPIO as GPIO
import time

pwmPin = 18
ledPin = 23
butPin = 17

dc = 95

GPIO.setmode(GPIO.BCM)
GPIO.setup(ledPin, GPIO.OUT)
GPIO.setup(pwmPin, GPIO.OUT)
pwm = GPIO.PWM(pwmPin, 50)
GPIO.setup(butPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.output(ledPin, GPIO.LOW)
pwm.start(dc)

print("Press CTRL+C to exit")
try:
        while 1:
                if GPIO.input(butPin):
                        pwm.ChangeDutyCycle(dc)
                        GPIO.output(ledPin, GPIO.LOW)
                else:
                        pwm.ChangeDutyCycle(100-dc)
                        GPIO.output(ledPin, GPIO.HIGH)
                        time.sleep(0.075)
                        GPIO.output(ledPin, GPIO.LOW)
                        time.sleep(0.075)
except keyboardInterrupt:
        pwm.stop()
        GPIO.cleanup()

Я пытался использовать kill и killallкоманды, и это завершает приложение, но GPIO.cleanup () тогда не запускается, и все выходы, которые были включены, останутся включенными.

Я также попытался передать «echo $ '\ cc' | ./blinker.py ", но получите сообщение об ошибке.

/bin/sh: 1: Documents/python/blinker.py: Permission denied echo: write error: Broken pipe

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вместо того, чтобы писать логику GPIO в скрипте Python, вы можете написать эту логику полностью на узле красного цвета, используя узлы raspberry pi GPIO (я думаю, что эти узлы устанавливаются по умолчанию при установке node-red на Raspberry Pi).

Я допускаю, что, поскольку время ожидания в цикле while очень короткое, я не знаю, способен ли красный узел на Raspberry Pi обрабатывать такое количество обновлений должным образом. Поэтому было бы неплохо проверить с помощью команды unix top , что процесс на узле красный не использует процессор, близкий к 100%.

Относительно конфигурации красного узла для доступа к выводам GPIO см. Также раздел Доступ к GPIO на странице https://nodered.org/docs/hardware/raspberrypi

0 голосов
/ 16 мая 2018

Для долго выполняющегося скрипта вы, вероятно, должны использовать узел daemon вместо узла exec.

Но оба эти узла будут пытаться уничтожить все запущенные экземпляры скрипта, когдаразвернута новая версия потока (что приводит к перестройке узлов).

Вы также можете явно уничтожить узлы демона, отправив ему msg.kill с именем сигнала для отправки.Из документов узла-демона:

Установка msg.kill на имя сигнала (например, SIGINT, SIGHUP) остановит процесс - но если установлен флаг перезапуска, он автоматически перезапустится.

Тот факт, что вы запускаете скрипт с помощью sudo, заключается в том, что вы не можете уничтожить скрипт напрямую, потому что пытаетесь убить процесс, принадлежащий root.если вы отправите сигнал экземпляру sudo, на котором запущен процесс, он должен завершить дочерний процесс.

...