2

Qt v5.1.1 に新たに含まれた QtSerialPort を利用しようとしていますが、コンパイルしようとすると経験の少ない問題が発生します。私の検索では、qt 5.1 の QtSerialPort はビルドされておらず、すぐに使用できないようですが、これで正しいでしょうか? Qt Creator または Visual Studio 2010 を使用してどのように準備すればよいですか? 最近 4.8.4 からアップグレードしてプロジェクトを継承したばかりなので、以前に何が行われたかはわかりません。さまざまな Linux バージョンでコンパイルするための手順を見つけましたが、Windows では一貫した、または簡単なものはないように見えたので、誰かがより具体的な手順を持っていることを望んでいました.

ありがとう!

編集:私が得ている特定のエラーを1つか2つ追加します。おそらく、それは私が間違っていることを特定するのに役立つでしょう。

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 のエラーのうちの 2 つにすぎません。コメントで述べたように、Visual Studio 2010 も Qt Creator も QtSerialPort ライブラリを認識していないようです。

4

2 に答える 2

1

QSerialPort を備えた Qt5.0.2 で小さなプロジェクトを作成しました。これは、Linux および Windows XP/7 で正常に動作します。すべてのライブラリが既に配置されているため、Linux でのコンパイルは非常に手間がかかりませんでした。Windowsでコンパイルするには、WindowsにインストールされたQtCreator(Visual Studioではない)を使用しました(クロスコンパイルなし)。

まず、QtCreator が QSerialPort を見つけられるかどうかを確認する必要があります。実際には、Windows の QtCreator でコンパイルするために既に動作しているはずです。プログラムを展開するには、使用されているすべての QtLibraries が配置されていることを確認する必要があります。最も簡単な方法は、プログラムと同じディレクトリに配置することです。私のプログラムでは、これは次のようになります。

  • +platforms (次の 2 つの 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 Compiler )の一致。

私のシリアルポートを開くためのコードスニペット:

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"));
}
}
于 2013-11-08T06:25:37.713 に答える