Problem z czyszczeniem kolejki Queue()

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.

Kopiuj
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:

Kopiuj
0x3f
0x9
0x6

itd itd. Next Click

Kopiuj
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

edytowany 1x, ostatnio: flowCRANE
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4927
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:

Kopiuj
import collections

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

nie ma. Za to jest:

Kopiuj
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

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4927
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ę ?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4927
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'

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4927
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
Kopiuj
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ść.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.