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

一、新建工程

打开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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值