Итак, я читаю (и отображаю в текстовом поле tkinter) данные из последовательного соединения, но я не могу обработать возвращаемые данные так, как мне бы хотелось, чтобы запустить свои тесты. В более простых сроках, даже если отображается machine response = 0x1
, я не могу прочитать его из глобального serBuffer
.
Перед отображением его в textbox
я бы прочитал изнутри теста function
и затем проверьте, был ли ответ в string
, но теперь, когда я передаю прочитанные данные (строки) в глобальную переменную, а затем пытаюсь прочитать их, это не похоже на работу, ЕСЛИ Я не удаляю serBuffer = ""
с readserial
. Это приводит к новой проблеме, хотя. Когда я нажимаю кнопку, чтобы отправить команду, она отправляет ее, но получает ответ только после второго нажатия, и каждый раз после. Таким образом, в результате я получаю Fail
, если я запускаю тест один раз, но я получаю пропуск каждый раз после.
Изображение с желаемым ответом (что test function
не читает 0x1 и всегда возвращает FAIL)
Изображение с нежелательным ответом (которое получает ответ только после второго нажатия и каждый раз после него. Таким образом, в результате я получаю Fail, если я запускаю тест один раз, но я получаю пропуск каждый раз после).
import tkinter as tk
import serial
from serial import *
serialPort = "COM3"
baudRate = 115200
ser = Serial(serialPort, baudRate, timeout=0, writeTimeout=0) #ensure non-blocking
#make a TkInter Window
mainWindow = tk.Tk()
mainWindow.wm_title("Reading Serial")
mainWindow.geometry('1650x1000+500+100')
scrollbar = tk.Scrollbar(mainWindow)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
log = tk.Text ( mainWindow, width=60, height=60, takefocus=0)
log.pack()
log.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=log.yview)
#make our own buffer
#useful for parsing commands
#Serial.readline seems unreliable at times too
serBuffer = ""
ser.write(b'\r\n')
def readSerial():
while True:
c = (ser.read().decode('utf-8', 'ignore')) # attempt to read a character from Serial
# was anything read?
if len(c) == 0:
break
# get the buffer from outside of this function
global serBuffer
# check if character is a delimeter
if c == '\r':
serBuffer += "\n" # don't want returns. chuck it
if c == '\n':
serBuffer += "\n" # add the newline to the buffer
# add the line to the TOP of the log
log.insert('1.1', serBuffer)
serBuffer = "" # empty the buffer
else:
serBuffer += c # add to the buffer
mainWindow.after(100, readSerial) # check serial again soon
def test():
command = b" test command \r\n"
ser.write(command)
global serBuffer
time.sleep(0.5)
if "0x1" in serBuffer:
print('PASS')
return 'PASS'
else:
print('FAIL')
return 'FAIL'
button = tk.Button(mainWindow, text="Pone Test", font=40, bg='#b1c62d', command=test)
button.place(relx=0.8, rely=0, relwidth=0.1, relheight=0.05)
# after initializing serial, an arduino may need a bit of time to reset
mainWindow.after(100, readSerial)
mainWindow.mainloop()