serial port in dll
-
Hi at all,
I want to write a dll file , using a serial port.
I will describe what the dll should do:
I call the function of the dll in a measurement programm. The function should accept 6 initial values, which should be send to a microcontroller. So in the dll I want to use the QtSerialPort and send the values to my microcontroller.I wrote a dll but when I try to run it in a test programm I get a lot of errors:
" LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: bool __cdecl QSerialPort::setDataBits(enum QSerialPort::DataBits)" (_imp?setDataBits@QSerialPort@@QEAA_NW4DataBits@1@@Z)" in Funktion ""public: void __cdecl Messwert_Zuordnung_DLL::Messwert_zuordnung(double,double,double,double,double,double)" (?Messwert_zuordnung@Messwert_Zuordnung_DLL@@QEAAXNNNNNN@Z)"."Here is my dll code:
<
#include "messwert_zuordnung_dll.h"
#include <iostream>
#include <string>
#include <math.h>
#include <QDebug>
#include <QtCore/QCoreApplication>
#include <Windows.h>
#include <QtSerialPort/QSerialPort>
#include <QtCore/QDebug>QSerialPort *serial;
void Messwert_Zuordnung_DLL::Messwert_zuordnung(double messmeth, double messint, double bauteillaenge, double interpol, double anz_messungen, double abs_messungen)
{
//Configuration of the serial port
serial = new QSerialPort;//+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ //Adapt the COM-Port ! serial->setPortName("COM12"); //+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::SoftwareControl); serial->open(QIODevice::ReadWrite); if (messmeth == 1){ //Conversion to send (requiered by the send-> function) QByteArray messint_s = QByteArray::number(messint); QByteArray bauteillaenge_s = QByteArray::number(bauteillaenge); QByteArray interpol_s = QByteArray::number(interpol); QByteArray anz_messungen_s = QByteArray::number(anz_messungen); QByteArray abs_messungen_s = QByteArray::number(abs_messungen); //Sending the variables serial->write("1"); serial->write("\n"); serial->write(bauteillaenge_s); serial->write("\n"); serial->write(messint_s); serial->write("\n"); serial->write(interpol_s); serial->write("\n"); serial->write(anz_messungen_s); serial->write("\n"); serial->write(abs_messungen_s); serial->write("\n");
Maybe I have to initiate the serial port in an other way ? Can anybody help me ?
regards
-
This post is deleted! -
Can you post your pro file?
Do you have this line in it?
QT += serialport
-
Hi @chr_sch,
could you clarify if your problem is to build the dll itself, or to include the dll in another project?
-
@t3685
that´s my pro file:TARGET = Messwert_Zuordnung_DLL TEMPLATE = lib QT += serialport QT += core QT -= gui DEFINES += MESSWERT_ZUORDNUNG_DLL_LIBRARY SOURCES += messwert_zuordnung_dll.cpp HEADERS += messwert_zuordnung_dll.h\ messwert_zuordnung_dll_global.h unix { target.path = /usr/lib INSTALLS += target }
serialport is added.
the dll builds without a problem. But I am not shure that it works correctly in the way I created it.
In the test programm I added the .h and global .h file and set the reference to the dll file.
Here is the pro file from my test program:QT += core QT -= gui QT += serialport TARGET = dll_tester CONFIG += console CONFIG -= app_bundle LIBS += "C:\Users\Christian\Documents\build-dll_tester-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug\debug\Messwert_Zuordnung_DLL.obj" TEMPLATE = app SOURCES += main.cpp HEADERS += \ messwert_zuordnung_dll.h \ messwert_zuordnung_dll_global.h \ qserialport.h \ qserialportglobal.h
-
At first glance it seems you are not linking to your library properly. Have a look at the link below for an example on how to link to a library.
https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application
-
I changed a few things in my .pro file according to the instructions in the link you send.
Namely I changed the following three thingsINCLUDEPATH += C:\Users\Christian\Desktop\Studienarbeit\DLL\Messwert_Zuordnung_DLL
DEPENDPATH += C:\Users\Christian\Desktop\Studienarbeit\DLL\Messwert_Zuordnung_DLL
LIBS += C:\Users\Christian\Desktop\Studienarbeit\DLL\build-Messwert_Zuordnung_DLL-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug\debugBut the Problem stayed ! The error refers to the QSerialPort I used.
I tried to include the DEPENDPATH and INCLUDEPATH where the qserialport.h file is in the Qt folder and added the qserialport.h file to the Header but no succes.Any other ideas ?
regards
-
Hello,
I think you still have an error in your pro file. The correct syntax to link to a library is
LIBS += -L<path to your dll> -l<name of your dll>
In your pro file you don't have the -l and -L. Please follow the instructions in the wiki more closely
-
I changed it :
LIBS += -L C:\Users\Christian\Desktop\Studienarbeit\DLL\build-Messwert_Zuordnung_DLL-Desktop_Qt_5_4_0_MSVC2013_64bit-Debug\debug -lMesswert_Zuordnung_DllStill getting the error.
regards
-
Hi,
Did you put a export macro in your class like explained in the wiki and on this page:
http://doc.qt.io/qt-5/sharedlibrary.html
Greetings,
t3685
-
@t3685
I added the Qt5SerialPort.lib, found somewhere in the Qt intalling folder, in the pro file under LIBS.
This generated some new errors refers to the moc_qserialport.cpp like this:1.)..\debug\moc_qserialport.cpp:352: Fehler: C2027: using
undefined Typ "QSerialPortPrivate"
c:\users\christian\documents\build-dll_tester-desktop_qt_5_4_0_msvc2013_
64bit-debug\debug../../dll_tester/qserialport.h(45): Declaration
of 'QSerialPortPrivate'2.)..\debug\moc_qserialport.cpp:352: Fehler: C2227: to the left of
"->_q_completeAsyncCommunication" must be an pointer to an class/strucktur/union/generic typeregards
-
You don't need to add Qt5SerialPort.lib.
The error you are getting is that the linker cannot find the implementation of "Messwert_Zuordnung_DLL::Messwert_zuordnung".
Like I said this is either due to:a) incorrectly linking to your dll
b) not declaring the function/class for exportBoth situations are explained in:
http://doc.qt.io/qt-5/sharedlibrary.html
So if the problem persist, please make sure that both conditions are fulfilled exactly as described in the link.
-
This is my header file:
#if defined(MESSWERT_ZUORDNUNG_DLL_LIBRARY) # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_EXPORT #else # define MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Q_DECL_IMPORT #endif class MESSWERT_ZUORDNUNG_DLLSHARED_EXPORT Messwert_Zuordnung_DLL { public: Messwert_Zuordnung_DLL(); void uebergabe(double messmeth,double messint, double bauteillaenge, double interpol, double anz_messungen, double abs_messungen); };
Therefore I think it is like mentioned in the link.
The linking to my dll consists of the following points:
-include the header files in my tets programm (copy them in the same direction)
-DEPENDPATH/INCLUDEPATH path to the folder where the .dll/.obj/.lib files are
-LIBS -L Path to dll -lname of dll
-HEADER name the headers to includeSo i followed the description in the link but I just cant see where my faults are ?!
Should I send you my files ?regards
-
Hi and welcome to devnet,
Did you re-run qmake after adding
QT += serialport
? -
Yes I run qmake.
I tried to set the paths to the folder where my test program is.
Now I get the error:
main.obj:-1: Fehler: LNK2019:unresolved external symbol""__declspec(dllimport) public: void __cdecl Messwert_Zuordnung_DLL::uebergabe(double,double,double,double,double,double)" (_imp?uebergabe@Messwert_Zuordnung_DLL@@QEAAXNNNNNN@Z)" in function "main".regards
-
Did you check that you are doing the property symbol exporting ? Define name for activating the export macro etc. ?
-
Do you this macro: MESSWERT_ZUORDNUNG_DLL_LIBRARY defined in the pro file of your library?
-
I choose to use QLibrary instead of implementing the dll by myself. Therefore I used the following code in my main.cpp:
QLibrary library("Messwert_Zuordnung_DLL.dll"); if (!library.load()) qDebug() << library.errorString(); if (library.load()) qDebug() << "library loaded"; library.resolve("uebergabe");
I am not really shure, that this is the proper use of QLibrary but it builds without an error.
So I think it might work.
If my dll gives simply the value in qDebug() out which I write in the dll function in my test programm it works.
But if I try to establish a serial connection, my microcontroller does not recognize a input. So there is a fault in the use of the QSerialPort in my code. The same code is used in a GUI where it works. I only did not use the connect() function and in the definition of my port serial* = new QSerialPort (this) I didn´t write this. Because I have no parent object here. Do I have to establish a QObject for this ? Or is there any other problem with the use of QSerialPort in a dll ?Here is my code:
QSerialPort *serial; serial = new QSerialPort(); //+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ //COM-Port ! serial->setPortName("COM12"); //+++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++ serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::SoftwareControl); serial->open(QIODevice::ReadWrite); //conversion of the variables for the use of the send function QByteArray messint_s = QByteArray::number(messint); QByteArray bauteillaenge_s = QByteArray::number(bauteillaenge); QByteArray interpol_s = QByteArray::number(interpol); QByteArray anz_messungen_s = QByteArray::number(anz_messungen); QByteArray abs_messungen_s = QByteArray::number(abs_messungen); //Sending the variables to my microcontroller serial->write("1"); serial->write("\n");
regards
-
Was it dll_tester that you failed to link ? If so, you were not linking to the library.
You need to delete serial by hand when not using it anymore otherwise you'll be leaking memory
-
@SGaist
I don´t know where my fault was. I think it was some linking problem but I don´t know how to solve so I use QLibrary.Ok you mean that I have to close the serialport at the end of the dll ?
Can you see any other fault? Because the serial connection is not working .