Работа с QSerialPort

 
0
 
C++
ava
alexeev | 04.03.2013, 15:22
Здравствуте, заметил странное поведение в работе класса QseriaPort
Конечно, скорее всего я делаю, что-то не верно...
Имеется следующая проблема, при первом включении программы, после включения компьютера, программа сразу же зависает, при открывании ком порта. Если запустить HyperTerminal и считать данные с ком, и снова запустить программу, все прекрасно работает. В режиме дебага, данные корректо идут и считываются, даже первый раз.
Скорее всего зависание происходит на строчке где вызывается метод readall, он вызывается соответсвенно по сигналу readyread().
Уже месяц не могу понять в чем проблема? Может кто-то сталкивался с чем-то похожим?
Ответы (10)
ava
kuzulis | 04.03.2013, 17:57 #
Цитата


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


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

Цитата


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


Код в студию.
ava
math64 | 04.03.2013, 21:35 #
Пользуетесь последней версией? Если нет, рекмендую обновиться.
ava
alexeev | 05.03.2013, 09:31 #
Цитата


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


Да

Цитата


Код в студию.



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

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

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

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

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

Добавлено позднее:
Версия не последняя, собирал ещё в ноябре, попробую обновиться!
ava
math64 | 05.03.2013, 09:56 #
Настройку скорости, паритета, и т.д. делаешь?
Вот как делаю я:

    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);
    }
ava
kuzulis | 05.03.2013, 09:59 #
2 alexeev,

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

Лучше приведи компилябельный пример чтобы я мог его собрать и воспроизвести баг.
ava
math64 | 06.03.2013, 08:21 #
При попытке скачать библиотеку, теперь получаю

The page you were looking for does not exist. You may have mistyped, or the page could be moved.
ava
kuzulis | 06.03.2013, 10:19 #
2 math64,

ага, спс, исправил.
ava
alexeev | 01.04.2013, 10:56 #
Я обновился до последней версии, теперь программа не зависает. Но и данные сразу тоже не идут. Сначало все равно приходится открывать 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
ava
math64 | 01.04.2013, 12:59 #
Делай как в моих настройках - сначала открывай порт, потом настраивай. При открытии настройки сбрасываются.
ava
alexeev | 01.04.2013, 13:30 #
math64,  Огромнейшие спасибо!!!!!!
Новая версия библиотеки и ваша подсказка, решили све проблемы!=)
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить