我正在尝试在QT v5.1.1中使用新纳入的QTSerialport,但是当试图编译我几乎没有经验时,我遇到了一些问题。从我的搜索中看来,QT 5.1的QTSerialport并未构建并准备好使用,我对此是否正确?如何使用QT Creator或Visual Studio 2010准备它?我最近刚刚从4.8.4升级并继承了该项目,因此我不确定以前做了什么。我找到了使用各种Linux版本编译的说明,但是Windows的任何内容似乎都一致或直截了当,因此我希望这里有人有一些具体的说明。

谢谢你!

编辑:我会添加我遇到的一个或两个特定错误,也许这将有助于确定我做错了什么。

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)

这些只是在编译时出现的21个错误中的两个。正如我在评论中提到的那样,Visual Studio 2010或QT创建者似乎都识别QTSerialport库。

有帮助吗?

解决方案

好吧,在尝试了一堆不同的东西并结合了来自不同地方的信息之后,我设法将所有内容都弄清楚和工作。

它当然没有工作的原因很简单,该模块尚未通过QT5插件包含在Visual Studio中,这是出于简单的原因,因此没有显示为可用的模块。另一个问题是,我没有安装QT 5.1.1,其中安装了源依赖项,我只是选择了默认安装,该安装不包括任何QTSerialPort所需的任何内容。重新安装后,我在以下位置修改了VS项目设置:

  1. 项目属性 - >配置属性 - > c/c ++->常规 - >附加目录,添加行:$(qtdir) include qtserialport
  2. 项目属性 - >配置属性 - > c/c ++ - >预处理程序 - >预处理程序定义,添加行:qt_serialport_lib
  3. 项目属性 - >配置属性 - > linker-> input->其他依赖项,添加行:qt5serialport.lib

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

之后,我分别在项目中的发布和调试文件夹中添加了qt5serialport.dll和qt5serialportd.dll。

我可以肯定的是,这些是我所做的唯一更改。我希望这对别人有用!

其他提示

我使用QT5.0.2与QSerialport进行了一个小项目,该项目在Linux和Windows XP/7上运行良好。在Linux上编译它是很无麻烦的,因为所有库都已经到位。要在Windows上编译它,我使用了安装在Windows上的QTCreator(不是Visual Studio)(无交叉编译)。

首先,您必须检查QTCreator是否可以找到QSerialport,然后实际上应该已经在Windows下的QtCreator下进行编译。要部署程序,您必须确保所有使用过的Qtlibraries都已到位。最简单的方法是将其与程序放置在相同的目录中。对于我的程序,这看起来像这样:

  • +平台(以下两个DLL的目录)

    • -qminimal.dll
    • -qwindows.dll

    • icudt51.dll

    • icuin51.dll
    • icuuc51.dll
    • libegl.dll
    • libglesv2.dll
    • qt5core.dll
    • qt5gui.dll
    • qt5serialport.dll
    • qt5widgets.dll

应该注意 使用的DLL匹配您的编译器! 32位与64位 以及匹配二手编译器(Mingw或Visual Studio编译器).

代码段以打开我的串行端口:

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"));
}
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top