PySide6 QSerialPort прием данных в массив

Весы передают по RS232 Последовательность байт 0x01 0x02 0x53 0x20 0x20 0x37 0x2e 0x32 0x36 0x34 0x6b 0x67 0x71 0x03 0x04. байты 0 1 13 14 использую для определения целостности данных, а из 5 7 8 9 получаю вес. но проблема что данные приходят по байтно и функция приема вызывается 15 раз. можно как-то настроить прием чтоб считывался массив целиком за раз?

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QSize, QTimer
from PySide6.QtSerialPort import QSerialPort
from PySide6.QtCore import QIODeviceBase, Slot, QByteArray

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.serial_buffer = None
        self.resp1 = {}
        self.num_send = 0
        self.ser = QSerialPort(self)
        self.ser.readyRead.connect(self.receive)

        self.uart_con_scales()

    def uart_con_scales(self): # Настраиваю подключение
            self.ser.setPortName("COM8")
            if self.ser.open(QIODeviceBase.OpenModeFlag.ReadWrite):
                self.timer = QTimer()
                self.timer.setInterval(500)
                self.timer.timeout.connect(self.send_port1)
                self.timer.start()

    @Slot()
    def receive(self):
            resp= self.ser.readLine()  # Read all data from serial buffer
            print(resp) # Этот код выполняется 15 раз


    def send_port1(self):#Передаю запрос на получение веса
        if self.num_send == 0:
            self.ser.write(b'\x05')
        if self.num_send == 1:
            self.ser.write(b'\x11')
        if self.num_send == 1:
            self.num_send = 0
        else:
            self.num_send = 1

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

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

Автор решения: MBo

Нет, не гарантируется, что вся посылка из 15 байт придёт за один раз. Поэтому складывайте принятые части в одну строку или список.

data += self.ser.readLine()

Затем анализируйте, что длина данных достаточная, что в них есть стартовая и финишная посылка. Если да, то вырезайте посылку из data и обрабатывайте

→ Ссылка
Автор решения: Валера Бородулин

После изменения метода @Slot(), все заработало как надо:

@Slot()
def receive(self):
    if self.start: # Если флаг разрешения приема установлен
      self.data = self.ser.readLine() # Переноси весь принятый буффер
      self.start = False # Снимаем флаг начала приема
def send_port1(self): # Передаю запрос на получение веса
    self.ser.write(b'\x05')
    self.ser.write(b'\x11')
    self.start = True # Ставим флаг разрешения приема
→ Ссылка