2013-09-27 28 views

Odpowiedz

6

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 
+1

Wreszcie udało się znaleźć rozwiązanie. Skończyło się na używaniu 'QSerialPortInfo' do sprawdzenia poprawności portu przed jego użyciem. –

+1

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ę. –

+0

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.) –

2

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; 
    } 
} 
1

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.