Domanda

Sto tentando di utilizzare QTSerialport di recente incluso in QT V5.1.1 ma sto riscontrando alcuni problemi quando provo a compilare con cui ho poca esperienza. Dalla mia ricerca sembra che il qtserialport di Qt 5.1 non sia costruito e pronto per l'uso, ho ragione in questo? Come lo preparerei usando QT Creator o Visual Studio 2010? Di recente ho aggiornato da 4.8.4 e ho ereditato il progetto, quindi non sono sicuro di cosa fosse stato fatto in precedenza. Ho trovato istruzioni per la compilazione con varie versioni Linux, ma nulla per Windows sembrava coerente o semplice, quindi speravo che qualcuno qui avesse alcune istruzioni più concrete.

Grazie!

EDIT: aggiungerò un errore o due specifici che sto ricevendo, forse che aiuterà a identificare ciò che sto facendo di sbagliato.

error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall QSerialPort::metaObject(void)const " (?metaObject@QSerialPort@@UBEPBUQMetaObject@@XZ)
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QSerialPort::QSerialPort(class QObject *)" (__imp_??0QSerialPort@@QAE@PAVQObject@@@Z) referenced in function "public: __thiscall serial_client::serial_client(class QObject *)" (??0serial_client@@QAE@PAVQObject@@@Z)

Questi sono solo due dei 21 errori che si presentano al momento della compilazione. Come ho già detto nei commenti, né Visual Studio 2010 né il creatore QT sembrano riconoscere le biblioteche di Qtserialport.

È stato utile?

Soluzione

Va bene, dopo aver provato un sacco di cose diverse e combinato informazioni da luoghi diversi che sono riuscito a capire tutto e funzionare.

Il motivo per cui non funzionava ovviamente era semplice, il modulo non era stato incluso tramite il plug-in QT5 a Visual Studio, e questo era per il semplice motivo che non era stato mostrato come un modulo disponibile. Un ulteriore problema era che non avevo installato Qt 5.1.1 con le dipendenze di origine installata, avevo semplicemente optato per l'installazione predefinita che non includeva ciò che Qtserialport fosse necessario. Dopo una reinstallazione ho modificato le mie impostazioni del progetto VS nei seguenti luoghi:

  1. Proprietà del progetto -> Proprietà di configurazione -> C/C ++ -> Generale -> Ulteriori directory includono, Linea aggiunta: $ (QTDIR) include Qtserialport
  2. Proprietà del progetto -> Proprietà di configurazione -> C/C ++ -> Preprocessor -> Definizioni preprocessore, riga aggiunta: QT_SERIALPORT_LIB
  3. Proprietà del progetto -> Proprietà di configurazione -> linker -> input-> dipendenze aggiuntive, riga aggiunta: qt5serialport.lib

Nota: $ (Qtdir) = C: Qt Qt5.1.1 5.1.1 MSVC2010_OPENGL

Successivamente ho aggiunto qt5serialport.dll e qt5serialportd.dll alla mia cartella di rilascio e debug nel mio progetto rispettivamente.

Sono abbastanza sicuro che queste siano le uniche modifiche che ho apportato. Spero che questo sia utile a qualcun altro!

Altri suggerimenti

Ho realizzato un piccolo progetto con QT5.0.2 con Qserialport, che funziona bene su Linux e Windows XP/7. La compilazione su Linux era piuttosto senza problemi, poiché tutte le librerie sono già state in atto. Per compilarlo su Windows ho usato QtCreator (non Visual Studio) installato su Windows (nessuna compilazione incrociata).

Innanzitutto devi controllare, se QtCreator è in grado di trovare Qserialport, in realtà dovrebbe già funzionare per compilarlo sotto QtCreator sotto Windows. Per distribuire il programma è necessario assicurarsi che siano in atto tutti i QTlibrarie usati. Il modo più semplice è semplicemente inserire la stessa directory del tuo programma. Per il mio programma questo assomiglia a questo:

  • +piattaforme (directory con seguenti due DLL)

    • -qminimal.dll
    • -qwindows.dll

    • icudt51.dll

    • ICUIN51.DLL
    • icuuc51.dll
    • libegl.dll
    • libglesv2.dll
    • Qt5core.dll
    • Qt5gui.dll
    • Qt5serialport.dll
    • Qt5widgets.dll

Si dovrebbe fare attenzione, che il Le DLL usate corrispondono al compilatore! 32 bit vs 64 bit Oltre a abbinare il compilatore usato (Compilatore Mingw o Visual Studio).

Snippet di codice per aprire la mia porta seriale:

void MainWindow::openSerialPort() 
{
struct Settings p;

/* Use name of ComPort from Combobox */
p.name = ui->cboComPort->currentText();
p.baudRate = 38400;
p.dataBits = QSerialPort::Data8;
p.parity = QSerialPort::NoParity;
p.stopBits = QSerialPort::OneStop;
p.flowControl = QSerialPort::NoFlowControl;
p.stringBaudRate = "38400";
p.stringDataBits = "8";
p.stringParity = tr("no parity");
p.stringFlowControl = tr("no flow control");
p.stringStopBits = tr("1 stopbit");

serial->setPortName(p.name);
if (serial->open(QIODevice::ReadWrite)) {
    if (serial->setBaudRate(p.baudRate)
            && serial->setDataBits(p.dataBits)
            && serial->setParity(p.parity)
            && serial->setStopBits(p.stopBits)
            && serial->setFlowControl(p.flowControl)) {

        //console->setEnabled(true);
        //console->setLocalEchoEnabled(p.localEchoEnabled);
        ui->actionConnect->setEnabled(false);
        ui->actionDisconnect->setEnabled(true);
        ui->actionConfigure->setEnabled(false);
        ui->statusBar->showMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
                                   .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
                                   .arg(p.stringStopBits).arg(p.stringParity).arg(p.stringFlowControl));

    } else {
        serial->close();
        QMessageBox::critical(this, tr("Error"), serial->errorString());

        ui->statusBar->showMessage(tr("Configure error"));
    }
} else {
    QMessageBox::critical(this, tr("Error"), serial->errorString());

    ui->statusBar->showMessage(tr("Open error"));
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top