一、新建工程
打开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 Name | Label | Callback Function |
---|---|---|---|
Panel | PANEL | 串口调试(By塔克Tark)(https://blog.csdn.net/Stark_?spm=1000.2115.3001.5343) | PanelMain |
Ring | COMSELECT | 串口号 | |
Ring | BAUDSELECT | 波特率 | |
Ring | CHECKSELECT | 校验位 | |
Ring | LONGSELECT | 数据位 | |
Ring | STOPSELECT | 停止位 | |
Command Button | OPEN_COM | 打开串口 | ComOpen |
LED | LED | LED | LED |
Command Button | CLOSE_COM | 打开串口 | ComClose |
Text Box | RECIVETEXT | 接收区 | |
Text Box | SENDTEXT | 发送区 | |
Timer | TIMER | Timer | Timer |
Command Button | CLEARRECEIVE | 清空接收 | ClearTextBox |
Command Button | SEND | 发送 | Send |
Command Button | CLEARSEND | 清空发送 | 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