Объявляем в конструкторе окна строку — свой буфер.
#Буфер для накапливания строк из ком порта.
self.serialStrbuffer = ""
Накапливаем её до прихода символа конца строки, потом разделяем строку на этом символе и помещаем в список. Затем, если конечный элемент списка – пустая строка, то выводим все элементы списка кроме последнего в своё текстовое поле.
def onRead(self):
rx_data = self.serial.readAll()#Считываем куски строк из буфера
rx_str = str(rx_data, 'utf-8')# Переводим массив байт в строку
#Соединяем куски в цельные строки в нашем буфере. Разделитель "", т е без разделителя.
self.serialStrbuffer = "".join([self.serialStrbuffer, rx_str])
#print(self.serialStrbuffer)
# Разделяем строки на подстроки на символе конца строки
tempList = self.serialStrbuffer.split("\r\n")
#print(tempList)
#Как только приходит кусок строки, содержащий символ конца строки \r\n,
# в списке становится на одну строку больше. Значит в первом элементе списка целая строка.
#Иногда прилетает сразу 2 целых строки. Поэтому сделаем цикл. Последний элемент списка
# содержит символ конца строки.
length = len(tempList)
if length>1 and tempList[length-1] == '':# Если строка не одна и последняя пустая
#for string in tempList:
#self.plainTextEditLog.appendPlainText(string)
#Выводим все строки из списка, кроме последней.
for i in range(0,length-1,1):
self.plainTextEditLog.appendPlainText(tempList[i])
self.serialStrbuffer = ""#очищаем буфер
# очищаем список, (он и так очистится, т к очистили буфер)
Ф-я print выводит в терминал такое
Все строки, присылаемые микроконтроллером заканчиваем символом конца строки "\r\n".
Возможны и иные варианты решения, но это работает.