PySerial неблокирующее чтение - PullRequest
0 голосов
/ 08 ноября 2018

На данный момент я должен сделать код, который продолжает читать данные из моего COM-порта. Но в тот момент, когда я пытаюсь использовать read (), он блокирует программу, я пытался использовать потоки, но когда я делаю свой поток предназначенным для функции чтения, он продолжает блокироваться. Поэтому я добавил возврат, проблема в том, что он будет возвращать только то значение, которое прочитал, когда я нажимаю кнопку.

В этот момент Lees () читает данные в тот момент, когда я нажимаю кнопку InsertText (). Я хочу, чтобы Lees () продолжал работать в фоновом режиме, пока я использую свой интерфейс.

Интерфейс:

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit
    import serial_se_re
    import threading

    serialPort = serial_se_re.SerialPort()

    def SendDataCommand():
        serialPort.Stuur("Basic Send")

    def Verbinden():
        serialPort.Open("COM13",19200)

    def InsertText():
        print(serialPort.Lees())
        #tekst_veld.insert(message)

    app = QApplication([])
    window = QWidget()
    layout = QVBoxLayout()
    window.setWindowTitle('Python')

    thread = threading.Thread(target=serialPort.Lees())
    thread.start()

    connect_button = QPushButton('Connect')
    layout.addWidget(connect_button)
    connect_button.clicked.connect(lambda: Verbinden())

    stuur_data_button = QPushButton('Stuur message')
    layout.addWidget(stuur_data_button)
    stuur_data_button.clicked.connect(lambda: SendDataCommand())

    instert_text = QPushButton('add')
    layout.addWidget(instert_text)
    instert_text.clicked.connect(lambda: InsertText())

    tekst_veld = QLineEdit()
    layout.addWidget(tekst_veld)

    window.setLayout(layout)
    window.show()
    app.exec_()

SerialConnection:

import serial
import sys
import _thread
import threading

class SerialPort:
    def __init__(self):
        self.comportName = "COM13"
        self.baud = 19200
        self.isopen = False
        self.timeout = None
        self.serialport = serial.Serial()


    def __del__(self):
        try:
            if self.serialport.is_open():
                self.serialport.close()
        except:
            print("Kan de COM port niet sluiten, error: ", sys.exc_info()[0] )

    def CheckOpen(self):
        return self.isopen

    def Open(self,port,baud):
        if not self.isopen:
            self.serialport.port = port
            self.serialport.baudrate = baud
            try:
                self.serialport.open()
                self.isopen = True
            except:
                print("Kan port niet openen, error: ", sys.exc_info()[0])

    def Sluiten(self):
        if self.isopen:
            try:
                self.serialport.close()
                self.isopen = False
            except:
                print("Kan port niet sluiten, error: ", sys.exc_info()[0])

    def Stuur(self,message):
        if self.isopen:
            try:
                # Ensure that the end of the message has both \r and \n, not just one or the other
                newmessage = message.strip()
                newmessage += '\r\n'
                self.serialport.write(newmessage.encode('utf-8'))
            except:
                print("Error sending message: ", sys.exc_info()[0] )
            else:
                return True
        else:
            return False

    def Lees(self):
        if self.isopen:
            try:
                while(1):
                    message = self.serialport.read()
                    return(message)
            except Exception:
                print("error")
        else:
            print("Cannot open serial port")
...