National Instruments USB 6002 read data in Qt Creator
-
@JKSH or anyone else how many experience in this field, I have encountered a similar issue to the one you have described in your previous posts. I have copied the sample code you posted above and have done extensive research, yet I am still receiving an error "Undefined Reference to DAQmxCreateTask' and so on for all my DAQmx commanddseventhough I have explicitly defined how the library is connected to the project in the project file as you have described in your previous post with the include path and library path. My paths also match yours exactly so I am incredibly confused on where this error is coming form. I have attached my source code, do you think you could take a quick look at what may be going wrong.
-
@JKSH or anyone else how many experience in this field, I have encountered a similar issue to the one you have described in your previous posts. I have copied the sample code you posted above and have done extensive research, yet I am still receiving an error "Undefined Reference to DAQmxCreateTask' and so on for all my DAQmx commanddseventhough I have explicitly defined how the library is connected to the project in the project file as you have described in your previous post with the include path and library path. My paths also match yours exactly so I am incredibly confused on where this error is coming form. I have attached my source code, do you think you could take a quick look at what may be going wrong.
Hi @smanchineella,
some questions:
- which compiler are you using?
- which architecture, 32 or 64 bit?
- where is the file
NIDAQmx.lib
located on your computer?
Regards
-
This post is deleted!
-
Hi @smanchineella,
some questions:
- which compiler are you using?
- which architecture, 32 or 64 bit?
- where is the file
NIDAQmx.lib
located on your computer?
Regards
@aha_1980 I am using the default compiler which came with qt (I believe it is MinGW-64 bit). Both the compiler and my pc are both 64 bit. The NIDAQmx.lib file is located at C:\Program Files (x86)\National Instruments\NI-DAQ\DAQmx ANSI C Dev\lib\msvc\NIDAQmx.lib
Please let me know if you see any issues with how it is setup on my pc. Any suggestions are greatly appreciated!
-
@aha_1980 I am using the default compiler which came with qt (I believe it is MinGW-64 bit). Both the compiler and my pc are both 64 bit. The NIDAQmx.lib file is located at C:\Program Files (x86)\National Instruments\NI-DAQ\DAQmx ANSI C Dev\lib\msvc\NIDAQmx.lib
Please let me know if you see any issues with how it is setup on my pc. Any suggestions are greatly appreciated!
Hi @smanchineella,
...\lib\msvc\NIDAQmx.lib
suggests that this is an import library for MSVC compiler. It does not say if that import library is for 32 or 64 bit. Both can be a problem.In principle, you cannot mix MSVC and MinGW compiler, so you will either need to switch to MSVC too, or find an include lib for MinGW.
Also, make sure both have the same bitness, otherwise it will likely also fail.
Regards
-
Hi @smanchineella,
...\lib\msvc\NIDAQmx.lib
suggests that this is an import library for MSVC compiler. It does not say if that import library is for 32 or 64 bit. Both can be a problem.In principle, you cannot mix MSVC and MinGW compiler, so you will either need to switch to MSVC too, or find an include lib for MinGW.
Also, make sure both have the same bitness, otherwise it will likely also fail.
Regards
It does not say if that import library is for 32 or 64 bit
Based on the installation folder
C:\Program Files (x86)\National Instruments\...
under Windows 64 bit, we can assume it's a 32 bit version of the library.@smanchineella as @aha_1980 mentioned please pay attention at the compiler and bitness of the library you're trying to use.
-
It does not say if that import library is for 32 or 64 bit
Based on the installation folder
C:\Program Files (x86)\National Instruments\...
under Windows 64 bit, we can assume it's a 32 bit version of the library.@smanchineella as @aha_1980 mentioned please pay attention at the compiler and bitness of the library you're trying to use.
@Pablo-J-Rogina @aha_1980 When I downloaded the NIDAQmx file from the NI website, it said it includes both 32 and 64 bit import library depending on the bitness of the computer and the compiler. However, based on your both replies, how would I go about installing a 32 bit MSVC library and linking that in?
-
Hi @smanchineella,
...\lib\msvc\NIDAQmx.lib
suggests that this is an import library for MSVC compiler. It does not say if that import library is for 32 or 64 bit. Both can be a problem.In principle, you cannot mix MSVC and MinGW compiler, so you will either need to switch to MSVC too, or find an include lib for MinGW.
Also, make sure both have the same bitness, otherwise it will likely also fail.
Regards
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
I am using the default compiler which came with qt (I believe it is MinGW-64 bit).
The online Qt installer provides both 32-bit and 64-bit versions of MinGW. There is no default; you select the one you want to install.
You must install 3 things:
- A compiler
- Qt libraries
- DAQmx libraries
All 3 things must have the same bitness, and the Qt libraries must match your compiler.
@aha_1980 said in National Instruments USB 6002 read data in Qt Creator:
In principle, you cannot mix MSVC and MinGW compiler, so you will either need to switch to MSVC too, or find an include lib for MinGW.
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
how would I go about installing a 32 bit MSVC library and linking that in?
You already have 32-bit DAQmx libraries. Now you need a 32-bit compiler and matching 32-bit Qt.
- Download the 32-bit MSVC compiler from Microsoft: https://visualstudio.microsoft.com/vs/features/cplusplus/
- Run MaintenanceTool.exe in your Qt folder and install Qt 5.15.2 for MSVC2019 (32-bit)
-
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
I am using the default compiler which came with qt (I believe it is MinGW-64 bit).
The online Qt installer provides both 32-bit and 64-bit versions of MinGW. There is no default; you select the one you want to install.
You must install 3 things:
- A compiler
- Qt libraries
- DAQmx libraries
All 3 things must have the same bitness, and the Qt libraries must match your compiler.
@aha_1980 said in National Instruments USB 6002 read data in Qt Creator:
In principle, you cannot mix MSVC and MinGW compiler, so you will either need to switch to MSVC too, or find an include lib for MinGW.
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
how would I go about installing a 32 bit MSVC library and linking that in?
You already have 32-bit DAQmx libraries. Now you need a 32-bit compiler and matching 32-bit Qt.
- Download the 32-bit MSVC compiler from Microsoft: https://visualstudio.microsoft.com/vs/features/cplusplus/
- Run MaintenanceTool.exe in your Qt folder and install Qt 5.15.2 for MSVC2019 (32-bit)
@JKSH said in National Instruments USB 6002 read data in Qt Creator:
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
While it is true you can use a C-API DLL with both compilers, the same is not true for the import library, at least based on my experience.
When I downloaded the NIDAQmx file from the NI website, it said it includes both 32 and 64 bit import library
Then these must be somewhere in the directory tree, please have a look.
However, based on your both replies, how would I go about installing a 32 bit MSVC library and linking that in?
That's not what I said. I said, if you only get an import library for MSVC, then you have to use the MSVC compiler to use that lib.
Regards
-
@JKSH said in National Instruments USB 6002 read data in Qt Creator:
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
While it is true you can use a C-API DLL with both compilers, the same is not true for the import library, at least based on my experience.
When I downloaded the NIDAQmx file from the NI website, it said it includes both 32 and 64 bit import library
Then these must be somewhere in the directory tree, please have a look.
However, based on your both replies, how would I go about installing a 32 bit MSVC library and linking that in?
That's not what I said. I said, if you only get an import library for MSVC, then you have to use the MSVC compiler to use that lib.
Regards
@aha_1980 said in National Instruments USB 6002 read data in Qt Creator:
@JKSH said in National Instruments USB 6002 read data in Qt Creator:
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
While it is true you can use a C-API DLL with both compilers, the same is not true for the import library, at least based on my experience.
Ah, I see. I'd better double-check the libraries then.
-
@aha_1980 said in National Instruments USB 6002 read data in Qt Creator:
@JKSH said in National Instruments USB 6002 read data in Qt Creator:
The compiler for NIDAQmx.lib doesn't really matter because it is a C library, not a C++ library.
While it is true you can use a C-API DLL with both compilers, the same is not true for the import library, at least based on my experience.
Ah, I see. I'd better double-check the libraries then.
@JKSH @aha_1980
I was able to fix the compilation error by adding two lines in my project file to link to a 64-bit version of the library and use a 64-bit compiler. However, I am not receiving another error which I think may be related.I am using the following import and include statements in my project file to link the library and the compiler
LIBS += "C:/Program Files (x86)/National Instruments/Shared/ExternalCompilerSupport/C/lib64/msvc/NIDAQmx.lib"
INCLUDEPATH += "C:/Program Files (x86)/National Instruments/Shared/ExternalCompilerSupport/C/include"
When I build the sample code to obtain just some voltage samples, I am receiving an errorDAQmx Error: Internal Software Error occurred in MIG software. Please contact National Instruments Support.
Task Name: MyTaskStatus Code: -229771
DAQmxErrChk(DAQmxCreateTask("MyTask", &taskHandle));
The line above is the line which is throwing the error. When I did not have to mess with the bitness of the library and compiler on a linux machine, I did not receive any such errors.
If anyone has any ideas on how to fix this issue please let me know as soon as possible. I have attached screenshots of my project file and my main file for additional reference as well. Thank you in advance!
-
@JKSH @aha_1980
I was able to fix the compilation error by adding two lines in my project file to link to a 64-bit version of the library and use a 64-bit compiler. However, I am not receiving another error which I think may be related.I am using the following import and include statements in my project file to link the library and the compiler
LIBS += "C:/Program Files (x86)/National Instruments/Shared/ExternalCompilerSupport/C/lib64/msvc/NIDAQmx.lib"
INCLUDEPATH += "C:/Program Files (x86)/National Instruments/Shared/ExternalCompilerSupport/C/include"
When I build the sample code to obtain just some voltage samples, I am receiving an errorDAQmx Error: Internal Software Error occurred in MIG software. Please contact National Instruments Support.
Task Name: MyTaskStatus Code: -229771
DAQmxErrChk(DAQmxCreateTask("MyTask", &taskHandle));
The line above is the line which is throwing the error. When I did not have to mess with the bitness of the library and compiler on a linux machine, I did not receive any such errors.
If anyone has any ideas on how to fix this issue please let me know as soon as possible. I have attached screenshots of my project file and my main file for additional reference as well. Thank you in advance!
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
Task Name: MyTask
Your C++ application was able to understand your Task name, which means your application is correctly linking to the DAQmx libraries. So everything is now correct on the Qt side, congratulations!
DAQmx Error: Internal Software Error occurred in MIG software. Please contact National Instruments Support.
That probably means your PC's NI hardware database is corrupted. Follow the instructions here to reset the database: https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P8awSAC
If that doesn't help, see here for other possible causes: https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P7a7SAC
I have attached screenshots of my project file and my main file for additional reference as well.
In the future, please post code as text instead of pictures. Text is easier for us to process.
-
#include <QObject> #include <QThread> #include <QCoreApplication> #include <atomic> #include <array> #include <NIDAQmx.h> #include <stdio.h> #include <QApplication> #include <QWidget> #include <QDebug> #include <iostream> #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else using namespace std; int main(int argc, char **argv) { // Initialize a usual Qt application QApplication app(argc, argv); QWidget w; TaskHandle taskHandle = 0; int32 error = 0; int32 samplesReceived = 0; float64 data[1000]; char errBuff[2048]={'\0'}; DAQmxErrChk(DAQmxCreateTask("MyTask", &taskHandle)); while(true) { cout << "Checkpoint 1" << endl; cout << "Checkpoint 2" << endl; DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL)); DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000)); DAQmxErrChk(DAQmxStartTask(taskHandle)); DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &samplesReceived, NULL)); // Print results qDebug() << "Received" << samplesReceived << "points"; for (int i = 0; i < samplesReceived; i++) qDebug() << data[i]; } DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); Error: if( DAQmxFailed(error) ) DAQmxGetExtendedErrorInfo(errBuff,2048); if( taskHandle!=0 ) { DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); } if( DAQmxFailed(error) ){ printf("DAQmx Error: %s\n",errBuff); return 0; } // Run Qt event loop w.show(); return app.exec(); }
With this code, I tried the avenue you had presented to me but did not find much success in trying those methods. After a little more debugging, I was able to obtain a new error as follows:
DAQmx Error: Specified operation cannot be performed while the task is running.
Task Name: MyTaskStatus Code: -200479
If you have any idea on how to resolve this issue please let me know. My project file has not changed since my last post. Thanks so much for the help.
-
#include <QObject> #include <QThread> #include <QCoreApplication> #include <atomic> #include <array> #include <NIDAQmx.h> #include <stdio.h> #include <QApplication> #include <QWidget> #include <QDebug> #include <iostream> #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else using namespace std; int main(int argc, char **argv) { // Initialize a usual Qt application QApplication app(argc, argv); QWidget w; TaskHandle taskHandle = 0; int32 error = 0; int32 samplesReceived = 0; float64 data[1000]; char errBuff[2048]={'\0'}; DAQmxErrChk(DAQmxCreateTask("MyTask", &taskHandle)); while(true) { cout << "Checkpoint 1" << endl; cout << "Checkpoint 2" << endl; DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL)); DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000)); DAQmxErrChk(DAQmxStartTask(taskHandle)); DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &samplesReceived, NULL)); // Print results qDebug() << "Received" << samplesReceived << "points"; for (int i = 0; i < samplesReceived; i++) qDebug() << data[i]; } DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); Error: if( DAQmxFailed(error) ) DAQmxGetExtendedErrorInfo(errBuff,2048); if( taskHandle!=0 ) { DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); } if( DAQmxFailed(error) ){ printf("DAQmx Error: %s\n",errBuff); return 0; } // Run Qt event loop w.show(); return app.exec(); }
With this code, I tried the avenue you had presented to me but did not find much success in trying those methods. After a little more debugging, I was able to obtain a new error as follows:
DAQmx Error: Specified operation cannot be performed while the task is running.
Task Name: MyTaskStatus Code: -200479
If you have any idea on how to resolve this issue please let me know. My project file has not changed since my last post. Thanks so much for the help.
@smanchineella said in National Instruments USB 6002 read data in Qt Creator:
DAQmx Error: Specified operation cannot be performed while the task is running.
You get this error because your code repeatedly tries to call
DAQmxCreateAIVoltageChan()
,DAQmxCfgSampClkTiming()
, andDAQmxStartTask()
in the while loop. Those functions should only be called once; the while loop should only read the data.Note: Your
while(true)
loop blocks the Qt event loop. You won't be able to use the GUI if you run a permanent while loop. Qt is based on event-driven programming, so you should use aQTimer
to read your data at fixed intervals instead: https://doc.qt.io/qt-5/qtimer.html