Серийный перестает читать примерно через 6 часов - PullRequest
1 голос
/ 18 января 2020

При чтении последовательного порта в python все работает нормально до тех пор, пока не прекратятся часы приема данных. Это происходит как на ноутбуке под управлением Linux, так и на Raspberry PI 2. На этом этапе отправка данных все еще работает. Источник все еще отправляет данные (время от времени). Перезапуск скрипта python помогает. Источник отправляет небольшие пакеты (4 - 12 байт), а интервал времени может варьироваться от минут до более 12 часов.

Мой код, только получающая часть, извлеченная из большей части, выглядит следующим образом:

#!/usr/bin/python3

import tkinter
import os
import serial

class Transceiver():
    def __init__(self, main):
        self.port = serial.Serial(
            port = "/dev/ttyUSB0",
            baudrate = 38400,
            bytesize = serial.EIGHTBITS,
            parity = serial.PARITY_NONE,
            stopbits = serial.STOPBITS_ONE,
            timeout = 0
        )
        self.ReceivedData = bytearray()
        self.Time = 0

    def Receiver(self):
        while (self.port.in_waiting > 0):
            # Receiving data
            self.Time = 0                           # Reset time elapsed to 0
            self.ReceivedData += self.port.read(1)  # Add data to bytearray
        if (self.Time == 20):                       # Some time elapsed, packet considered complete
            print(''.join('{:02x} '.format(x) for x in self.ReceivedData))
            self.port.reset_input_buffer()
            self.ReceivedData = bytearray()
        if (self.Time < 2000):                      # Just avoid running to 0 again
            self.Time += 1                          # Increment time elapsed
        root.after(5, self.Receiver)

root = tkinter.Tk()
transceiver = Transceiver(root)
transceiver.Receiver()
root.mainloop()

Именно эта принимающая часть перестает работать после нескольких часов, я пытаюсь найти причину root. Таким образом, приведенный выше сценарий - это просто фрагмент более крупного сценария. Он контролирует свет в доме. Я хочу запустить его на малиновом PI, а не на P C. R'PI имеет небольшой 7-дюймовый сенсорный экран. Более крупные сценарии имеют некоторую расшифровку полученных данных и обновляют очень простой GUI, просто набор небольших прямоугольников с небольшим именем в виде текста, указывающим, какие лампы включается и выключается, и они также служат кнопками для включения и выключения ламп. Все работает хорошо, кроме принимающей части, хотя, в конце концов, возможно, что какая-то другая часть нарушит приемную часть.

Я только что запустил только что приведенное выше извлечение сценария, чтобы посмотреть, продолжает ли он работать без обновлений GUI. Я подозреваю, что функция Receiver не может быть перезапущена через некоторое время. Мне нужно запустить вышеуказанный сценарий на день, чтобы увидеть, что он продолжает получать, хотя я буду обновлять с выводами.

Обновление: вышеупомянутый скрипт продолжает работать. Выше - извлечение большой программы, где только эта часть перестает работать через несколько часов Прием прекращается, но передача продолжает работать, поэтому я не включил эту часть.

К настоящему времени я нашел проблему. В функции приемника вызывается функция декодирования, где выше - строка печати. Без вызова функции декодирования проблем нет. Функция декодирования имеет некоторые условия, в зависимости от длины пакета и некоторых значений. Код для одного из этих условий содержал ошибку. Я всегда начинал запускать сценарий снова ранним вечером, а затем, примерно через 6 часов, таймер (в определенное время поздно вечером) отправлял пакет с ошибками (другой формат), который затем вызывал проблему. Пакет не был ошибочным, но мое декодирование этого пакета.

Странно, что скрипт продолжал работать, только часть приема остановилась. Я думал, что он тихо остановился, но на этом этапе я напечатал довольно много, поэтому я не увидел сообщение об ошибке, сообщающее мне о проблеме использования неинициализированной переменной. Это не в приведенном выше коде. Надеюсь, что приведенный выше код полезен для других людей.

...