Russian Qt Forum
Ноябрь 24, 2024, 12:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как работает ReadyRead()  (Прочитано 12120 раз)
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 работает - проверено.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Февраль 16, 2017, 10:01 »

У вас таймер ничего и не делает вы его запускаете, но он никакой сигнал/слот не дергает по таймауту
Записан

kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Февраль 16, 2017, 10:45 »

А в чем смысл всей этой шелухи?
Записан

ArchLinux x86_64 / Win10 64 bit
walkrunman
Гость
« Ответ #3 : Февраль 16, 2017, 10:47 »

Исправил!)) Спасибо) Все заработало. Ступил.

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

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

Нормальные данные: 1.64
Но откуда-то возникает глюк: 1.61.64
Такого результата передаваться вроде бы не должно. Как можно исправить?
Записан
walkrunman
Гость
« Ответ #4 : Февраль 16, 2017, 10:55 »

А в чем смысл всей этой шелухи?

Если читать все подряд, то все это читается какими-то неадекватными кусками.
Поэтому нужно было читать по строчке canReadLine()
А вот сигналов я таких не нашел, чтобы вот прям... читало, когда можно читать строку. Короче я не очень разобрался че к чему, мне просто код скинули без особых объяснений, я его хотел в свою прогу вставить - не особо получилось.
Ну вроде как canReadLine() возвращает true то ли когда перенос строки видит, то ли еще что...
А readLine возвращает строку от начала до переноса строки...
Только canReadLine не сигнал, а если в while пихать, то у меня вообще одна консоль без приложения открывалась...
Записан
walkrunman
Гость
« Ответ #5 : Февраль 16, 2017, 11:00 »

И еще 1 очень важный вопрос...
А как бы вообще без таймера обойтись?
Просто если увеличить скорость передачи данных, то мс - это как-то долговато... Или туда можно передавать микросекунды?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Февраль 16, 2017, 11:07 »

У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
walkrunman
Гость
« Ответ #7 : Февраль 16, 2017, 11:19 »

У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

Так мне не просто readLine нужен был, а еще и canReadLine...
Т.е. чтобы не просто он мог прочитать, а чтобы хорошо мог прочитать.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Февраль 16, 2017, 11:22 »

У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
walkrunman
Гость
« Ответ #9 : Февраль 16, 2017, 11:37 »

У QSerialPort разве не работает сигнал http://doc.qt.io/qt-5/qiodevice.html#readyRead ?

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

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Февраль 16, 2017, 11:42 »

Код
C++ (Qt)
void Some::onReadyRead()
{
 while(serialPort->canReadLine()) {
   const auto &line = serialPort->readLine();
 }
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Февраль 16, 2017, 11:55 »

Цитата: walkrunman
Точнее они есть, но если мне нужно 6 символов, то приходят они по 5 или по 4...

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

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

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

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

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

Записан

ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Февраль 16, 2017, 12:03 »

kuzulis, ты лучше не ругайся, а запили статью "как правильно работать с QIODevice", а я ее закреплю в разделе для новичков. Сможем просто в нее посылать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
walkrunman
Гость
« Ответ #13 : Февраль 17, 2017, 02:40 »

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

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

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

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

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

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Февраль 17, 2017, 09:01 »

walkrunman, ищи по форуму чтение из сокета (QTcpSocket), там все то же самое и много раз описано как нужно делать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.