Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с QSerialPort, Зависает программа 
:(
    Опции темы
alexeev
Дата 4.3.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Здравствуте, заметил странное поведение в работе класса QseriaPort
Конечно, скорее всего я делаю, что-то не верно...
Имеется следующая проблема, при первом включении программы, после включения компьютера, программа сразу же зависает, при открывании ком порта. Если запустить HyperTerminal и считать данные с ком, и снова запустить программу, все прекрасно работает. В режиме дебага, данные корректо идут и считываются, даже первый раз.
Скорее всего зависание происходит на строчке где вызывается метод readall, он вызывается соответсвенно по сигналу readyread().
Уже месяц не могу понять в чем проблема? Может кто-то сталкивался с чем-то похожим?
PM MAIL   Вверх
kuzulis
Дата 4.3.2013, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Здравствуте, заметил странное поведение в работе класса QseriaPort

Это который этот?

Цитата

Конечно, скорее всего я делаю, что-то не верно...

Код в студию.
PM MAIL   Вверх
math64
Дата 4.3.2013, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Пользуетесь последней версией? Если нет, рекмендую обновиться.
PM   Вверх
alexeev
Дата 5.3.2013, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Цитата

Это который этот?

Да

Цитата

Код в студию.


Попробую привести куски с поянениями:

Есть несколько классов, один СWidget - соответсвенно гуи интерефейс, класс СSerialPort - класс для настройки и получения данных, класс Сprocessing - полученные данные из класса CSerialPort, отправляются в этот класс и разбираются на массивы и переменные.
В конструкторе Cwidget, создаются объекты всех классов, и прописываеются все конекты. (Один из них по сигналу readyread от объекта класса CSerialPort, перейти в метод этого класса, в котором  - 
Код

QByteArray data;
 data = serial->readAll();) 

После этого данные пересылаются в класс CProcessing, в котором, они накпаливаются, пока не соберется сообщение определенной длины, в этом сообщение находится заголовок, сверяется контрольная сумма, и если все корректно, сообщение разбирается на массивы и переменные.

Все проблема, в том, почему зависание происходит, только один раз при первом включении компьютера, а затем все хорошо. Что такого делает HyperTerminal, после чего моя прогрмма отлично работает.

Добавлено через 1 минуту и 23 секунды
Версия не последняя, собирал ещё в ноябре, попробую обновиться!

Это сообщение отредактировал(а) alexeev - 5.3.2013, 09:32
PM MAIL   Вверх
math64
Дата 5.3.2013, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Настройку скорости, паритета, и т.д. делаешь?
Вот как делаю я:
Код

    QAction* portAction = portGroup->checkedAction();
    QAction* rateAction = portRateGroup->checkedAction();
    QString port = portAction->text();
    serialPort->setPort(port);
    if (serialPort->open(QIODevice::ReadWrite)) {
        serialPort->setBaudRate(rateAction->text().toInt());
        serialPort->setDataTerminalReady(true);
        serialPort->setRequestToSend(true);
        serialPort->setParity(QSerialPort::NoParity);
        serialPort->setStopBits(QSerialPort::OneStop);
        serialPort->setDataBits(QSerialPort::Data8);
        serialPort->setFlowControl(QSerialPort::NoFlowControl);
        ui->statusbar->showMessage(trUtf8("Порт %1 открыт").arg(port));
        ui->actionPortClose->setChecked(false);
        ui->actionPortOpen->setChecked(true);
    } else {
        serialPort->close();
        ui->statusbar->showMessage(trUtf8("Ошибка открытия %1").arg(port));
        ui->actionPortOpen->setChecked(false);
        ui->actionPortClose->setChecked(true);
    }

PM   Вверх
kuzulis
Дата 5.3.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



2 alexeev,

это все бла-бла. 

Лучше приведи компилябельный пример чтобы я мог его собрать и воспроизвести баг.
PM MAIL   Вверх
math64
Дата 6.3.2013, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



При попытке скачать библиотеку, теперь получаю
Код

The page you were looking for does not exist. You may have mistyped, or the page could be moved.

PM   Вверх
kuzulis
Дата 6.3.2013, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



2 math64,

ага, спс, исправил.
PM MAIL   Вверх
alexeev
Дата 1.4.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Я обновился до последней версии, теперь программа не зависает. Но и данные сразу тоже не идут. Сначало все равно приходится открывать hyperterminal.


Класс отвечающей за соединение и первоначальный прием.

Код



CSerialPort::CSerialPort(QWidget *parent)
{
    serial = new QSerialPort();    
}


QList<QString> CSerialPort::GiveAvaliableCom()
{
    QList<QString> List_Settings;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        List_Settings.append(info.portName());
    }
    return List_Settings;
}

void CSerialPort::Slot_CSerialProt_OpenComPort(QString name)
{
    //устанавливаем настройки Com
    serial->setPortName(name);
    serial->setBaudRate(QSerialPort::Baud115200);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    
if (serial->open(QIODevice::ReadWrite))
    {
        qDebug() << "Open is normal" ;
        emit Signal_CSerialPort_OpenIsNormal();
    }
    else
    {
        QMessageBox::critical(this, tr("Невозможно открыть порт"),
                              tr("Возможно порт занят"),
                              QMessageBox::Ok);
    }
}
void CSerialPort::Slot_CSerialProt_CloseComPOrt()
{
    serial->close();
    qDebug()<< "Close is normal" ;
}

void CSerialPort::Slot_ReadData_From_Com()
{

    QByteArray data;
    QApplication::processEvents();
    if (serial->error())  qDebug()<<"Eror"<<serial->errorString()<<"   "<<serial->error();
    data = serial->readAll();


    if (statusPRIorSON==0)
    {

        if (status==0)
        {
            emit Signal_CSerialPort_SendDataToIFRNS(data);
        }
        if (status==1)
        {
            ;
        }
        if (status==2)
        {
            emit Signal_CSerialPort_SendDataToXModem(data);
        }

    }
    else if(statusPRIorSON==1)
    {

        if (status==0)
        {
            emit Signal_CSerialPort_SendDataToPRI(data);
        }
        if (status==1)
        {
            ;
        }

    }
    else if(statusPRIorSON==2)
    {
        if (status==0)
        {
            emit Signal_CSerialPort_SendDataToIFRNS_struct1(data);
        }
        if (status==1)
        {
            ;
        }
    }

}

void CSerialPort::Slot_Write_to_Com(QByteArray data1)
{
    serial->write(data1);
}



в главном классе виджета коннект

Код

 connect(ComPort->serial,SIGNAL(readyRead()),ComPort,SLOT(Slot_ReadData_From_Com()));



Код

  if (serial->error())  qDebug()<<"Eror"<<serial->errorString()<<"   "<<serial->error();


Здесь выводится 

Eror "Unknown error"     5 
Eror "Unknown error"     5 
Eror "Unknown error"     6 
Eror "Unknown error"     6 
Eror "Unknown error"     5 
Eror "Unknown error"     5 

PM MAIL   Вверх
math64
Дата 1.4.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Делай как в моих настройках - сначала открывай порт, потом настраивай. При открытии настройки сбрасываются.
PM   Вверх
alexeev
Дата 1.4.2013, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



math64,  Огромнейшие спасибо!!!!!! 
Новая версия библиотеки и ваша подсказка, решили све проблемы!=)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1172 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.