Проблема с чтение данных из виртуального 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()
Благодарю.