Python 序列号在大约6小时后停止读取
在python中读取串行端口时,所有端口都可以正常工作,直到数小时后停止接收数据。这在运行Linux的笔记本电脑和Raspberry PI 2上都会发生。此时发送数据仍然有效。 源仍在发送数据(有时)。重新启动python脚本会有所帮助。 源发送小的包(4-12字节),间隔时间可能从几分钟到超过12小时不等 我的代码,只是接收部分,从更大的部分提取,如下所示: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
#!/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通信。您可以提供更多代码吗?