Проблема с чтение данных из виртуального com-порта

Реализовываю чтение данных из МК через виртуальный COM-порт. Программа подает МК установить соединение. Получает отклик. Затем передает МК команду чтения данных. После чтения дает команду стоп. И разрывает соединение. В программе задается частота оцифровки данных и длительность оцифровки. Т.е. скажем, считывать 5 секунд с частотой оцифровки 1000 Гц. Использую библиотеку serial.

Проблема в том, что у меня не получается стабильно читать данные. Читает всегда меньше, чем нужно, т.е. часть данных меняется. При этом мне периодически нужно менять длительность чтения и оцифровки (скажем до 300 секунд и 800 Гц). Длительность оцифровки (количество данных) задается в команде, которая отправляется в МК. Необходимо, добиться, чтобы все данные гарантировано считывались.

Проверял работу прошивки МК в программе ComPort Toolkit -все данные читаются точно - байт в байт. А здесь постоянно ошибки - пропадает часть данных.

Размещаю код. Прошу подсказать, что в коде не так:

class COM_PORT(Qt.QThread):
    signal = QtCore.pyqtSignal(int)

    def __init__(self, frequency):
        super().__init__()
        self.serial_port = None

        self.work = True
        self.send_messages = False
        self.record = False

        self.frequency = frequency

        self.conect_message = bytes.fromhex("010100000000000000")
        self.disconnect_message = bytes.fromhex("010200000000000000")
        self.start_message = bytes.fromhex("020001000000000000")

        self.serial_is_connect = "010101010101010155"
        self.serial_is_disconnect = "010401010101010155"
        self.serial_is_start = "010201010101010155"

    def connect_port(self):
        for try_port in list(serial.tools.list_ports.comports()):
            self.serial_port = serial.Serial()
            self.serial_port.port = try_port.device
            self.serial_port.baudrate = 576000
            self.serial_port.parity = serial.PARITY_NONE
            self.serial_port.xonxoff = 0
            self.serial_port.rtscts = 0
            self.serial_port.dsrdtr = 0
            self.serial_port.bytesize = serial.EIGHTBITS
            self.serial_port.stopbits = serial.STOPBITS_ONE
            self.serial_port.timeout = 0.2  # non-block read
            self.serial_port.writeTimeout = 1  # timeout for write
            self.serial_port.set_buffer_size(rx_size=32768, tx_size=512)

            self.serial_port.close()
            time.sleep(0.2)
            self.serial_port.open()
            time.sleep(0.2)

            if self.serial_port.isOpen():
                self.serial_port.write(self.conect_message)
                response = self.serial_port.read(9).hex()
                if response == self.serial_is_connect:
                    break
                else:
                    self.serial_port = None
            else:
                self.serial_port = None

        if self.serial_port != None:
            self.serial_port.write(self.disconnect_message)
            self.serial_port.read(9)
            self.serial_port.reset_input_buffer()
            self.serial_port.reset_output_buffer()
            self.signal.emit(1)
        else:
            self.signal.emit(-1)

    def disconnect_port(self):
        self.work = False
        self.record = False
        self.send_messages = False

    def run(self):
        while self.work:
            if self.record:
                self.read_port()
            else:
                time.sleep(2)

        self.serial_port.close()
        self.signal.emit(3)

    def stop_record(self):
        self.record = False
        self.send_messages = False

    def start_record(self, seconds):
        count = str(hex(seconds * self.frequency))[2:]
        while len(count) < 4:
            count = "0" + count
        self.start_message = bytes.fromhex("02" + count + "000000000000")

        self.record = True
        self.send_messages = True

    def read_port(self):
        self.serial_port.write(self.conect_message)
        time.sleep(0.3)
        response = self.serial_port.read(9).hex()

        self.serial_port.write(self.start_message)
        stop_times = 0
        while self.send_messages == True:

            if self.serial_port.in_waiting == 0:
                stop_times+=1
                time.sleep(0.005)
                if stop_times == 10:
                    break

            else:
                response = self.serial_port.read(900)
                THREAD_DATA.put(response)

        self.send_messages = False
        self.record = False
        self.serial_port.write(self.disconnect_message)
        response = self.serial_port.read(9).hex()

Благодарю.


Ответы (0 шт):