2013-09-27 2 views

ответ

6

Вы можете использовать сигнал error класса QSerialPort в надстройке QtSerialPort. Подробности см. В нашей документации.

http://qt-project.org/doc/qt-5.1/qtserialport/qserialport.html#error-prop

Вам нужно будет написать это в основном:

connect(mySerialPort, SIGNAL(error(QSerialPort::SerialPortError)), this, 
     SLOT(handleError(QSerialPort::SerialPortError))); 

... 

void MyClass::handleError(QSerialPort::SerialPortError error) 
{ 
    if (error == QSerialPort::ResourceError) { 
     QMessageBox::critical(this, tr("Critical Error"), serial->errorString()); 
     closeSerialPort(); 
    } 
} 

QtSerialPort можно легко установить с помощью Qt 5.1 < как пакеты распространяются. Однако мы убедились, что QtSerialPort работает с предыдущими версиями, включая Qt 4.8.X. Здесь вы можете найти инструкции для Qt 4, чтобы получить это установлено для вас:

  • мерзавец клон [email protected]: кварты/qtserialport.git

  • кд qtserialport

  • QMAKE

  • sudo make install.

Затем вам необходимо добавить следующие строки в файле проекта QMAKE, если вы решили использовать QMAKE:

Qt 5: QT += serialport 
Qt 4: COMFIG += serialport 
+1

Наконец-то собралось решение. Я фактически закончил использование 'QSerialPortInfo' для проверки порта перед его использованием. –

+1

Вы указали мне в правильном направлении. Мне просто нужно было что-то подтвердить, что последовательный порт был фактически подключен, прежде чем он попытался сделать что-либо с открытым портом. Я сделал что-то немного другое, что сработало для того, что я делаю. –

+0

Что именно * * * 'ResourceError'? Я иногда вижу это в середине некоторой последовательной связи, но я все еще могу отправлять и получать некоторые данные о порте. (Мой уровень связи начинает плохо себя вести, но он не выглядит полностью сломанным - некоторые действительные пакеты все еще проходят.) –

2

Использование QSerialPortInfo добьетесь результата:

bool MyClass::checkPort() 
{ 
    QSerialPortInfo *portInfo = new QSerialPortInfo(ui->serialDevice->currentText()); 
    // ui->serialDevice being a combobox of available serial ports 

    if (portInfo->isValid()) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
1

isValid() является теперь устаревший. isBusy() может использоваться вместо этого, поскольку он вернет true, когда вы открыли порт и false, когда порт больше не существует (и у вас все еще есть его). Это также имеет место, когда availablePorts() продолжает возвращать несуществующий, но открытый порт, потому что вы сохраняете порт в списке, открыв его.

Смежные вопросы