Python 序列号在大约6小时后停止读取

Python 序列号在大约6小时后停止读取,python,serial-port,Python,Serial Port,在python中读取串行端口时,所有端口都可以正常工作,直到数小时后停止接收数据。这在运行Linux的笔记本电脑和Raspberry PI 2上都会发生。此时发送数据仍然有效。 源仍在发送数据(有时)。重新启动python脚本会有所帮助。 源发送小的包(4-12字节),间隔时间可能从几分钟到超过12小时不等 我的代码,只是接收部分,从更大的部分提取,如下所示: #!/usr/bin/python3 import tkinter import os import serial class Tr

在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()
#/usr/bin/python3
进口tkinter
导入操作系统
导入序列号
类收发器():
定义初始化(自,主):
self.port=serial.serial(
port=“/dev/ttyUSB0”,
波特率=38400,
bytesize=serial.EIGHTBITS,
奇偶校验=串行。奇偶校验\u无,
停止位=串行。停止位\u一,
超时=0
)
self.ReceivedData=bytearray()
self.Time=0
def接收器(自身):
而(self.port.in_waiting>0):
#接收数据
self.Time=0#将经过的时间重置为0
self.ReceivedData+=self.port.read(1)#将数据添加到bytearray
如果(self.Time==20):#经过一段时间后,数据包被认为已完成
打印(''.join('{:02x}'。在self.ReceivedData中x的格式(x))
self.port.reset\u输入\u缓冲区()
self.ReceivedData=bytearray()
如果(self.Time<2000):#避免再次运行到0
自身时间+=1#增加已用时间
root.after(5,self.Receiver)
root=tkinter.Tk()
收发器=收发器(根)
收发器.接收器()
root.mainloop()
正是这个接收部件在下班后停止工作,我正试图找到根本原因。 所以上面的脚本只是一个更大脚本的摘录。 它控制着房子里的灯。我想在树莓皮上运行它,而不是在PC上。R'PI有一个7英寸的触摸屏。 更大的脚本对接收到的数据进行了解码,并更新了一个非常简单的GUI,只是一堆小矩形,其中有一些短名称作为文本,指示哪些灯打开和关闭,它们也充当按钮,以切换灯的打开和关闭。除接收部分外,所有这些都可以正常工作,但最终可能会出现以下情况:另一部分干扰接收部分

我刚刚开始运行上面的脚本提取,看看它是否在没有GUI更新的情况下继续工作。我怀疑函数接收器在一段时间后无法重新启动。我需要让上面的脚本运行一天,看看它是否继续接收。我将根据发现进行更新

更新:上面的脚本继续工作。上面是一个更大的程序的提取,其中只有这部分在几个小时后停止工作。接收停止,但传输继续工作,因此我没有包括该部分

现在我发现了问题。在receiver函数中,调用了decode函数,上面是打印行。没有调用decode函数,就没有问题。decode函数有一些条件,取决于数据包长度和一些值。其中一个条件的代码包含错误。我总是开始运行scrip然后大约6小时后,一个计时器(在晚上的某个固定时间)会发送引起问题的数据包(另一种格式)。该数据包不是错误的,而是我对该数据包的解码


奇怪的是,脚本一直在工作,只有接收部分停止了。我认为它在静默中停止了,但我在这个阶段打印了很多内容,因此我没有看到错误消息告诉我使用未初始化变量的问题。它不在上面的代码中。希望上面的代码对其他人有用。

你有错误吗当串行停止发送时?是否可能是硬件问题(假设您使用的是USB到UART电缆或其他东西)?谢谢,不,我没有收到任何错误,它会自动停止工作。嗯,我能够在几分钟内成功运行此代码,从我的笔记本电脑与ESP32通信。您是否可以提供更多的代码?当串行停止发送时,您是否收到任何错误?是否可能是硬件问题(假设您使用的是USB-to-UART电缆或其他东西)?谢谢,我没有收到任何错误,它会自动停止工作。嗯,我能够成功运行此代码几分钟,从我的笔记本电脑与ESP32通信。您可以提供更多代码吗?