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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QSerial приём данных  (Прочитано 12707 раз)
paibolit
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« : Ноябрь 06, 2020, 19:32 »

Если не затруднит когото кто досконально знает работу QSerial объясните пожалуйста как правильно принимать данные. Пересмотрел, перегуглил, перепробовал разные варианты, но так и не понял как это правильно делать Шокированный. Можно ли принимать данные не используя сигнала
Код:
readyRead()
- у меня не получилось. В замешательстве. Сигнал
Код:
readyRead()
у меня испускается только после выполнения
Код:
serial->waitForReadyRead(100);
Число принимаемых данных небольшое 10-50 байт. Данные принимаются после отправки запроса (с этим проблем нет). Самое неприятное (что собственно и подвигло к написанию данного поста) это возникновение ошибки "TimeoutError" после выполнения команды waitForReadyRead. Значение задержки на появление ошибки не влияет. Данные принимаются полностью и с ошибкой "TimeoutError" следующим кодом:
Код:
    connect(serial, SIGNAL(readyRead()), this, SLOT(read()));
.
//Подготовка запроса для COM порта
.
.
    lenRead=.....//Расчёт длины пакета от микроконтроллера
    serial->write(m_arrCom);// Запись запроса в последовательный порт
    this->thread()->msleep(100);// Засыпаем, ожидая, пока микроконтроллер обработает данные и ответит.
  m_arrCom.clear();//Очищаем буфер перед приёмом данных
  serial->waitForReadyRead(300);
      if (m_arrCom.size()!=lenRead)
          outLog("Ответ не подходит по длине Bytes read: "+QString::number(m_arrCom.size())
                  +" tim:"+QString::number(tim_read.elapsed())+" lenRead:"+QString::number(lenRead));

void SendCom::read()
{
        m_arrCom += serial->readAll();
}
Записан
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #1 : Ноябрь 06, 2020, 20:06 »

Не на семёрке такое, случайно?
Записан

paibolit
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #2 : Ноябрь 06, 2020, 20:52 »

Не на семёрке такое, случайно?
Так точно - на семёрке)). Есть ещё комп с 10й и с QT, могу попробовать и там.
Записан
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #3 : Ноябрь 06, 2020, 22:12 »

Так точно - на семёрке)). Есть ещё комп с 10й и с QT, могу попробовать и там.
Просто вопрос такой на этом форуме уже был. Более того, некоторое время назад я уже наступал на эти грабли. Позже даже описание этого бага встречал на забугорных багзиллах.
На тот момент, я смог решить этот вопрос только создав отдельный процесс, который просто считывал данные в цикле, вообще не используя тот сигнал. 10-ка вполне работала. Как и linux, конечно.
Сразу скажу: ещё и тут я спорить не буду. Возможно, что эта ошибка проявляется не у всех. У меня проявилась. И я её решил. Вот таким костылём.
Записан

paibolit
Новичок

Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #4 : Ноябрь 06, 2020, 22:34 »

Считывал данные не юзая сигнал readyRead()?
Или вообще не юзая QSerialport?

Перенёс проект на Win10 - поведение точь точь как и на семёрке....... Версия QT везде 5.15. Как то странно чтобы такие "детские" баги до сих пор имели место..........
Может ктото из гуру всё таки подскажет куда копать ?
« Последнее редактирование: Ноябрь 06, 2020, 23:18 от paibolit » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #5 : Ноябрь 06, 2020, 23:18 »

1) сделайте для передачи данных в порт отдельный буфер;
Код
C++ (Qt)
serial->write(request);
 
2) вот это не нужно, удалите:
Код
C++ (Qt)
this->thread()->msleep(100);
m_arrCom.clear();
serial->waitForReadyRead(300);
Не надо спать. Когда ответит, получите данные в слоте. А тот ответ, что пришел, когда вы спали - вы благополучно удалили...
3) это перенесите в слот read
Код
C++ (Qt)
if (m_arrCom.size()!=lenRead)
  outLog("....");
 
например:
Код
C++ (Qt)
void SendCom::read()
{
   m_arrCom += serial->readAll();
   if (m_arrCom.size()!=lenRead) {
       outLog("....");
       return;
   }
   ...
}
 
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #6 : Ноябрь 07, 2020, 12:53 »

Считывал данные не юзая сигнал readyRead()?
Да. Только чистый QSerialPort.
Вариант читать в отдельном потоке, это костыль. Но - вполне работающий.

Этот баг бережно переносят из версии в версию, иногда починяя. Улыбающийся
Я лично виндой не пользуюсь, поэтому замечаю только тогда, когда клиенту нужен асинхронный порт. И, хорошо, что этот порт на PC медленно, но отмирает. Но - долго...

P.S. Ещё можете обратить внимание на сам "свисток", через который вы и общаетесь с компьютером. Иногда помогает просто взять другой "свисток". Там ведь, при всём богатстве выбора, всего 3 основные микросхемы.
« Последнее редактирование: Ноябрь 07, 2020, 12:56 от tux » Записан

sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Ноябрь 07, 2020, 13:14 »

И, хорошо, что этот порт на PC медленно, но отмирает. Но - долго...
Давно не ходил в магазин. И куда сейчас втыкают мышь и клаву?  Подмигивающий
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #8 : Ноябрь 07, 2020, 13:47 »

Давно не ходил в магазин. И куда сейчас втыкают мышь и клаву?  Подмигивающий
В уши, конечно. Тем более, что их два.Улыбающийся
На свете ещё овер9000 машин с асинхронным портом. Кстати и порт PS/2 встречается. В основном в военке, но и на гражданке бывают. Если вы суслика не видите, из этого не следует, что его нет.
« Последнее редактирование: Ноябрь 07, 2020, 13:49 от tux » Записан

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

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Ноябрь 07, 2020, 14:15 »

 Какую то дичь  понаписали, понасоветовали. То отдельные треды, то без сигнала, то какие то слипы, то чото там отмирает у кого то. Наговнокодят а потом плачутся что не работает и что это баги.

Вопрос: а нахрена тогда вам куте вообще? Хоть бы почитали как куте работает, про евент луп, прежде чем говнокодить.

Совет , всегда использовать сигналы и не использовать блокирующие вызовы никогда!
« Последнее редактирование: Ноябрь 07, 2020, 14:17 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #10 : Ноябрь 07, 2020, 14:51 »

Совет , всегда использовать сигналы и не использовать блокирующие вызовы никогда!
Ну так ТС и говорил, что нужный сигнал не работает.
К тому же, можно взять прямой (и правильный, видимо) пример от самих разработчиков Qt и убедиться, что сигнал не испускается. Или у них тоже "говнокод"? Улыбающийся
Могу посоветовать уходить ТС на linux. где всё работает, но он вряд ли захочет. Улыбающийся
« Последнее редактирование: Ноябрь 07, 2020, 17:24 от tux » Записан

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

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Ноябрь 07, 2020, 15:37 »

 был один единственный эпичный баг в qt 5.13.0 то ли 5.13.1. И если ТС использует эту версию, то он ССЗБ.
Записан

ArchLinux x86_64 / Win10 64 bit
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Ноябрь 07, 2020, 16:02 »

был один единственный эпичный баг в qt 5.13.0 то ли 5.13.1. И если ТС использует эту версию, то он ССЗБ.
Баг в 5.13.1 и выше. Мне пришлось отъехать на 5.13.0, до сих пор работаю на нем.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
tux
Global Moderator
Бывалый
*****
Online Online

Сообщений: 404



Просмотр профиля
« Ответ #13 : Ноябрь 07, 2020, 17:09 »

Баг в 5.13.1 и выше. Мне пришлось отъехать на 5.13.0, до сих пор работаю на нем.
Откуда инфа? Интересует линк, конечно
Ну и, собственно, а почему не исправляют, может знаете?
Записан

qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #14 : Ноябрь 07, 2020, 17:55 »

Более того, некоторое время назад я уже наступал на эти грабли.

ты так и не представил рабочий пример с багом, зато ни раз про это написал, что мне о тебе думать ?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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