Название: Как работает 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... Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать. Название: Re: Как работает ReadyRead() Отправлено: walkrunman от Февраль 16, 2017, 11:37 У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ? Так мне не просто readLine нужен был, а еще и canReadLine... Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать. Ну... как бы их никогда и нет... Точнее они есть, но если мне нужно 6 символов, то приходят они по 5 или по 4... Можно, конечно, было написать что-нибудь обрабатывающее, берущие нужные символы, но зачем, если есть заманчивая функция readLine() Название: Re: Как работает ReadyRead() Отправлено: Пантер от Февраль 16, 2017, 11:42 Код
Название: 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), там все то же самое и много раз описано как нужно делать. Спасибо. Поищу. |