Я пытаюсь использовать недавно включенный QtSerialPort в Qt v5.1.1, но сталкиваюсь с некоторыми проблемами при попытке компилировать, что у меня мало опыта. Из моих поисков кажется, что QtSerialPort из qt 5.1 не собран и готов к использованию, я прав в этом? Как мне подготовить его с помощью 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 Creator, похоже, не распознают библиотеки QtSerialPort.
Хорошо, попробовав кучу разных вещей и объединив информацию из разных мест, мне удалось все выяснить и работать.
Конечно, причина, по которой он не работал, была проста: модуль не был включен через подключаемый модуль Qt5 для Visual Studio, и это было по той простой причине, что он не был показан как доступный модуль. Дополнительная проблема заключалась в том, что я не установил Qt 5.1.1 с установленными зависимостями исходного кода, я просто выбрал установку по умолчанию, которая не включает в себя все, что нужно для QtSerialPort. После переустановки я изменил настройки VS Project в следующих местах:
Примечание: $ (QTDIR) = C: \ Qt \ Qt5.1.1 \ 5.1.1 \ msvc2010_opengl \
После этого я добавил Qt5SerialPort.dll и Qt5SerialPortd.dll в папку Release и Debug в моем проекте соответственно.
Я уверен, что это единственные изменения, которые я сделал. Я надеюсь, что это пригодится кому-то еще!
Я сделал небольшой проект с Qt5.0.2 с QSerialPort, который отлично работает на Linux и Windows XP / 7.
Компилировать его в Linux было довольно легко, поскольку все библиотеки уже созданы.
Для компиляции в Windows я использовал QtCreator (не Visual Studio), установленный в Windows (без кросс-компиляции).
Сначала вы должны проверить, может ли QtCreator найти QSerialPort, тогда он на самом деле должен уже работать, чтобы скомпилировать его под QtCreator под Windows. Для развертывания программы вы должны убедиться, что все используемые библиотеки QtLibraries находятся на месте. Самый простой способ — просто поместить его в тот же каталог, что и ваша программа.
Для моей программы это выглядит примерно так:
+платформы (каталог со следующими двумя dll)
-qwindows.dll
icudt51.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")); } }