Почему мой сигнал QThread не испускается при чтении значений из pyserial?

Я пытаюсь создать pyqtgraph, который обновляется в реальном времени на основе значений, которые он получает от pyserial-соединения. В настоящее время у меня есть два файла: один, который считывает данные из pyserial-соединения и выдает сигнал, когда два значения изменились, и второй файл, который интерпретирует сигнал и отображает два измененных значения. По какой-то причине значения, считанные из pyserial-соединения, не передаются во второй файл. Нажатие кнопки start QPushButton запускает поток. Я сослался на этот пост, но не могу понять, почему есть проблема с сигналом, поэтому любые советы будут оценены. Спасибо заранее!

Вот первый файл:

class PortCommunication(QThread):

    # Define signal for thread communication
    data_changed = pyqtSignal(float, float)

    def run(self):
        try:
            # Define port settings
            with serial.Serial(
                port = "COM4",
            baudrate = 9600,
            bytesize = 8,
            parity = serial.PARITY_NONE,
            stopbits = 1,
            timeout = 1,
                ) as self.ser:

                count = 0
                # test only 10 iterations 
                while count < 10:           
                    count += 1
      
                    self.ser.write(b"ADC0\r\n")

                    # Get device output (should be ['#,#,#'])
                    output = self.ser.read(size=20)
                    decoded_output = (output.decode('utf-8'))

                    # Turn the decoded_output from string to list
                    final_list = decoded_output.strip().split(',')
                   
                    # Torque is the first number in the ['#', '#', '#']
                    torque = float(final_list[0])
                    speed = float(final_list[1])
                    
                    # Emit torque and speed signal
                    #print(torque, speed)        
                    self.data_changed.emit(torque, speed)
                    time.sleep(3)
                    
        except serial.serialutil.SerialException:
            print("Couldn't open port.")

Вот второй файл:

class MainWidget(QtGui.QWidget):

    def __init__ (self):                   
        super(MainWidget, self).__init__()       
        self.initializeSpace()
        
    def initializeSpace(self):        
        # Create and define buttons that will control the thread
        self.start = QtGui.QPushButton("Start")
        self.start.clicked.connect(self.startEvent)
        self.stop = QtGui.QPushButton("Stop")

        # Create Layout
        self.layout = QtGui.QGridLayout()
       
        # Add widgets to layout
        self.layout.addWidget(self.start, 0, 0)
        self.layout.addWidget(self.stop, 1, 0)

        # Set layout
        self.setLayout(self.layout)

    def startEvent(self):
        # Create a thread
        self.thread = PortCommunication()
        self.thread.start()
        # Connect signals & slots 
        self.thread.data_changed.connect(self.display_data)

    def display_data(self, torque, speed):
        print(torque, speed)
    

person Gillian Grace    schedule 22.07.2021    source источник
comment
каков результат print(x_list, y_list, torque, speed)?   -  person eyllanesc    schedule 22.07.2021
comment
@eyllanesc функция update_plot по какой-то причине не обрабатывается. ничего не возвращаю. Это потому, что нить непрерывна?   -  person Gillian Grace    schedule 22.07.2021
comment
Проблема в том, что вы не должны создавать 2 сигнала, а только один, который содержит данные обоих, изменить на: 1) добавить data_changed = pyqtSignal(float, float) 2) добавить self.data_changed.emit(torque, speed) и 3) добавить self.thread.data_changed.connect(self.update_plot) и 4) удалить все о torque_changed и speed_changed   -  person eyllanesc    schedule 23.07.2021
comment
@eyllanesc Спасибо за все ваши советы. Я пытался содержать оба значения данных; однако сюжет по-прежнему не рисует точки. Я думаю, что это как-то связано с сигналом или с тем, как он обрабатывается, потому что даже когда я помещаю простой QMessageBox.information(self, "Started!", "The thread has started.") под update_plot и подключаю его к startEvent всякий раз, когда я нажимаю кнопку запуска, ничего не происходит. У вас есть идеи, что может быть причиной этого?   -  person Gillian Grace    schedule 23.07.2021
comment
@eyllanesc Я создал точку останова в self.thread.start() и получил ошибку NameError("name 'signalStatus' is not defined").   -  person Gillian Grace    schedule 23.07.2021
comment
Я не вижу этого в коде, который вы предоставляете. Вы уверены, что код, который вы предоставляете, такой же, как вы используете?   -  person eyllanesc    schedule 23.07.2021
comment
@eyllanesc единственные изменения, которые я внес, были основаны на ваших предложениях выше.   -  person Gillian Grace    schedule 23.07.2021
comment
Я нигде не указал, что вы используете signalStatus, возможно, в вашем коде до моих комментариев уже была эта проблема, но когда я внес свои исправления, это стало заметно. Исправьте свой реальный код, если вам нужна помощь, предоставьте реальный минимально воспроизводимый пример. До свидания.   -  person eyllanesc    schedule 23.07.2021
comment
Я согласен, что для этого потребуется минимальный воспроизводимый пример. Кроме того, название довольно специфично. Если у вас есть минимальный пример, нам все равно, что это для соединения RS232.   -  person Javier Gonzalez    schedule 23.07.2021
comment
одна вещь, которую я подумал, но потом я подумал, что этого не может быть... это изменить порядок запуска потока и установления соединения. Если бы был пример, я бы попробовал это сам, прежде чем что-то говорить.   -  person Javier Gonzalez    schedule 23.07.2021
comment
@JavierGonzalez К сожалению, я получаю ту же ошибку, когда меняю порядок. Я попытаюсь создать минимальный воспроизводимый пример.   -  person Gillian Grace    schedule 23.07.2021