Question

J'essaie d'utiliser le QTerialport nouvellement inclus dans QT V5.1.1, mais je rencontre certains problèmes lorsque je tente de compiler avec lequel j'ai peu d'expérience. De ma recherche, il semble que le QTerialport de QT 5.1 ne soit pas construit et prêt à l'emploi, ai-je raison dans ce domaine? Comment pourrais-je le préparer en utilisant QT Creator ou Visual Studio 2010? J'ai récemment mis à niveau de 4,8.4 et j'ai hérité du projet, donc je ne sais pas ce que tout a été fait auparavant. J'ai trouvé des instructions pour compiler avec diverses versions Linux, mais rien pour les fenêtres ne semblait cohérente ou simple, donc j'espérais que quelqu'un ici avait des instructions plus concrètes.

Merci!

EDIT: J'ajouterai une ou deux erreurs spécifiques que j'obtiens, peut-être que cela aidera à identifier ce que je fais de mal.

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)

Ce ne sont que deux des 21 erreurs qui apparaissent au moment de la compilation. Comme je l'ai mentionné dans les commentaires, ni Visual Studio 2010 ou Qt Creator ne semblent reconnaître les bibliothèques QTerialport.

Était-ce utile?

La solution

D'accord, après avoir essayé un tas de choses différentes et combiner des informations à partir de différents endroits, j'ai réussi à tout comprendre et fonctionner.

La raison pour laquelle cela n'a pas fonctionné bien sûr était simple, le module n'avait pas été inclus via le plug-in QT5 à Visual Studio, et c'était pour la simple raison qu'il n'était pas montré comme un module disponible. Un problème supplémentaire était que je n'avais pas installé QT 5.1.1 avec les dépendances source installées, j'avais simplement opté pour l'installation par défaut qui n'inclut pas le QTerialport nécessaire. Après une réinstallation, j'ai modifié mes paramètres de projet VS aux endroits suivants:

  1. Propriétés du projet -> Propriétés de configuration -> C / C ++ -> Général -> Répertoires supplémentaires, ligne ajoutée: $ (qtdir) include qTerialport
  2. Propriétés du projet -> Propriétés de configuration -> C / C ++ -> Prérocesseur -> Définitions du préprocesseur, Ligne ajoutée: QT_SERIALPORT_LIB
  3. Propriétés du projet -> Propriétés de configuration -> linker -> entrée-> dépendances supplémentaires, ligne ajoutée: qt5Serialport.lib

Remarque: $ (qtdir) = c: qt qt5.1.1 5.1.1 msvc2010_opengl

Ensuite, j'ai ajouté QT5SERIALPORT.DLL et QT5SERIALPORTD.DLL à mon dossier Release and Debug dans mon projet respectivement.

Je suis assez certain que ce sont les seuls changements que j'ai apportés. J'espère que cela est utile à quelqu'un d'autre!

Autres conseils

J'ai réalisé un petit projet avec QT5.0.2 avec QSerialport, qui fonctionne bien sur Linux et Windows XP / 7. Le compiler sur Linux était assez sans tracas, car toutes les bibliothèques ont déjà été en place. Pour le compiler sous Windows, j'ai utilisé QTCreator (pas Visual Studio) installé sur Windows (pas de compilation croisée).

Vous devez d'abord vérifier, si QTCreator peut trouver QSerialport, alors il devrait déjà fonctionner pour le compiler sous QTCreator sous Windows. Pour déployer le programme, vous devez vous assurer que tous les QTBibraires utilisés sont en place. Le moyen le plus simple est de simplement mettre le même répertoire que votre programme. Pour mon programme, cela ressemble à ceci:

  • + plates-formes (répertoire avec deux DLL suivantes)

    • -qminimal.dll
    • -Qwindows.dll

    • icudt51.dll

    • icuin51.dll
    • icuuc51.dll
    • libegl.dll
    • libglesv2.dll
    • Qt5core.dll
    • Qt5gui.dll
    • Qt5Serialport.dll
    • Qt5widgets.dll

Il faut veiller à ce que Les DLL utilisées correspondent à votre compilateur! 32 bits vs 64 bits ainsi que la correspondance du compilateur utilisé (Compilateur Mingw ou Visual Studio).

Extrait de code pour ouvrir mon port série:

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"));
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top