Quero ler dados do meu Arduino e mostrá-los em uma janela do Tkinter. Funciona bem, mas quando envio os dados para o Arduino a cada 10 ms, ele revisa muitas linhas que não estão completas, como esta:
'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
⚠️ Invalid line, skipped: ['0', '0', '0', '0', '0', '0', '0', '0', '0', 'Malik']
O estranho é que quando envio a 10 ms, funciona, mas às vezes não funciona quando movo a janela. Espero que alguém possa me ajudar. Aqui está o meu código:
def read_Serial_Values(self):
read_Line = ReadLine(ser)
self.raw_Input = read_Line.readline().decode('utf-8').strip()
# if self.is_Data_Here():
# print("!Overload!")
# self.trash = ser.read_all()
self.raw_Listet_Input = [x for x in self.raw_Input.split(",") if x]
if len(self.raw_Listet_Input) < 21:
print("⚠️ Invalid line, skipped:", self.raw_Listet_Input)
return
self.Inp_manager.save_Repeating_Input(self.raw_Listet_Input)
def is_Data_Here(self):
if ser.in_waiting >0:
return True
return False
class ReadLine:
def __init__(self, s):
self.buf = bytearray()
self.s = s
def readline(self):
i = self.buf.find(b"\n")
if i >= 0:
r = self.buf[:i+1]
self.buf = self.buf[i+1:]
return r
while True:
i = max(1, min(2048, self.s.in_waiting))
data = self.s.read(i)
i = data.find(b"\n")
if i >= 0:
r = self.buf + data[:i+1]
self.buf[0:] = data[i+1:]
return r
else:
self.buf.extend(data)
Tentei alterar o tempo limite, mas isso não mudou nada e também mudei a maneira como o programa recebe as linhas.
Você está lendo dados muito rápido, e não há garantia de que a entrada serial terminará corretamente
\n
antes que seu código tente processá-la, e é por isso que você está obtendo linhas incompletas ou "corrompidas".1. Use um tópico dedicado para leitura em série
O Tkinter é de thread única. Se você ler uma série na mesma thread da interface gráfica, a interface gráfica ficará mais lenta (e vice-versa), especialmente quando você move a janela.
Execute a leitura serial em um thread separado e coloque os dados válidos em um
queue.Queue()
que a GUI possa ler com segurança.Comece este tópico uma vez no início:
2. No seu loop Tkinter, verifique a fila
Use
after()
no Tkinter para buscar periodicamente na fila e atualizar a interface do usuário:Por favor, me avise se isso funcionar e se precisar de mais ajuda! :)