Russian Qt Forum

Qt => Вопросы новичков => Тема начата: walkrunman от Февраль 16, 2017, 09:49



Название: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 09:49
Пытаюсь написать свой сигнал... И вот не получается...
Как работает readyread у QSerialPort?
Почему это вдруг цикл? Как он вообще посылается и кто его посылает?

Вот мои тщетные попытки
void SerialRW::canread()
{
    int msecs = -1;
    if(!port->canReadLine())
    {
      while(port->waitForReadyRead(msecs) &&   !port->canReadLine() );
    }
    if(port->canReadLine())
    {
        emit can();
    }
}
Как бы сигнал проде и посылается... Но при попытке в конструкторе класса вызвать все это дело и с таймером
QTimer *timer = new QTimer(this);
canread();
connect(this, SIGNAL(can()), this, SLOT(read());
timer->start(10);

ничего не происходит.
read работает - проверено.


Название: Re: Как работает ReadyRead()
Отправлено: gil9red от Февраль 16, 2017, 10:01
У вас таймер ничего и не делает вы его запускаете, но он никакой сигнал/слот не дергает по таймауту


Название: Re: Как работает ReadyRead()
Отправлено: kuzulis от Февраль 16, 2017, 10:45
А в чем смысл всей этой шелухи?


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 10:47
Исправил!)) Спасибо) Все заработало. Ступил.

Еще 1 вопрос.
Вот read
void SerialRW::read()
{
    QString line = port->readLine().trimmed();
    qDebug() << line;
}

А вот результаты.

Нормальные данные: 1.64
Но откуда-то возникает глюк: 1.61.64
Такого результата передаваться вроде бы не должно. Как можно исправить?


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 10:55
А в чем смысл всей этой шелухи?

Если читать все подряд, то все это читается какими-то неадекватными кусками.
Поэтому нужно было читать по строчке canReadLine()
А вот сигналов я таких не нашел, чтобы вот прям... читало, когда можно читать строку. Короче я не очень разобрался че к чему, мне просто код скинули без особых объяснений, я его хотел в свою прогу вставить - не особо получилось.
Ну вроде как canReadLine() возвращает true то ли когда перенос строки видит, то ли еще что...
А readLine возвращает строку от начала до переноса строки...
Только canReadLine не сигнал, а если в while пихать, то у меня вообще одна консоль без приложения открывалась...


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 11:00
И еще 1 очень важный вопрос...
А как бы вообще без таймера обойтись?
Просто если увеличить скорость передачи данных, то мс - это как-то долговато... Или туда можно передавать микросекунды?


Название: Re: Как работает ReadyRead()
Отправлено: Пантер от Февраль 16, 2017, 11:07
У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 11:19
У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

Так мне не просто readLine нужен был, а еще и canReadLine...
Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать.


Название: Re: Как работает ReadyRead()
Отправлено: Пантер от Февраль 16, 2017, 11:22
У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

Так мне не просто readLine нужен был, а еще и canReadLine...
Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать.
readyRead срабатывает при поступлении новой порции данных. В слоте же проверяешь есть ли нужное тебе количество данных. Если нет, просто выходишь.


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 16, 2017, 11:37
У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

Так мне не просто readLine нужен был, а еще и canReadLine...
Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать.
readyRead срабатывает при поступлении новой порции данных. В слоте же проверяешь есть ли нужное тебе количество данных. Если нет, просто выходишь.

Ну... как бы их никогда и нет... Точнее они есть, но если мне нужно 6 символов, то приходят они по 5 или по 4... Можно, конечно, было написать что-нибудь обрабатывающее, берущие нужные символы, но зачем, если есть заманчивая функция readLine()


Название: Re: Как работает ReadyRead()
Отправлено: Пантер от Февраль 16, 2017, 11:42
Код
C++ (Qt)
void Some::onReadyRead()
{
 while(serialPort->canReadLine()) {
   const auto &line = serialPort->readLine();
 }
}
 


Название: Re: Как работает ReadyRead()
Отправлено: kuzulis от Февраль 16, 2017, 11:55
Цитата: walkrunman
Точнее они есть, но если мне нужно 6 символов, то приходят они по 5 или по 4...

Блин, подобного рода хрень поднимается изо дня в день! Ну сколько можно уже, а?

QSerialPort - не волшебник.

Цитировать
А вот сигналов я таких не нашел, чтобы вот прям... читало, когда можно читать строку. Короче я не очень разобрался че к чему, мне просто код скинули без особых объяснений, я его хотел в свою прогу вставить - не особо получилось.

Цитата: walkrunman
Короче я не очень разобрался че к чему

Короче - читайте доку, гуглите. Все уже обсосано по тыщщи раз. Я предлагаю "банить" за такие посты".



Название: Re: Как работает ReadyRead()
Отправлено: Пантер от Февраль 16, 2017, 12:03
kuzulis, ты лучше не ругайся, а запили статью "как правильно работать с QIODevice", а я ее закреплю в разделе для новичков. Сможем просто в нее посылать.


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 17, 2017, 02:40
Блин, подобного рода хрень поднимается изо дня в день! Ну сколько можно уже, а?

Что-то хреново эта хрень поднимается.

QSerialPort - не волшебник.

Кто ж знал. windows.h который читает по символу вот волшебник. А QSerialPort так не умеет почему-то, хотя логично предположить, что должен.

Короче - читайте доку, гуглите. Все уже обсосано по тыщщи раз. Я предлагаю "банить" за такие посты".

Рад, что дал повод вам самоутвердиться.
Гугление и документация как-то мало дает, когда сталкиваешься с этим впервые. Везде либо недостаточно подробно, либо напичкано куча какого-то бреда, и прочтение которого так и не дает понять, как оно все работает. И везде еще у всех конечные файлы. У меня он бесконечный, можно считать.
Даже книжку скачал - переведенная от создателей. Ну ооооч понятно.
Обсосано - могли бы и ссылку кинуть.


Название: Re: Как работает ReadyRead()
Отправлено: Пантер от Февраль 17, 2017, 09:01
walkrunman, ищи по форуму чтение из сокета (QTcpSocket), там все то же самое и много раз описано как нужно делать.


Название: Re: Как работает ReadyRead()
Отправлено: kuzulis от Февраль 17, 2017, 09:29
Просто кто-то со своим "windows.h" мировоззрением хочет так взять и на ШАРУ проскочить. Не получится. Нужно понять идеологию QIODevice.


Название: Re: Как работает ReadyRead()
Отправлено: walkrunman от Февраль 17, 2017, 09:48
walkrunman, ищи по форуму чтение из сокета (QTcpSocket), там все то же самое и много раз описано как нужно делать.
Спасибо. Поищу.