Czy istnieje sposób na wysłanie sygnału lub w inny sposób stwierdzenia, czy kabel szeregowy USB jest odłączony, używając Qt?Wysyła sygnał, gdy odłączony jest kabel szeregowy USB
Odpowiedz
Można użyć sygnału error
klasy QSerialPort w dodatku QtSerialPort. Zobacz szczegóły tego w naszej dokumentacji.
http://qt-project.org/doc/qt-5.1/qtserialport/qserialport.html#error-prop
Trzeba napisać to zasadniczo:
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 mogą być łatwo instalowane z Qt 5.1 < jak pakiety są dystrybuowane. Upewniliśmy się jednak, że QtSerialPort działa z wcześniejszymi wersjami, w tym Qt 4.8.X. Tutaj można znaleźć instrukcje do Qt 4, aby uzyskać ten zainstalowany dla Ciebie:
git clone [email protected]: qt/qtserialport.git
cd qtserialport
QMake
zrób
sudo zainstaluj.
Następnie trzeba będzie następujące linie w pliku projektu QMake jeśli zdarzy ci się użyć qmake:
Qt 5: QT += serialport
Qt 4: COMFIG += serialport
Korzystanie QSerialPortInfo
osiągnie wynik:
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()
jest teraz przestarzałe. isBusy()
może być użyty zamiast tego, ponieważ zwróci true
po otwarciu portu i false
, gdy port już nie istnieje (i nadal jest otwarty). Dzieje się tak również wtedy, gdy availablePorts()
powraca nieistniejący, ale otwarty port, ponieważ zachowujesz port na liście, otwierając go.
Wreszcie udało się znaleźć rozwiązanie. Skończyło się na używaniu 'QSerialPortInfo' do sprawdzenia poprawności portu przed jego użyciem. –
Wskazałeś mi właściwy kierunek. Potrzebowałem tylko czegoś, aby sprawdzić, czy port szeregowy został rzeczywiście podłączony, zanim spróbował zrobić coś z otwartym portem. Zrobiłem coś, co różniło się od tego co robię. –
Czym dokładnie * jest * "ResourceError"? Czasami widzę to w połowie komunikacji szeregowej, ale wciąż mogę wysyłać i odbierać dane na porcie. (Moja warstwa komunikacyjna zaczyna się źle zachowywać, ale nie wydaje się być całkowicie zepsuta - niektóre prawidłowe pakiety nadal są przesyłane.) –