Как выполнить корректную очистку GPIO и SPI на Raspberry Pi, используя Python - PullRequest
2 голосов
/ 30 января 2020

Я экспериментирую с беспроводной связью, используя NRF24L01 + между Arduino и Raspberry Pi. Я могу установить sh соединение и отправить данные в RPi, но когда я останавливаюсь и запускаю программу, данные не принимаются. Не отображается сообщение об ошибке или предупреждение. После перезагрузки все работает нормально, так что я думаю, что с моим кодом очистки что-то не так.

Вот мой код:

import RPi.GPIO as GPIO
import time
import spidev
from libs.lib_nrf24 import NRF24


try:

    GPIO.setmode(GPIO.BCM)

    pipes = [[0xE8, 0xE8, 0xF0, 0xF0, 0xE1], [0xF0, 0xF0, 0xF0, 0xF0, 0xE1]]
    radio = NRF24(GPIO, spidev.SpiDev())
    radio.begin(0, 25)
    radio.setPayloadSize(32)
    radio.setChannel(0x76)
    radio.setDataRate(NRF24.BR_250KBPS)
    radio.setPALevel(NRF24.PA_MIN)
    radio.setAutoAck(True)
    radio.enableDynamicPayloads()
    radio.enableAckPayload()
    radio.openReadingPipe(1, pipes[1])
    radio.printDetails()
    radio.startListening()

    while True:

        while not radio.available(0):
            time.sleep(1/100)

        receivedMessage = []
        radio.read(receivedMessage, radio.getDynamicPayloadSize())
        print("Received: {}".format(receivedMessage))

        print("Translating our received Message into unicode characters...")
        string = ""

        for n in receivedMessage:
            if (n >= 32 and n <= 126):
                string += chr(n)
        print("Our received message decodes to: {}".format(string))

finally:
    print("Performing cleanup...")
    radio.end()
    GPIO.cleanup()
    print("Cleanup done...")

Библиотека lib_nrf24, которую я использую, это: https://github.com/BLavery/lib_nrf24

Вывод radio.printDetails() отображается правильно в обоих случаях.

Я прекращаю работу программы, используя Ctrl + C, и оба сообщения печатаются - Performing cleanup... а также Cleanup done...

Как мне выполнить очистку, чтобы иметь возможность многократно запускать мою программу без перезагрузки RPi? Или в моем коде есть какая-то другая ошибка?

Спасибо за помощь

...