LabWindows CVI 2017开发笔记--串口调试软件实例

news2024/12/23 12:18:00

一、新建工程

打开LabWindows CVI软件,在桌面新建SerialDebug文件夹用来保存工程文件,在欢迎页点击New–>Project
在这里插入图片描述
或者在软件首页点击File–>New–>Project
在这里插入图片描述
将Project创建在新的Workspace中,设置完成后点击OK
在这里插入图片描述
新建一个用户GUI界面,点击File–>New–>User Interface
在这里插入图片描述
新建完成后如下图所示
在这里插入图片描述

二、配置GUI界面

1、点击新建的GUI界面任意区域,界面右侧出现对应编辑框
设置Constant Name为:PANEL
取消勾选Can Maximize,禁用窗口最大化
设置Title为:串口调试(By塔克Tark)
在主界面边缘可任意拉伸界面大小到合适尺寸
2、将当前界面保存在SerialDebug文件夹里,保存为SerialDebug.uir
在这里插入图片描述

3、将SerialDebug.uir界面添加到对应workspace下的工程里面
在对应工程位置选中后鼠标右键,添加已有文件
在这里插入图片描述

将SerialDebug.uir添加到工程后,再次选中右键工程,点击save保存工程,工程名称也命名为SerialDebug
在这里插入图片描述

4、在SerialDebug.uir界面上添加一些控件,在面板内任意位置鼠标右键,找到相应控件进行放置即可,放置后对控件属性进行设置

面板或控件类型Constant NameLabelCallback Function
PanelPANEL串口调试(By塔克Tark)(https://blog.csdn.net/Stark_?spm=1000.2115.3001.5343)PanelMain
RingCOMSELECT串口号
RingBAUDSELECT波特率
RingCHECKSELECT校验位
RingLONGSELECT数据位
RingSTOPSELECT停止位
Command ButtonOPEN_COM打开串口ComOpen
LEDLEDLEDLED
Command ButtonCLOSE_COM打开串口ComClose
Text BoxRECIVETEXT接收区
Text BoxSENDTEXT发送区
TimerTIMERTimerTimer
Command ButtonCLEARRECEIVE清空接收ClearTextBox
Command ButtonSEND发送Send
Command ButtonCLEARSEND清空发送ClearTextBox
Graph(Strip Chart)WAVE_DISPLAY波形显示

编辑完成后如下图所示
在这里插入图片描述
除此之外,还需要修改某些控件的属性,修改步骤如下:
双击 COMSELECT 控件,编辑 Label/Value 属性,向控件添加项目的 Label分别为COM1、COM2、COM3、COM4、COM5、COM6,相应的 Value 值为 1、2、3、4、5、6,数据类型为整数。
在这里插入图片描述
编辑 BAUDSELECT 控件的 Label/Value 属性,向控件添加项目的 Label分别为 4800、9600、115200,相应的 Value 值为 4800、9600、112500,数据类型为整数。
在这里插入图片描述
编辑 CHECKSELECT 控件的 Label/Value 属性,向控件添加项目的 Label 分别为无校验、奇校验、偶校验,相应的 Value 值为 0、1、2,数据类型为整数。
在这里插入图片描述
编辑 LONGSELECT 控件的 Label/Value 属性,向控件添加项目的 Label分别为 7、8、9,相应的 Value 值为 7、8、9,数据类型为整数。
在这里插入图片描述编辑 STOPSELECT 控件的 Label/Value 属性,向控件添加项目的 Label分别为 1、2,相应的 Value 值为 1、2,数据类型为整数。
在这里插入图片描述
编辑两个文本框的属性:Text Box Options…-Enter Key Causes Newline以允许在文本框中输入多行文本,同时将接收区文本框Control Settings中No Edit Text设置为勾选状态,禁止接收区文本的编辑。
在这里插入图片描述
编辑WAVE_DISPLAY控件Left Y-Axis…-Maximum为99,Size/Position -Graph Background Color为透明色
在这里插入图片描述
在这里插入图片描述
编辑TIMER控件Size/Position中Initially Hidden为勾选,使得实际运行时隐藏图标,设置Timer Interval为0.001,使得定时中断时间为1ms
在这里插入图片描述
完成以上设置后,效果如下
在这里插入图片描述

三、生成源码框架

保存文件 SerialDebug.uir。使用代码生成器生成源文件程序框架。
在这里插入图片描述
一路点击OK、YES
在这里插入图片描述
然后将源码文件新建到当前Workspace
在这里插入图片描述

对于单个控件修改后,也可单独进行代码生成
在这里插入图片描述

添加控件的回调函数,添加完毕后,所有代码如下所示:

#include <cvirte.h>		
#include <userint.h>
#include "SerialDebug.h"

static int panelHandle;

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "SerialDebug.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);
	RunUserInterface ();
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK PanelMain (int panel, int event, void *callbackData,
						   int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:

			break;
	}
	return 0;
}

int CVICALLBACK ComOpen (int panel, int control, int event,
						 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			break;
	}
	return 0;
}

int CVICALLBACK ClearTextBox (int panel, int control, int event,
							  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			break;
	}
	return 0;
}

int CVICALLBACK Send (int panel, int control, int event,
					  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			break;
	}
	return 0;
}

int CVICALLBACK Timer (int panel, int control, int event,
					   void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_TIMER_TICK:

			break;
	}
	return 0;
}

现在可以点击编译和运行按钮,看一下
在这里插入图片描述
运行效果如下:
在这里插入图片描述
这时可以发现这个窗口无法点击右上角X关闭,这是因为代码中还没有对各个控件的逻辑进行说明,接下来对代码逻辑进行编辑

四、编辑源码

在CVICALLBACK PanelMain中添加关闭窗口逻辑,运行后即可成功通过右上角X关闭窗口

int CVICALLBACK PanelMain (int panel, int event, void *callbackData,
						   int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:
				QuitUserInterface (0);//关闭面板0(主面板)
			break;
	}
	return 0;
}

新增界面控件状态设置函数CVIFUNC DimObject

//设置页面控件状态,stat = 0表示关闭,1表示打开
//SetCtrlAttribute(,,ATTR_DIMMED,)将对应控件属性变暗和变亮,以禁用和使用对应控件
int CVIFUNC DimObject(int stat)
{
	SetCtrlAttribute(panelHandle,PANEL_COMSELECT,ATTR_DIMMED,stat); //串口号选择 
	SetCtrlAttribute(panelHandle,PANEL_BAUDSELECT,ATTR_DIMMED,stat); //波特率
	SetCtrlAttribute(panelHandle,PANEL_CHECKSELECT,ATTR_DIMMED,stat);//校验位
	SetCtrlAttribute(panelHandle,PANEL_LONGSELECT,ATTR_DIMMED,stat); //数据位
	SetCtrlAttribute(panelHandle,PANEL_STOPSELECT,ATTR_DIMMED,stat);//停止位
	SetCtrlAttribute(panelHandle,PANEL_OPEN_COM,ATTR_DIMMED,stat);  //打开串口
	
	SetCtrlVal(panelHandle,PANEL_LED,stat);   //LED 
	
	SetCtrlAttribute(panelHandle,PANEL_CLOSE_COM,ATTR_DIMMED,!stat); //关闭串口
	SetCtrlAttribute(panelHandle,PANEL_SEND,ATTR_DIMMED,!stat);//发送
	
	return 0;	
}

CVICALLBACK ComClose

int CVICALLBACK ComClose (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			   CloseCom(comSelect);		//关闭串口
			   comSelect = 0;
			   DimObject(0);
			   ComState = 0; 
			break;
	}
	return 0;
}

CVICALLBACK ComOpen

int CVICALLBACK ComOpen (int panel, int control, int event,
						 void *callbackData, int eventData1, int eventData2)
{
	int comValue,baudValue,checkValue,longValue,stopValue; 
	switch (event)
	{
		case EVENT_COMMIT:
				GetCtrlVal(panelHandle,PANEL_COMSELECT,&comValue); //获取串口号
				GetCtrlVal(panelHandle,PANEL_BAUDSELECT,&baudValue); //获取波特率 
				GetCtrlVal(panelHandle,PANEL_CHECKSELECT,&checkValue);//获取校验位
				GetCtrlVal(panelHandle,PANEL_LONGSELECT,&longValue);//获取数据位
				GetCtrlVal(panelHandle,PANEL_STOPSELECT,&stopValue);//获取停止位
				//设置和打开串口
				status = OpenComConfig(comValue,"",baudValue,checkValue,longValue,stopValue,MAX_BUF_NUM,MAX_BUF_NUM);
				if(status!=0)
				{
					MessagePopup("Error","config failed!");   //弹窗提示
					ComState = 0;
					return 0;
				}
				SetCTSMode(comValue,LWRS_HWHANDSHAKE_OFF); /* 禁止硬件握手,即不用RTS/CTS和DTR/DSR */
				FlushInQ(comValue);   //清空输入队列的缓存数据
				FlushOutQ(comValue);  //清空输出队列的缓存数据
				comSelect = comValue;
				DimObject(1);
				ComState = 1;  //串口开启状态
			break;
	}
	return 0;
}

CVICALLBACK ClearTextBox

int CVICALLBACK ClearTextBox (int panel, int control, int event,
							  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
				if(control == PANEL_CLEARRECEIVE)//清除接收控件
					ResetTextBox(panelHandle,PANEL_RECEIVETEXT,"\0");//清除接收框
				else
					ResetTextBox(panelHandle,PANEL_SENDTEXT,"\0");//清除发送框
			break;
	}
	return 0;
}

CVICALLBACK Send

int CVICALLBACK Send (int panel, int control, int event,
					  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
				if(!comSelect) return -1; //发送出错
				GetCtrlVal(panelHandle,PANEL_SENDTEXT,info);//获取要发送的文本
				status = ComWrt(comSelect,info,strlen(info));//发送
				if(status != strlen(info))
					MessagePopup("Error","Send data failed!");  //弹窗提示
			break;
	}
	return 0;
}

CVICALLBACK Timer

int CVICALLBACK Timer (int panel, int control, int event,
					   void *callbackData, int eventData1, int eventData2)
{
	int i = 0;
	int len = 0;
	double point = 0;
	
	switch (event)
	{
		case EVENT_TIMER_TICK:
				if(ComState)
				{
					if(!comSelect) return -1;
					SetComTime(comSelect,1); //设置一帧数据的接收超时时间为1s
					len = GetInQLen(comSelect);
					status = ComRd(comSelect,info,len);//接收,GetInQLen用于得到Com口的输入队列数据缓存的大小
					if(status<=0)
					{
						//MessagePopup("Error","Read data failed!");   //弹窗提醒没有读取到信息
						break;
					}
					//将信息写入接收框
					info[status] = '\0';
					SetCtrlVal(panelHandle,PANEL_RECEIVETEXT,info); //设置接收文本框显示info的内容
					SetActiveCtrl(panelHandle,PANEL_RECEIVETEXT);	
					
					if((len == 2)||(info[2] == 0x0D))  //收到两个字符,或者第三个字符是回车
					{
						point = (info[0]-48)*10 + (info[1]-48);   //接收一个两位数,比如 01、09、10、90、AB
						if((point>=0)&&(point<=99))//判定这个两位数属于00-99之间
						{
							PlotStripChartPoint(panelHandle,PANEL_WAVE_DISPLAY,point);    //对于在范围内的数据进行绘制点
						}
					}
					
					for(0;i<len;i++)
					{
						info[i]=0;
						i++;
					}
				}
			break;
	}
	return 0;
}

完整源码可见:https://blog.csdn.net/Stark_/article/details/129009241
完成代码编辑后重新编译运行
在这里插入图片描述
设置串口参数,点击打开串口2
在这里插入图片描述

五、调试运行

使用虚拟串口连接COM2和COM3,使用XCOM打开串口3,我们自己编写的串口调试打开串口2
在这里插入图片描述
互相发送数据,测试各项功能正常,使用XCOM发送多个不同的两位数字
在这里插入图片描述
波形显示正常

六、打包发布

测试功能没有问题后即可制作setup安装包。
在源程序编辑界面,按下图操作:
在这里插入图片描述
在下面窗口点击New…弹出窗口的Name栏一般不用修改,默认是开发程序的工程名,直接点击OK按钮。
在这里插入图片描述
弹出Installer编辑窗口,General选项卡的大部分项目如果没有必要不用修改,可以只把Installer Dialog Options的Language改成你所需要的语言。
在这里插入图片描述

Files选项卡比较重要,上半部是工程开发文件,下半部是设置安装的文件和目录。将需要安装的文件添加下来就OK了,大部分用默认就可以,一般的…DLL Dependencies(.dll,.dll,…)不一定需要可以移除,因为windows系统一般都已经含有了,如果目标PC不含有就不要移除。如果工程中用到特殊的DLL也要添加近来,包括程序用的INI文件等所有需要的文件也要添加。.uir不需要添加,将.uir编译到EXE文件中。Program Files文夹可以在此修改成自定义的目录名。
在这里插入图片描述

Shortcuts选项卡比较简单,默认只有在开始菜单创建快捷方式,可以修改为添加一个在桌面的快捷方式。
在这里插入图片描述

Drivers&Components选项卡,如果程序中只用了普通功能一般按照默认设置就可以了,如果还用了别的功能要添加相应的支持库。比如在程序中使用了ActiveX 控件可能就要选ActiveX Container Support复选框,如果使用了分析库函数就需要选Analysis Support以此类推。当然如果你不在乎安装程序太大你也可以都选,这样就会支持所有的功能。
在这里插入图片描述

Registry keys我一般用默认不做修改。
在这里插入图片描述

Advanced选项卡可以只修改Minimum Operating System Version,选取你需要的目标PC最小系统版本。
在这里插入图片描述
现在已经设置完毕,接下来就单击,关闭对话框。
如果还需要修改设置,单击Build菜单下的Distrbutions菜单的Edit …命令。
在这里插入图片描述

如果不需修改设置,只需要生成安装包点击Build …命令稍等片刻就完成了
在这里插入图片描述
在这里插入图片描述

在你的工程文件夹的cvidistkit.工程名\Volume下就是你的开发安装包。
在这里插入图片描述
通过setup即可安装这个串口调试软件
打包结果可见:https://download.csdn.net/download/Stark_/87447657

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存溢出、内存泄露的概述及常见情形

内存溢出&#xff08;OutofMemoryError&#xff09; 简述 java doc 中对 Out Of Memory Error 的解释是&#xff0c;没有空闲内存&#xff0c;并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理&#xff0c;由于 GC&…

functional interface

更优雅 案例 要在TodoTaskRepository写find方法找到对应task列表&#xff0c;传入自定义的如何find 要传入两个参数&#xff0c;返回一个bool&#xff0c;在文档里找这样的functional interface java8官方文档-Package java.util.function BiPredicate是这样的 接口函数是t…

Numpy基础——人工智能基础

文章目录一、Numpy概述1.优势2.numpy历史3.Numpy的核心&#xff1a;多维数组4.numpy基础4.1 ndarray数组4.2 内存中的ndarray对象一、Numpy概述 1.优势 Numpy(Nummerical Python),补充了Python语言所欠缺的数值计算能力&#xff1b;Numpy是其它数据分析及机器学习库的底层库&…

GitLab CI/CD实现代码推送后自动maven打包发布

1、GitLab CI/CD介绍 CI(Continuous Intergration)&#xff1a;即持续集成&#xff0c;将代码的合并、部署、自动化测试都在一起&#xff0c;不断地执行这个过程&#xff0c;并对结果反馈。 CD(Continuous Delivery)&#xff1a;即持续交付&#xff0c;持续交付是一种软件工程方…

别具一格的婚礼,VR全景+婚礼的优势展现在哪里?

随着90后、95后逐渐步入结婚的主力军中&#xff0c;如何策划一场别具一格的婚礼是许多年轻人所头疼的&#xff0c;那么今年我们就可以玩点新潮的&#xff0c;VR婚礼或许是个不错的选择。 VR全景婚礼就是通过全景摄像机对婚礼进行记录&#xff0c;不但可以帮助新人捕捉婚礼的精彩…

对S参数的理解II

本篇文章特别感谢粉丝朋友“千年的呢喃”&#xff0c;他给我推荐了一本书&#xff0c;写的非常好 Micro Wave and RF Design&#xff0c;有需要的朋友自行下载。 之前关于S参数也写过几篇文章了&#xff0c;但一直以来都有一个历史遗漏问题没有解决&#xff0c;那就是&#xf…

ElasticSearch-学习笔记05【SpringDataElasticSearch】

Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…

【IVIF的超分重建】

Multimodal super-resolution reconstruction of infrared and visible images via deep learning &#xff08;基于深度学习的红外和可见光图像多模态超分辨率重建&#xff09; 提出了一种基于编解码器结构的红外-可见光图像融合方法。图像融合任务被重新表述为保持红外-可见…

2023年3月AMA-CDGA/CDGP数据治理认证考试这些城市可以报名

目前2023年3月5日CDGA&CDGP开放报名的城市有&#xff1a;北京、上海、广州、深圳、杭州、重庆&#xff0c;西安&#xff0c;成都&#xff0c;长沙&#xff0c;济南&#xff0c;更多考场正在增加中… DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业…

Echarts 设置折线图线条样式(虚线+粗细+阴影)

第012个点击查看专栏目录Echarts折线图的lineStyle属性可以设置折线的颜色&#xff0c;粗细&#xff0c;类型&#xff0c;线段末端类型&#xff0c;阴影&#xff0c;透明度&#xff0c;偏移等属性。文章目录示例效果示例源代码&#xff08;共128行&#xff09;相关资料参考专栏…

【Java|多线程与高并发】 使用Thread 类创建线程的5种方法如何查看程序中的线程

文章目录前言线程创建1.继承Thread类重写run()方法如何查看程序中的线程?2.实现Runnable接口3.使用匿名内部类,继承Thread4.使用匿名内部类,实现Runnable5.⭐使用Lambda表达式,创建线程(重要)Thread 的常见构造方法总结前言 在这里主要补充说明一些问题,方便更好地理解下面的…

conda安装nodejs版本过低解决方法

conda命令直接安装nodejs时&#xff0c;可能会由于镜像源中nodejs版本过低导致没法安装高本版的nodejs&#xff0c;导致无法jupyterlab使用一些扩展插件。 解决方法如下&#xff1a;&#xff08;windows环境下直接按提示下载版本安装就行&#xff0c;此处只介绍linux环境的解决…

2023上半年软考中级系统集成项目管理工程师2月25日开班

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

今天面试招了个28K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在20~30k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

2023年上半年软考高项信息系统项目管理师2月25日开班

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

每天一道大厂SQL题【Day09】充值日志SQL实战

每天一道大厂SQL题【Day09】充值日志SQL实战 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#…

MMDetection(五)

目标检测工具包 MMDetection MMDetection 可以做什么 ➢ MMDetection 提供 400 余个性能优良的预训练模型&#xff0c;开箱即 用&#xff0c;几行 Python API 即可调用强大的检测能力 ➢ MMDetection 涵盖 60 余个目标检测算法&#xff0c;并提供方便易用的 工具&#xff0c;…

【Spring Cloud】如何修改Feign的日志记录级别

本期目录前言1. 介绍2. 方式一&#xff1a;配置文件1&#xff09;全局生效2&#xff09;局部生效3. 方式二&#xff1a;Java代码1&#xff09;全局配置2&#xff09;局部配置前言 本次示例代码的文件结构如下图所示。 1. 介绍 Feign 允许我们自定义配置&#xff0c;下面是 …

kubernetes集群部署springcloud项目【AL】【未写完】

kubernetes集群部署springcloud项目【AL】 &#xff08;先手工做&#xff0c;非自动化&#xff09; #环境&#xff1a; 192.168.73.138 master 192.168.73.139 node1 192.168.73.140 node2 192.168.73.137 harbor、mysqlgit clone https://github.com/lizhenliang/simple-…

leetcode.1234 替换子串得到平衡字符串 - 反向滑动窗口

1234. 替换子串得到平衡字符串 题目&#xff1a; 有一个只含有 Q, W, E, R 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就是一个「平衡字符串」。 给你一个这样的字符串 s&#xff0c;请通过「替换…