Перейти к содержанию
    

Буферизация в QT при использовании QextSerialPort

Здравствуйте!

Столкнулся проблемой приема данных с драйвера для qt, - qextserialport

Сделал прием данных через сигналы и слоты следующим образом:

Спойлер
connect(port, SIGNAL(readyRead()), this, SLOT(readData()));  



void monMK::readData()
{
    const QByteArray data = port->readAll();
    textTerminal->addText(data);
    qDebug() << data;
    qDebug() << "working";
}

В итоге данные на терминале разделяются:

Спойлер

Pin # 4 LED ON

Pin # 3 
LED ON

Pin # 3 LED OFF

Pin # 4 LED OFF

Pin # 3 LED ON

Pin # 3 LED OFF

Pin # 4 LED ON

Pin # 3 LED ON

Pin # 3 LED OFF

Pin # 4 LED OFF

Pin # 3 LED ON

Pin # 3 LED OFF

Pin # 4 LED ON

Pin # 3 LED ON

Pin # 3 LED OFF

Pin 
# 4 LED OFF

Pin # 3 LED ON

Pin # 3
 LED OFF

Pin # 4 LED ON

Pin # 3 LED ON

Pin # 3 LED OFF

Проверил что данные отправителем не пересылаются с лишними разделяющими \r\n"
Это подтверждают данные c debug

Спойлер
"Pin # 4 LED ON\r\n"
working
"Pin # 3 "
working
"LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED OFF\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED ON\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED OFF\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED ON\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin "
working
"# 4 LED OFF\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3"
working
" LED OFF\r\n"
working
"Pin # 4 LED ON\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED OFF\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"Pin # 4 LED ON\r\n"
working
"Pin # 3 LED ON\r\n"
working
"Pin # 3 LED OFF\r\n"
working
"#"

Прошу помочь разобраться

Спасибо!

Изменено пользователем makc
Добавлены спойлеры

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/2/2023 at 2:08 PM, another_one said:

Здравствуйте!

Столкнулся проблемой приема данных с драйвера для qt, - qextserialport

textTerminal экземпляром какого класса является ?

Как вариант. У вас есть признак конца строки, вот и копируйте данные в свой промежуточный буфер, пока не дождетесь признака конца строки, 

далее выводите буфер на печать, далее опять начинаете заново заполнять свой промежуточный буфер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, dimka76 said:

textTerminal экземпляром какого класса является ?

textEdit

Я не совсем понял, то есть так и должно быть?

И мне  надо отдельно это буферизировать и форматировать??

Я думал, такого не должно быть и где-то ошибка....😕

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/2/2023 at 3:03 PM, another_one said:

textEdit

Я не совсем понял, то есть так и должно быть?

И мне  надо отдельно это буферизировать и форматировать??

Я думал, такого не должно быть и где-то ошибка....😕

 

В документации на Qt метод addText для класса QTextEdit не описан.

Есть только append. Попробуйте его.

On 6/2/2023 at 3:03 PM, another_one said:

Я не совсем понял, то есть так и должно быть?

 

Не знаю. Я просто предложил вариант выхода из положения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, dimka76 said:

В документации на Qt метод addText для класса QTextEdit не описан.

Есть только append. Попробуйте его.

 

Прошу прощения, я уже так делаю:

 

void Terminal::addText(QString st)
{
    ui->textTerminal->append(st);
}

void Terminal::addText(QString st)
{
    ui->textTerminal->append(st);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/2/2023 at 3:20 PM, another_one said:

Прошу прощения, я уже так делаю:

Вроде бы так быть не должно, т.е. не должен появляться лишний перевод строки.
Может в результате преобразования QByteArray в QString перевод строки.

Или из-за того, что вы используете \r\n, а не \n.

Пройдитесь в отладчика по строкам. Может быть удастся выяснить в каком месте появляется лишний перевод строки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал поиграться с преобразованиями с qbytearray в string согласно всем методам описанным ниже

https://stackoverflow.com/questions/14131127/qbytearray-to-qstring

Но ситуация не меняется, из этого напрашивается вывод что не в преобразовании дело😕

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В

void monMK::readData()
{
    const QByteArray data = port->readAll();

Дабвляете data в буфер, пока  в нём не будет \r или \n.

Как появился - забираете из буфера и выводите куда надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, то есть сделать также

header: QByteArray charBuffer;
....
void MainWindow::readData()
{
    QByteArray data = serial->readAll();
    console->putData(data,false);
    charBuffer.append(data);
    if (data.contains("\n")) //read into a structure until newline received.
    {
        QString myString(charBuffer);            
        if(myString.startsWith("SensorUpdate"))
        emit sensorData(myString);              
        charBuffer = "";                       
    }
}

 

как предлагают здесь?

https://forum.qt.io/topic/64706/qserialport-read-string-with-readall/3

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, another_one said:

Спасибо, то есть сделать также

header: QByteArray charBuffer;
....
void MainWindow::readData()
{
    QByteArray data = serial->readAll();
    console->putData(data,false);
    charBuffer.append(data);
    if (data.contains("\n")) //read into a structure until newline received.
    {
        QString myString(charBuffer);            
        if(myString.startsWith("SensorUpdate"))
        emit sensorData(myString);              
        charBuffer = "";                       
    }
}

 

как предлагают здесь?

https://forum.qt.io/topic/64706/qserialport-read-string-with-readall/3

 

if (data.contains("\n")) //read into a structure until newline received.
    {

Берёте из 

charBuffer

подстроку от начала до "\n"

Что надо с ней делаете

В 

charBuffer

оставляете хвост после "\n"

Делаете в цикле пока есть "\n" в charBuffer

P.S. Точно так же делается в C, C#, C++, Python, ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/2/2023 at 3:35 PM, another_one said:

Спасибо!

https://microtechnics.ru/community/qt/qstring-new-line/

Здесь наоборот спрашивают как добавить перевод строки.
Странно что у вас добавляется лишний перевод строки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/2/2023 at 10:46 PM, dimka76 said:

Странно что у вас добавляется лишний перевод строки.

Согласно документации, append() 'appends a new paragraph to the end of the text edit'.

 

Тут надо либо делать промежуточный обработчик "протокола" и выводить уже готовые склееные строки, либо применять магию для вывода: https://stackoverflow.com/questions/13559990/how-to-append-text-to-qplaintextedit-without-adding-newline-and-keep-scroll-at (я не пробовал, просто спросил у гугла).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/5/2023 at 11:28 AM, esaulenka said:

Согласно документации, append() 'appends a new paragraph to the end of the text edit'.

 

Тут надо либо делать промежуточный обработчик "протокола" и выводить уже готовые склееные строки, либо применять магию для вывода: https://stackoverflow.com/questions/13559990/how-to-append-text-to-qplaintextedit-without-adding-newline-and-keep-scroll-at (я не пробовал, просто спросил у гугла).

Вы привели ссылку на вопрос про QPlainTextEdit, а я выше приводил ссылку на QTextEdit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, dimka76 said:

Вы привели ссылку на вопрос про QPlainTextEdit, а я выше приводил ссылку на QTextEdit

Первое утверждение (что append() - это новый абзац) - из документации на QTextEdit.

Второе, действительно, касается QPlain..., но в первом же ответе упоминается, что в обоих случаях поведение одинаковое.

Чем поможет ваша ссылка, я, если честно, не понял. Один вызов append() добавляет один абзац. Ну да, это логично. Для добавления нескольких можно побить добавляемый текст символами '\n'. Тоже логично. Только к обсуждаемой "проблеме" отношения примерно никакого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...