Pregunta

Estoy intentando hacer uso del QtSerialPort recién incluido en Qt v5.1.1, pero tengo algunos problemas al intentar compilar con los que tengo poca experiencia.Según mi búsqueda, parece que el QtSerialPort de qt 5.1 no viene integrado y listo para usar, ¿estoy en lo cierto?¿Cómo lo prepararía usando Qt Creator o Visual Studio 2010?Recientemente actualicé desde 4.8.4 y heredé el proyecto, así que no estoy seguro de qué se hizo anteriormente.Encontré instrucciones para compilar con varias versiones de Linux, pero nada para Windows parecía consistente o sencillo, así que esperaba que alguien aquí tuviera instrucciones más concretas.

¡Gracias!

EDITAR:Agregaré uno o dos errores específicos que recibo, tal vez eso ayude a identificar qué estoy haciendo 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)

Estos son sólo dos de los 21 errores que aparecen en el momento de la compilación.Como mencioné en los comentarios, ni Visual Studio 2010 ni Qt Creator parecen reconocer las bibliotecas QtSerialPort.

¿Fue útil?

Solución

Muy bien, después de probar un montón de cosas diferentes y combinar información de diferentes lugares, logré que todo resuelva y funcionara.

La razón por la que no funcionó, por supuesto, era simple, el módulo no se había incluido a través del complemento QT5 a Visual Studio, y esto fue por la simple razón de que no se mostró como un módulo disponible. Un problema adicional era que no había instalado QT 5.1.1 con las dependencias de origen instaladas, simplemente había optado por la instalación predeterminada que no incluye lo que QtSerialport necesite. Después de una reinstalación, modificé mi configuración de proyecto VS en los siguientes lugares:

  1. Propiedades del proyecto -> Propiedades de configuración -> C/C ++ -> General -> Directorios de incluido adicional, línea agregada: $ (Qtdir) incluir QtSerialport
  2. Propiedades del proyecto -> Propiedades de configuración -> C/C ++ -> Preprocesador -> Definiciones del preprocesador, línea agregada: QT_Serialport_Lib
  3. Propiedades del proyecto -> Propiedades de configuración -> Linker -> Entrada-> Dependencias adicionales, línea agregada: QT5SerialPort.lib

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

Luego agregué QT5SerialPort.dll y Qt5SerialPortd.dll a mi carpeta de lanzamiento y depuración dentro de mi proyecto, respectivamente.

Estoy bastante seguro de que estos son los únicos cambios que he hecho. ¡Espero que esto sea de utilidad para otra persona!

Otros consejos

Hice un pequeño proyecto con Qt5.0.2 con QSerialPort, que funciona bien en Linux y Windows XP/7.Compilarlo en Linux fue bastante sencillo, ya que todas las bibliotecas ya estaban implementadas.Para compilarlo en Windows utilicé QtCreator (no Visual Studio) instalado en Windows (sin compilación cruzada).

Primero debe verificar, si QtCreator puede encontrar QSerialPort, entonces ya debería funcionar para compilarlo en QtCreator en Windows.Para implementar el programa, debe asegurarse de que todas las QtLibraries utilizadas estén en su lugar.La forma más sencilla es simplemente colocarlo en el mismo directorio que su programa.Para mi programa esto se parece a esto:

  • +plataformas (directorio con los siguientes dos dlls)

    • -qminimal.dll
    • -qwindows.dll

    • icudt51.dll

    • icuin51.dll
    • icuuc51.dll
    • libEGL.dll
    • libGLESv2.dll
    • Qt5Core.dll
    • Qt5Gui.dll
    • Qt5SerialPort.dll
    • Qt5Widgets.dll

Se debe tener cuidado, que el los dlls usados ​​coinciden con su compilador! 32 bits frente a 64 bits además de hacer coincidir el compilador utilizado (Compilador MinGW o Visual Studio).

fragmento de código para abrir mi puerto serie:

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"));
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top