Problem z czyszczeniem kolejki Queue()

0

Witam.. Piszę aplikację obsługującą modem ST75-80. Mianowicie mam taki problem, że podczas kliknięcia przycisku "RESET" ramki za pierwszym razem zwracane są poprawnie. Niestety, za każdym kolejnym razem mimo czyszczenia kolejki dane się dopisują przez co zwrócone dane są niepożądane. Wrzucam tylko częściowy kod zawierający mój problem.

global ser
ser = serial.Serial()
global q
q = queue.Queue()

def serveException():
        try:
            t2 = Thread(target=receiveData, args=())
            if(t2.isAlive()==False):
                t2.start()
        except:
            print("Nie moze wystartowac watek")  

def receiveData():
    global ser
    global q
    while(True):
        if(ser.isOpen() == True):
            if(ser.inWaiting()):
                s = ser.read()
                for i in s:
                    q.put(i)
                while not q.empty():
                    print(hex(q.get()))
                    q.queue.clear()

def sendReset():
    try:
        tablicaHEX = bytes([0x02, 0x00, 0x3C, 0x3C, 0x00])
        ser.setRTS(True)
        ser.setDTR(True)
        time.sleep(0.01)
        ser.write(bytes(tablicaHEX))
        ser.setRTS(False)
        ser.setDTR(True)
        serveException()
    except:
        print("nie")`

Od razu uprzedzę że zmienna ser to nic innego jak zmienna, która operuje na bibliotekach pySerial. TablicaHex to nic innego jak wysyłane ramki wymagane do RESETU obliczone na podstawie dokumentacji. Aplikacja zwraca mi takie wartości o to

Output:

0x3f
0x9
0x6

itd itd. Next Click

0x3f0x9

0x60x2

Jak możecie zauważyć kolejka nie jest czyszczona. Efektem pożądanym jest mieć za każdym kolejnym kliknięciem uzyskaną taką wartość jak za pierwszym kliknięciem. Dziękuję za pomoc

0

Skąd Wziałeś to Queue(), bo w collections tego nie ma, jak Masz jakąś własną strukturę, to pokaż. Ciekawe, jak to też Ci działa, bo używając collections, to takiego kodu:

import collections

q = collections.deque()
q.append(2)
q.collections.clear()

nie ma. Za to jest:

import collections

q = collections.deque()
q.append(2)
q.clear()
0

https://docs.python.org/3/library/queue.html

Używam tego cuda z dokumentacji

0

Yhm, ale Masz zla skladnie, q.clear() powinno byc.

0

Czyli jak byś poprawił mój kod, aby odpowiednio pobierał ramki i jednocześnie czyścił kolejkę ?

0
Nadziany Kot napisał(a):

Czyli jak byś poprawił mój kod, aby odpowiednio pobierał ramki i jednocześnie czyścił kolejkę ?

Jak logika jest OK, to Sprobuj zamienic tylko jedna linijke:
q.queue.clear () na
q.clear()

0

Niestety nie pomogło pokazuje błąd: AttributeError: 'Queue' object has no attribute 'clear'

0
Nadziany Kot napisał(a):

Niestety nie pomogło pokazuje błąd: AttributeError: 'Queue' object has no attribute 'clear'

Rzeczywiście, przejrzałem dokumentację. W takim razie porób wcięcia w kodzie, żeby się go dało analizować.

0
global ser
ser = serial.Serial()
global q
q = queue.Queue()
 
def serveException():
        try:
            time.sleep(0.05)
            t2 = Thread(target=receiveData, args=())
            if(t2.isAlive()==False):
                t2.start()
        except:
            print("Nie moze wystartowac watek")    
 
def receiveData():
    global ser
    global q
    while(True):
        if(ser.isOpen() == True):
            if(ser.inWaiting()):
                s = ser.read()
                for i in s:
                    q.put(i)
                while not q.empty():
                    print(hex(q.get()))
                    q.queue.clear()
 
def sendReset():
    try:
        tablicaHEX = bytes([0x02, 0x00, 0x3C, 0x3C, 0x00])
        ser.setRTS(True)
        ser.setDTR(True)
        time.sleep(0.01)
        ser.write(bytes(tablicaHEX))
        ser.setRTS(False)
        ser.setDTR(True)
        serveException()
    except:
        print("nie")

def createResetButton():
     buttonReset = Button(text = "Reset", command=sendReset)
     buttonReset.grid(row=2, column = 2)

def createFrame():
    mainFrame = tkinter.Tk()
    mainFrame.geometry('300x200')
    createLabel()
    createDataList()
    listOfComPorts(mainFrame)
    createConnectButton()
    createResetButton()
    mainFrame.mainloop()

def main():
    createFrame()
    ser.close

Bardzo btm podziękował za pomoc dlaczego tak się dzieję :) Wcięcie poprawione....

0

PROBLEM ROZWIĄZANY. Wątek wykonywał się w nieskończoność.

1 użytkowników online, w tym zalogowanych: 0, gości: 1