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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QSerial приём данных  (Прочитано 10976 раз)
qate
Супер
******
Offline Offline

Сообщений: 1175


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

объясните пожалуйста как правильно принимать данные

классика: RTFM по все поля https://doc.qt.io/qt-5/qtserialport-creaderasync-example.html
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


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


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

Откуда инфа? Интересует линк, конечно
Ну и, собственно, а почему не исправляют, может знаете?
Ссылку на багтрекер не искал, но вот следы:
http://www.prog.org.ru/index.php?topic=32505.msg240168#msg240168
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
tux
Крякер
****
Offline Offline

Сообщений: 399



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

ты так и не представил рабочий пример с багом, зато ни раз про это написал, что мне о тебе думать ?
Я уже говорил, возьми стандартный пример - баг там будет. Если у тебя он не воспроизводится, то из этого не следует, что другие криворуки.
Записан

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

Сообщений: 2812


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

Цитата: sergek
Я уже говорил, возьми стандартный пример

sergek, Какой пример?

Как уже было сказано ранее, баг с readyRead() был именно в 5.13.1: https://bugreports.qt.io/browse/QTBUG-78086
Всё, точка. Остальное блабла - это просто словестный мусор.

Цитата: tux
Ну и, собственно, а почему не исправляют, может знаете?

tux, что не исправляют? Хватит уже троллить.

PS: Да и некому больше исправлять баги, т.к. нового сопровождающего не нашли, а старый недавно покинул проект.
Если хочешь - бери и исправляй теперь сам.. Опен сорс все-таки. ))

PS: И еще, чтобы при-закрыть разное, скажу, что начиная с версии 5.14.0 больше никаких изменений в qtserialport не было.
« Последнее редактирование: Ноябрь 07, 2020, 18:51 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
tux
Крякер
****
Offline Offline

Сообщений: 399



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

Хватит уже троллить.
Даже не думал. Впрочем, если будет решение - возьму на вооружение. Если нет - есть костыль. Улыбающийся
Хотя, 7-ки всё меньше, может и не придётся уже...
Записан

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

Сообщений: 2812


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

Цитировать
Хотя, 7-ки всё меньше, может и не придётся уже...

Да нет разницы в 7/8/10-ке.

Цитировать
Впрочем, если будет решение - возьму на вооружение.

Какое решение? Я говорю, что readyRead() работает везде кроме Qt 5.13.1. Что еще непонятно?
Записан

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

Сообщений: 870


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


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

sergek, Какой пример?
Как уже было сказано ранее, баг с readyRead() был именно в 5.13.1: https://bugreports.qt.io/browse/QTBUG-78086
Всё, точка. Остальное блабла - это просто словестный мусор.
Да, 5.13.1, точка. Извини, просто не запомнил, где исправили, т.к. с 5.13.0 не сдвинулся.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
tux
Крякер
****
Offline Offline

Сообщений: 399



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

Какое решение? Я говорю, что readyRead() работает везде кроме Qt 5.13.1. Что еще непонятно?
Нормальное решение. Которое работает везде, а не только у вас. Улыбающийся
Только что проверил - 5.15.1 - баг остался.
P.S. Чип свистка CH340
« Последнее редактирование: Ноябрь 07, 2020, 20:28 от tux » Записан

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

Сообщений: 1175


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

Только что проверил - 5.15.1 - баг остался.

сможешь выложить пример (багрепорт) с багом или мы должны догадываться от твоих способностях ?

Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



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

сможешь выложить пример (багрепорт) с багом или мы должны догадываться от твоих способностях ?
Экстрасенсорику надо развивать с младенчества! Улыбающийся
Вот очередная семёрка докачается, покажу пример. Он, кстати, не так уж и далеко ушёл от примера от самой Qt.
P.S. Я ошибся. Работает. Может быть, оно и в самом деле, проблема была только в одной версии Qt.
« Последнее редактирование: Ноябрь 08, 2020, 08:34 от tux » Записан

paibolit
Новичок

Offline Offline

Сообщений: 10


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

Спасибо всем кто отписался.... Свистков у меня 2 - мой на FTDI, и клиентский на PL2303 - поведение одинаковое. Самый стабильный приём получился при приёме данных по сигналу readReady(). Один из моментов которые я не могу понять это почему этот сигнал появляется только после пользования waitForReadyRead(), но больше всего БЕСИТ !!!!!!!!!!! появление ошибки таймаут после пользования waitForReadyRead(), причём независимо от длительности задержки. Версия QT 5.15.1. Программа проверялась и на 10ке и на 7ке. Железо на 10ке значительно сильнее, но при этом по сигналу readReady() на 10ке всегда принимается исключительно по 1му байту, в то время как на 7ке при приёме пакета 7 байт за один раз залетало и 4 байта(размер буфера и задавал и не задавал) - этот момент также непонятен....
Может комуто мои изыскания будут полезны..........
P.S. Весь гемморой начался после того как рабочая программа с использованием QModbusRtuSerialMaster на I5 не захотела работать на более слабом железе и пришлось связь по MODBUS реализовывать через QSerialPort
« Последнее редактирование: Ноябрь 08, 2020, 15:13 от paibolit » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


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


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

Один из моментов которые я не могу понять это почему этот сигнал появляется только после пользования waitForReadyRead(), ...
Трудно гадать без исходников, но по симптомам - отсутствует цикл обработки событий.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
paibolit
Новичок

Offline Offline

Сообщений: 10


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

Цитировать
Трудно гадать без исходников, но по симптомам - отсутствует цикл обработки событий.
Код в первом посте
http://www.prog.org.ru/index.php?topic=32856.msg243311#msg243311
 изменение времени задержки проблему появления ошибки таймаута не решают.
Код обработки ошибок:
Код:
    connect(serial, SIGNAL(error(QSerialPort::SerialPortError)),
                this, SLOT(errorSerial(QSerialPort::SerialPortError)));

void SendCom::errorSerial(QSerialPort::SerialPortError err)
{
    qDebug()<<"SendCom Error: "+serial->errorString();//QString::number(err);
}
« Последнее редактирование: Ноябрь 08, 2020, 15:17 от paibolit » Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



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

Вы бы лучше накидали полный пример, как именно и что вы делаете. Потому что на кусках кода удачно получается только гадать. Как на бараньей лопатке. Улыбающийся
Записан

paibolit
Новичок

Offline Offline

Сообщений: 10


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

Заголовочный файл нужен ?

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sendcom.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

   QString PORT="COM4";
   sendCom.setPORT(PORT);// Устанавливаем номер порта
   if(!sendCom.InitPort())qDebug<<"Что то не получилось с "<<PORT;

   
   qDebug()<<"Получилось подключится к "<<PORT;


}
sendcom.cpp
Код:
#include "sendcom.h"
#include <QDebug>


SendCom::SendCom(QObject *parent) : QObject(parent)//,

{

//qDebug("Potok SendCom telo");
//qDebug()<<"Telo Thread:"<<QString::number((int)QThread::currentThreadId());
}

bool SendCom::InitPort()
{
    if(!InitSerial())return false;

    if(!SendAndRead())
    {
        serial->close();
        return false;
    }
    qDebug()<<PORT<<" Read:"<<QString(m_arrCom.toHex().toUpper());

        serial->close();
        return true;
}

bool SendCom::InitSerial()
{
    qDebug()<<"Init START "<<PORT;
    serial=new QSerialPort(this);
    serial->setPortName(PORT);
    serial->setBaudRate(QSerialPort::Baud38400);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);

    if(!serial->open(QSerialPort::ReadWrite))
    {
        qDebug()<<"ERROR !!! Не могу открыть порт "<<PORT;
    return false;
    }


    connect(serial, SIGNAL(readyRead()), this, SLOT(read()));
    connect(serial, SIGNAL(error(QSerialPort::SerialPortError)),
                this, SLOT(errorSerial(QSerialPort::SerialPortError)));
    return true;
}

bool SendCom::SendAndRead()
{
   serial->clear();
   w_arrCom.clear();//Очищаем массив перед подготовкой пакета

w_arrCom = QByteArray::fromHex("010404020001913A");


quint8 lenRead=........;//Вычисление длины ответа от устройства


for (quint8 i=0;i<2;i++)//Две попытки отправки запроса и получения ответа
{
    qDebug()<<"Попытка №"<<QString::number(i+1);
  serial->write(w_arrCom);// Запись в последовательный порт

    this->thread()->msleep(qCeil(150));// Засыпаем, ожидая, пока микроконтроллер обработает данные и ответит.
  m_arrCom.clear();//Очищаем буфер перед приёмом данных

serial->waitForReadyRead(300);//Без этой команды данные не приходят в буфер от слова СОВСЕМ)))

      if (m_arrCom.size()==lenRead) break;
      else{
          qDebug<<"Ответ не подходит по длине Bytes read: "<<QString::number(m_arrCom.size())
                  <<" lenRead:"<<QString::number(lenRead);

}
      serial->clear();
}
if (m_arrCom.size()!=lenRead) return false;

return true;
}

void SendCom::read()
{

//qDebug()<< "Доступно: "<<serial->bytesAvailable();
        m_arrCom += serial->readAll();
}

void SendCom::errorSerial(QSerialPort::SerialPortError err)
{
    qDebug()<<"SendCom Error: "+serial->errorString();//QString::number(err);
}

void SendCom::setPORT(QString m_PORT)
{
    if (PORT == m_PORT)
        return;

    PORT = m_PORT;
}
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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