(三)NI采集卡应用学习:在Qt中实现多路数据的同时采集、显示、绘图及存储

1、使用NI MAX创建多路输入的测量任务
在这里插入图片描述
本处设置Dev1/ai0:3四路电压输入,采样率均为100,差分连接。
2、代码

// 设置地址
void Widget::on_add_pushButton_clicked()
{address_txt = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);ui->begin_pushButton->setEnabled(true);ui->add_pushButton->setEnabled(false);//操作记录QString current_date = ui->textEdit->toPlainText();QDateTime current_date_time =QDateTime::currentDateTime();   //获取当前时间current_date +=current_date_time.toString("hh:mm:ss");current_date += (address_txt);current_date += "\n";ui->textEdit->setText(current_date);
}// 开始采集
void Widget::on_begin_pushButton_clicked()
{//创建文本文档QDateTime current_date_time =QDateTime::currentDateTime();   //获取当前时间QString thename = current_date_time.toString("yyyy-MM-dd-hh-mm-ss");fileName = thename+".txt";fileName = address_txt+"/"+fileName;file.setFileName(fileName);file.open(QFile::WriteOnly);//开始采集数据int32       error = 0;char        errBuff[2048] = { '\0' };error += DAQmxCreateTask("",&taskHandle);error += DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0:3", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL);error += DAQmxCfgSampClkTiming(taskHandle, "", rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, sample);error += DAQmxSetAITermCfg(taskHandle,"Dev1/ai0:3",DAQmx_Val_Diff);error += DAQmxRegisterEveryNSamplesEvent(taskHandle, DAQmx_Val_Acquired_Into_Buffer, sample, 0,EveryNCallback, (void*)this);error += DAQmxRegisterDoneEvent(taskHandle, 0, DoneCallback, NULL);error += DAQmxStartTask(taskHandle);//绘图_pTimerUpdate->start(1000); //1s更新一次// 操作记录QString current_date = ui->textEdit->toPlainText();current_date +=current_date_time.toString("hh:mm:ss");current_date += QString::fromLocal8Bit("开始采集");current_date += "\n";ui->textEdit->setText(current_date);if (error < 0){DAQmxGetExtendedErrorInfo(errBuff, 2048);qDebug() << error;qDebug() << errBuff;on_stop_pushButton_clicked();}else{ui->stop_pushButton->setEnabled(true);ui->begin_pushButton->setEnabled(false);}
}void Widget::on_stop_pushButton_clicked()
{_pTimerUpdate->stop();file.close();DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);ui->stop_pushButton->setEnabled(false);ui->begin_pushButton->setEnabled(true);// 操作记录QString current_date = ui->textEdit->toPlainText();QDateTime current_date_time =QDateTime::currentDateTime();   //获取当前时间current_date +=current_date_time.toString("hh:mm:ss");current_date += QString::fromLocal8Bit("停止采集");current_date += "\n";ui->textEdit->setText(current_date);
}void Widget::Voltage_show()
{//声明时间获取变量,实际情况中,获取的是当前时间的总秒数int nowtime = (QTime::currentTime().hour()*60+QTime::currentTime().minute())*60+QTime::currentTime().second();double key = nowtime;static double lastPointKey = 0;if (key-lastPointKey > 0.5) //大于2ms添加一个数据{ui->capwidget->graph(0)->addData(nowtime, cap1);ui->capwidget->graph(1)->addData(nowtime, cap1);ui->capwidget->graph(2)->addData(nowtime, cap2);ui->capwidget->graph(3)->addData(nowtime, cap2);ui->prewidget->graph(0)->addData(nowtime, pre3);ui->prewidget->graph(1)->addData(nowtime, pre3);ui->prewidget->graph(2)->addData(nowtime, pre4);ui->prewidget->graph(3)->addData(nowtime, pre4);lastPointKey = key;}ui->capwidget->xAxis->setRange(nowtime, 10, Qt::AlignRight);        //设置x轴范围ui->capwidget->replot();       //画图ui->prewidget->xAxis->setRange(nowtime, 10, Qt::AlignRight);        //设置x轴范围ui->prewidget->replot();       //画图
}int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void * callbackData)
{Widget * pDAQContAI = (Widget *)callbackData;int32       error=0;char        errBuff[2048]={'\0'};static int  totalRead=0;int32       read=0;float64     data[400];QString total,Voltage1,Voltage2,Voltage3,Voltage4;qRegisterMetaType<QVector<int>>("QVector<int>");error = DAQmxReadAnalogF64(taskHandle,                  //任务句柄nSamples,                    //每个通道要读取的样本数10.0,                        //等待时间DAQmx_Val_GroupByScanNumber, //指定样本是否交错,这个是按扫描编号分组(交错)data,                        //将样本读入的数组400,                         //数组的大小&read,                       //从每个通道读取的实际样本数NULL);totalRead += read ;QDateTime current_date_time =QDateTime::currentDateTime();   //获取当前时间int thenumber;if(read>0){//曲线作图电压赋值cap1=data[0];cap2=data[1];pre3=data[2];pre4=data[3];//实时存储for(int i=0;i<400;i=i+4){thenumber=i/4+totalRead-100;QString str(current_date_time.toString("hhmmss")+"  "+QString("%1").arg(thenumber+1)+"  "+QString("%1").arg(data[i])+"  "+QString("%1").arg(data[i+1])+"  "+QString("%1").arg(data[i+2])+"  "+QString("%1").arg(data[i+3])+"\n");pDAQContAI->file.write(str.toStdString().c_str());}//实时显示total = QString("%1").arg(totalRead);Voltage1 = QString("%1").arg(data[0]);Voltage2 = QString("%1").arg(data[1]);Voltage3 = QString("%1").arg(data[2]);Voltage4 = QString("%1").arg(data[3]);QTableWidgetItem *item0 = new QTableWidgetItem();QTableWidgetItem *item1 = new QTableWidgetItem();QTableWidgetItem *item2 = new QTableWidgetItem();QTableWidgetItem *item3 = new QTableWidgetItem();QTableWidgetItem *item4 = new QTableWidgetItem();item0->setText(total);item1->setText(Voltage1);item2->setText(Voltage2);item3->setText(Voltage3);item4->setText(Voltage4);pDAQContAI->ui->tableWidget->setItem(0,1,item0);pDAQContAI->ui->tableWidget->setItem(1,0,item1);pDAQContAI->ui->tableWidget->setItem(2,0,item2);pDAQContAI->ui->tableWidget->setItem(1,1,item3);pDAQContAI->ui->tableWidget->setItem(2,1,item4);pDAQContAI->ui->tableWidget->show();}if (error < 0){DAQmxGetExtendedErrorInfo(errBuff, 2048);qDebug() << error;qDebug() << errBuff;DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);}else{pDAQContAI->ui->stop_pushButton->setEnabled(true);}return 1;
}int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{int32   error=0;char    errBuff[2048]={'\0'};if(DAQmxFailed(error=status)){DAQmxGetExtendedErrorInfo(errBuff,2048);DAQmxClearTask(taskHandle);qDebug()<<"DAQmx Error:";qDebug()<<errBuff<<endl;}return 0;
}

个人觉得需要注意的几个地方:
⑴NI DAQmx会自动创建线程进行数据采集,可以在该线程中增加写文本等操作,主线程专门用来操作主界面,实现绘制曲线等。
如果在回调函数中(NI DAQmx线程)进行曲线绘制,会出现线程冲突的报错。
⑵EveryNCallback函数本处放在类外面进行声明,归在主界面的类下面进行声明会报错,所以回调中使用的部分变量在public下声明,以及需要指针将内外一起连接。

Widget * pDAQContAI = (Widget *)callbackData;

⑶在之前一直没明白交错是什么意思,在考虑存储数据时发现,非交错就是通道0的100个数存完了再存通道1的100个数,以此类推。交错则是通道0一个数、通道1一个数,按顺序一轮之后再是下一轮,这种更方便存储和后续处理。
3、显示以及存储效果

在这里插入图片描述
4、下载地址
NI采集卡多路输入数据的同时采集、显示、曲线绘制及文本存储 工程文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux程序框架设计,《Linux与Qt程序设计》知识框架

本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析。 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点的特点-> 代码实现-> 工程代码分析 第一部分 Linux基础知识 第二部分 Qt程序基础…

QT开发应用程序(11)--图形绘制和文本输出

代码演示&#xff1a; #include <QPainter> MyDraw::MyDraw(QWidget *parent) :QWidget(parent) {QLinearGradient linearGradient(0,0,400,400);linearGradient.setColorAt(0.0,Qt::white);linearGradient.setColorAt(0.2,QColor(0,0,0));linearGradient.setColorAt(1.…

chatgpt赋能python:使用Python捕获错误:为您的代码添加可靠性

使用Python捕获错误&#xff1a;为您的代码添加可靠性 在编写Python代码时&#xff0c;错误很常见。您可能会因输入无效参数而收到TypeError&#xff0c;或者因无法连接到数据库而收到ConnectionError。当这些错误发生时&#xff0c;您的代码可能会崩溃或产生不正确的结果。尽…

chatgpt赋能python:关闭Python:如何优雅地退出一个Python程序

关闭Python&#xff1a;如何优雅地退出一个Python程序 Python作为一门开发语言&#xff0c;可以广泛应用于众多领域&#xff0c;如数据科学、人工智能、Web应用开发等等。但有时候&#xff0c;我们需要关闭一个正在运行的Python程序。本文将介绍如何优雅地退出一个Python程序&…

chatgpt赋能python:Python异常捕获存在的问题

Python 异常捕获存在的问题 作为一门广受欢迎、应用广泛的编程语言&#xff0c;Python 在处理异常方面有着比较完善的设计。Python 提供了 try…except…finally 这样的异常处理机制&#xff0c;通过这些机制&#xff0c;开发者可以捕获、处理程序中产生的异常&#xff0c;从而…

yagmail——快速发送邮件

yagmail——快速发送邮件 目标&#xff1a;如何利用python中的yagmail包&#xff0c;快速发送邮件。 python写的一个简单demo脚本代码如下&#xff1a; import yagmail import pandas as pd from loguru import logger# 保存excel文件 contents pd.DataFrame() contents[&quo…

电脑和微信怎么发邮件到别人邮箱,企业邮箱如何发email给别人

邮箱已成为主流的办公软件&#xff0c;除了日常的电脑办公使用以外&#xff0c;你知道还有哪些便捷的方式使用邮箱吗&#xff1f;现在是互联网时代&#xff0c;许多邮箱都研发了手机邮箱配合使用&#xff0c;那TOM企业邮箱有哪些便捷的服务呢&#xff1f;一起看看吧&#xff01…

怎么发送电子邮件到别人邮箱?手把手教你!

在日常生活中&#xff0c;我们在工作学习的时候都离不开电子邮件&#xff0c;无论两人的距离有多远&#xff0c;都是可以通过电子邮件的方式完成信息的即时传递。这样不仅可以传输文字信息&#xff0c;还能传输图片、视频等多种格式的信息。那么&#xff0c;怎么发送电子邮件到…

chatgpt赋能Python-pythonapp自动化

Python App自动化&#xff1a;优化SEO的终极解决方案 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得日益重要。对于任何网站或应用程序开发人员来说&#xff0c;SEO应该是一个非常重要的考虑因素。为了帮助开发人员和企业提高其在线可见性&#x…

chatgpt赋能python:Python自动化断言介绍

Python 自动化断言介绍 软件业的各种应用程序不可避免地需要与用户进行交互。测试团队应该确保这些应用程序快速&#xff0c;可靠地响应用户交互&#xff0c;并注重高质量测试的策略和工具。Python自动化断言是一种测试策略&#xff0c;可帮助团队实现高品质和高效率的测试。P…

chatgpt赋能python:Python自动化操作桌面的方法和应用

Python自动化操作桌面的方法和应用 Python是一种高级编程语言&#xff0c;越来越多的研究人员和程序员将其应用在自动化操作任务上。本文将向您介绍如何利用Python自动化操作桌面并且展示一些实际应用。 桌面自动化操作是什么&#xff1f; 桌面自动化操作是使用编程语言编写…

chatgpt赋能python:Python表格自动化:优化你的数据处理工作效率

Python表格自动化&#xff1a;优化你的数据处理工作效率 作为一名有10年Python编程经验的工程师&#xff0c;我深切体会到编程能够为我们带来的高效和便利。其中&#xff0c;Python在数据分析和处理方面的优势尤为突出。本文将从Python表格自动化的角度&#xff0c;为大家介绍…

chatgpt赋能python:Python如何自动化办公

Python如何自动化办公 随着信息技术的不断发展和进步&#xff0c;自动化技术已经在各行各业得到了广泛的应用。作为一种高级编程语言&#xff0c;Python在自动化办公领域发挥了重要的作用。下面&#xff0c;我们来详细了解一下Python如何自动化办公。 什么是Python自动化办公…

chatgpt赋能Python-python_gui自动化点击

简介 Python是一种功能强大的编程语言&#xff0c;它的广泛应用让许多企业都使用了这种语言来编写脚本&#xff0c;编写小型应用程序和构建自动化工作流程。其中&#xff0c;Python GUI自动化成为了越来越普遍的需求。Python可以使用多种GUI库&#xff0c;例如PyQt、Tkinter和…

chatgpt赋能python:如何用Python自动化办公提升工作效率

如何用Python自动化办公提升工作效率 随着科技的不断发展和普及&#xff0c;人们越来越重视如何利用技术手段提高生产效率。对于很多办公人员来说&#xff0c;每天大量的重复性工作可能会让人感到枯燥乏味。而Python作为一种易学易用的编程语言&#xff0c;可以帮助办公人员自…

chatgpt赋能Python-python_gui_自动化

Python GUI自动化——让你的工作更高效 Python是一种多用途、高级语言&#xff0c;使用广泛。它是一种开发强大且易于维护的程序的语言。自从出现以来&#xff0c;Python已经在许多领域得到了广泛的应用&#xff0c;包括 Web 开发、数据分析、人工智能和自动化测试等。而其中&…

chatgpt赋能python:自动化办公:Python的应用

自动化办公&#xff1a;Python的应用 随着信息量的爆炸式增长&#xff0c;人们面临越来越多的数据处理任务。办公桌上堆积如山的资料&#xff0c;以及工作日程的繁忙&#xff0c;使得人们越来越需要自动化的解决方案。Python自从诞生以来&#xff0c;就在自动化开发领域占据了…

chatgpt赋能Python-python_gui自动化

Python GUI自动化&#xff1a;让测试变得更加高效和可靠 在当今的软件开发市场中&#xff0c;自动化测试已经成为了一项必不可少的技术。与手动测试相比&#xff0c;自动化测试具有更高的效率和更可靠的结果。在自动化测试的过程中&#xff0c;GUI&#xff08;图形用户界面&am…

chatgpt赋能python:Python接口自动化关联参数详解

Python接口自动化关联参数详解 什么是Python接口自动化&#xff1f; 在软件开发领域&#xff0c;接口测试是不可或缺的一部分。Python接口自动化是利用Python语言编写脚本来自动化测试接口的过程。通过自动化测试可以提高测试效率&#xff0c;减少测试成本&#xff0c;并且确…

chatgpt赋能python:Python接口自动化:提高效率的利器

Python接口自动化&#xff1a;提高效率的利器 随着互联网和移动互联网的快速发展&#xff0c;Web API/接口测试和开发变得越来越重要。Python是一种流行的编程语言&#xff0c;它在接口自动化测试中占据着重要的地位。 什么是接口自动化&#xff1f; 接口自动化是在API/接口…