another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 (изменено) · Жалоба Здравствуйте! Столкнулся проблемой приема данных с драйвера для 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 "#" Прошу помочь разобраться Спасибо! Изменено 2 июня, 2023 пользователем makc Добавлены спойлеры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба On 6/2/2023 at 2:08 PM, another_one said: Здравствуйте! Столкнулся проблемой приема данных с драйвера для qt, - qextserialport textTerminal экземпляром какого класса является ? Как вариант. У вас есть признак конца строки, вот и копируйте данные в свой промежуточный буфер, пока не дождетесь признака конца строки, далее выводите буфер на печать, далее опять начинаете заново заполнять свой промежуточный буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 5 minutes ago, dimka76 said: textTerminal экземпляром какого класса является ? textEdit Я не совсем понял, то есть так и должно быть? И мне надо отдельно это буферизировать и форматировать?? Я думал, такого не должно быть и где-то ошибка....😕 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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: Я не совсем понял, то есть так и должно быть? Не знаю. Я просто предложил вариант выхода из положения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба On 6/2/2023 at 3:20 PM, another_one said: Прошу прощения, я уже так делаю: Вроде бы так быть не должно, т.е. не должен появляться лишний перевод строки. Может в результате преобразования QByteArray в QString перевод строки. Или из-за того, что вы используете \r\n, а не \n. Пройдитесь в отладчика по строкам. Может быть удастся выяснить в каком месте появляется лишний перевод строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба попробовал поиграться с преобразованиями с qbytearray в string согласно всем методам описанным ниже https://stackoverflow.com/questions/14131127/qbytearray-to-qstring Но ситуация не меняется, из этого напрашивается вывод что не в преобразовании дело😕 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба В void monMK::readData() { const QByteArray data = port->readAll(); Дабвляете data в буфер, пока в нём не будет \r или \n. Как появился - забираете из буфера и выводите куда надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба Спасибо, то есть сделать также 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба 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, ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 2 июня, 2023 Опубликовано 2 июня, 2023 · Жалоба On 6/2/2023 at 3:35 PM, another_one said: Спасибо! https://microtechnics.ru/community/qt/qstring-new-line/ Здесь наоборот спрашивают как добавить перевод строки. Странно что у вас добавляется лишний перевод строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 5 июня, 2023 Опубликовано 5 июня, 2023 · Жалоба 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 (я не пробовал, просто спросил у гугла). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 5 июня, 2023 Опубликовано 5 июня, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 5 июня, 2023 Опубликовано 5 июня, 2023 · Жалоба Just now, dimka76 said: Вы привели ссылку на вопрос про QPlainTextEdit, а я выше приводил ссылку на QTextEdit Первое утверждение (что append() - это новый абзац) - из документации на QTextEdit. Второе, действительно, касается QPlain..., но в первом же ответе упоминается, что в обоих случаях поведение одинаковое. Чем поможет ваша ссылка, я, если честно, не понял. Один вызов append() добавляет один абзац. Ну да, это логично. Для добавления нескольких можно побить добавляемый текст символами '\n'. Тоже логично. Только к обсуждаемой "проблеме" отношения примерно никакого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться