2013-09-27 16 views

Antwort

6

Sie könnten das error-Signal der QSerialPort-Klasse im QtSerialPort-Add-On verwenden. Details dazu finden Sie in unserer Dokumentation.

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

Sie müssen dies im Grunde schreiben:

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 leicht mit Qt installiert werden kann 5.1 < als die Pakete verteilt sind. Wir haben jedoch sichergestellt, dass QtSerialPort mit früheren Versionen funktioniert, einschließlich Qt 4.8.X. Hier können Sie die Anweisungen für Qt 4 finden, um diese für Sie installiert zu bekommen:

  • git clone [email protected]: qt/qtserialport.git

  • cd qtserialport

  • Qmake

  • machen

  • sudo make install.

Dann werden Sie die folgenden Zeilen in Ihrer qmake-Projektdatei benötigen, wenn Sie verwenden Qmake passieren:

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

Endlich eine Lösung zusammen. Am Ende habe ich 'QSerialPortInfo' verwendet, um einen Port zu validieren, bevor ich ihn benutze. –

+1

Sie haben mich in die richtige Richtung gezeigt. Ich brauchte nur etwas, um zu bestätigen, dass der serielle Port tatsächlich eingesteckt war, bevor er versuchte, irgendetwas mit einem offenen Port zu tun. Ich habe etwas anderes gemacht, was für das, was ich mache, funktioniert hat. –

+0

Was genau ist * ein 'ResourceError'? Ich sehe es gelegentlich in der Mitte einer seriellen Port-Kommunikation, aber ich kann immer noch Daten über den Port senden und empfangen. (Meine Kommunikationsschicht beginnt sich schlecht zu verhalten, aber es scheint nicht vollständig kaputt zu sein - einige gültige Pakete kommen immer noch durch.) –

2

QSerialPortInfo Verwendung wird das Ergebnis erzielen:

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() ist jetzt veraltet. isBusy() kann stattdessen verwendet werden, da es true zurückgibt, wenn Sie den Port und false geöffnet haben, wenn der Port nicht mehr da ist (und Sie haben es immer noch geöffnet). Dies ist auch der Fall, wenn availablePorts() den nicht vorhandenen, aber geöffneten Port zurückgibt, weil Sie den Port in der Liste behalten, indem Sie ihn öffnen.

Verwandte Themen