Russian Qt Forum

Qt => Вопросы новичков => Тема начата: fedotok от Июнь 12, 2014, 22:56



Название: Serial Port
Отправлено: fedotok от Июнь 12, 2014, 22:56
На COM порт приходит сообщение "message".
Терминал из примера Simple Terminal у себя выводит
message
message
message
Я хочу сравнивать текст этих сообщений
Но когда беру его, он совсем не message, а другие строки. Вывод в консоль по дебагу на каждое приходящее сообщение выглядит примерно так
"message

"
"messag"
"e

"
"message

"
"m"
"essage

"

Как там все устроено? Что нужно сделать?


Название: Re: Serial Port
Отправлено: Bepec от Июнь 12, 2014, 23:03
А без кода, а без кода, а без кода, нам ничем вам не помочь :)


Название: Re: Serial Port
Отправлено: fedotok от Июнь 12, 2014, 23:09
А без кода, а без кода, а без кода, нам ничем вам не помочь :)

да без изменений из примеров https://qt.gitorious.org/qt/qtserialport/source/13cf73fd7ac96fafc6752a5c18467ba7e6ce070e:examples/terminal

только в момент где сообщение на консоль отправляет, добавлен qDebug
Код:
void MainWindow::readData()
{
    QByteArray data = serial->readAll();
    console->putData(data);
    qDebug() << QString(data);
}

собственно и вопрос. Почему на терминал идет нормальное сообщение, а на вывод дебага нет?


Название: Re: Serial Port
Отправлено: Old от Июнь 13, 2014, 00:00
Одинаково все идёт.
Просто qDebug каждое новое сообщение выводит с новой строки.


Название: Re: Serial Port
Отправлено: fedotok от Июнь 13, 2014, 00:07
Одинаково все идёт.
Просто qDebug каждое новое сообщение выводит с новой строки.
неа. истина только изредка  
Код:
QString::compare(QString(data), "message"))== 0


Название: Re: Serial Port
Отправлено: Old от Июнь 13, 2014, 00:11
Одинаково все идёт.
Просто qDebug каждое новое сообщение выводит с новой строки.
неа. истина только изредка  
Код:
QString::compare(QString(data), "message"))== 0

Эээ. А что это за проверка?
Смысл в том, что сообщения из порта может приходить по частям. Может прийти один символ, два или пять. Вот qDebug их и показывает так, как они приходят.


Название: Re: Serial Port
Отправлено: fedotok от Июнь 13, 2014, 00:16
Одинаково все идёт.
Просто qDebug каждое новое сообщение выводит с новой строки.
неа. истина только изредка  
Код:
QString::compare(QString(data), "message"))== 0

Эээ. А что это за проверка?
Смысл в том, что сообщения из порта может приходить по частям. Может прийти один символ, два или пять. Вот qDebug их и показывает так, как они приходят.
Вот. Как мне отслеживать что сообщение пришло полностью. Добавлять какой нибудь маркер начала и конца сообщения, или как нибудь проще можно?


Название: Re: Serial Port
Отправлено: Old от Июнь 13, 2014, 00:21
Для текстового протокола, таким маркером часто делают  "\n\r". Перевод строки и возврат каретки.
Складывайте получаемые куски в буфер и проверяйте маркер конца. Как только пришел - все до него сообщение.


Название: Re: Serial Port
Отправлено: fedotok от Июнь 13, 2014, 00:25
Для текстового протокола, таким маркером часто делают  "\n\r". Перевод строки и возврат каретки.
Складывайте получаемые куски в буфер и проверяйте маркер конца. Как только пришел - все до него сообщение.

а то что консоль терминала выводит сообщения нормально. Каждое с новой строки. Она на что ориентируется?


Название: Re: Serial Port
Отправлено: Old от Июнь 13, 2014, 07:18
а то что консоль терминала выводит сообщения нормально. Каждое с новой строки. Она на что ориентируется?
Как раз из-за этого маркера "\n\r" в консолей все нормально. Новая строка в консоле начинается после перевода строки.


Название: Re: Serial Port
Отправлено: kuzulis от Июнь 13, 2014, 13:14
qDebug() добавляет символы новой строки в конец каждого выводимого контента.
Поэтому:
Код
C++ (Qt)
qDebug() << "a";
qDebug() << "b";
 

выведет:
Цитировать
a
b

а не
Цитировать
ab

чтобы в консоль выводилось также как в терминал нужно использовать std::cout (или Qt-шный эквивалент), тогда оно буит выводится как есть.