C'è un modo per inviare un segnale, o un altro modo per dire se un cavo seriale USB è scollegato, usando Qt?Invia un segnale quando un cavo seriale USB è scollegato
risposta
È 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
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;
}
}
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.
Finalmente abbiamo trovato una soluzione. In realtà ho finito con l'uso di 'QSerialPortInfo' per convalidare una porta prima di usarla. –
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. –
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.) –