2013-09-27 14 views

risposta

6

È possibile utilizzare il segnale error della classe QSerialPort nel componente aggiuntivo QtSerialPort. Vedi i dettagli per questo nella nostra documentazione.

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

Avrete bisogno di scrivere questo in fondo:

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 può essere installato facilmente con Qt 5.1 < come i pacchetti vengono distribuiti. Tuttavia, ci siamo assicurati che QtSerialPort funzioni con versioni precedenti, incluso Qt 4.8.X. Qui potete trovare le istruzioni per Qt 4 per ottenere questo installato per voi:

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

  • cd qtserialport

  • qmake

  • marca

  • sudo make install.

Poi, si ha bisogno delle seguenti righe nel file di progetto qmake se vi capita di usare qmake:

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

Finalmente abbiamo trovato una soluzione. In realtà ho finito con l'uso di 'QSerialPortInfo' per convalidare una porta prima di usarla. –

+1

Mi hai indicato nella giusta direzione. Avevo solo bisogno di qualcosa per verificare che la porta seriale fosse effettivamente collegata prima di provare a fare qualcosa con una porta aperta. Ho fatto qualcosa di leggermente diverso che ha funzionato per quello che sto facendo. –

+0

Che cosa esattamente * è * a 'ResourceError'? Di tanto in tanto lo vedo nel bel mezzo di alcune comunicazioni sulla porta seriale, ma sono ancora in grado di inviare e ricevere alcuni dati sulla porta. (Il mio livello di comunicazioni inizia a comportarsi male, ma non sembra completamente rotto - alcuni pacchetti validi continuano a passare.) –

2

Utilizzando QSerialPortInfo raggiungerà il risultato:

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() è ora obsoleto. È possibile utilizzare isBusy() invece che restituirà true quando si è aperta la porta e false quando la porta non è più lì (e se è ancora aperta). Questo è anche il caso in cui availablePorts() continua a restituire la porta inesistente, ma aperta, perché si mantiene la porta nell'elenco aprendola.