При чтении последовательного порта в 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 часов, таймер (в определенное время поздно вечером) отправлял пакет с ошибками (другой формат), который затем вызывал проблему. Пакет не был ошибочным, но мое декодирование этого пакета.
Странно, что скрипт продолжал работать, только часть приема остановилась. Я думал, что он тихо остановился, но на этом этапе я напечатал довольно много, поэтому я не увидел сообщение об ошибке, сообщающее мне о проблеме использования неинициализированной переменной. Это не в приведенном выше коде. Надеюсь, что приведенный выше код полезен для других людей.