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

基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:https://blog.csdn.net/Stark_/article/details/129003839

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

#define MAX_BUF_NUM 512

static int panelHandle;	   //主界面句柄

int comSelect = 0;   //串口号
int status;
int ComState = 0;  //串口开关状态
char info[MAX_BUF_NUM+1]; //串口数据缓冲区
//设置页面控件状态,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;	
}

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;
	DimObject(0);
	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:
				QuitUserInterface (0);//关闭面板0(主面板)
			break;
	}
	return 0;
}

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;
}

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;
}

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;
}

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;
}

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;
		case EVENT_TIMER_TICK:

			break;
	}
	return 0;
}

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
LabWindows CVI是一种强大的图形化编程软件,通常用于数据采集、仪器控制和自动化测试等领域。而西门子S7-1200是一种先进的工业自动化控制器,用于控制多种设备和系统。 要实现LabWindows CVI与西门子S7-1200之间的通讯,可以采用以下步骤: 1. 确定通讯协议:LabWindows CVI支持多种通讯协议,如Modbus、OPC等。确定S7-1200支持的通讯协议,并根据需要选择适合的协议。 2. 配置通讯参数:LabWindows CVI提供了一些函数和工具用于设置通讯参数,如IP地址、端口号等。根据S7-1200的网络配置和通讯协议的要求,进行适当的配置。 3. 建立连接:使用LabWindows CVI提供的库函数,通过网络连接与S7-1200建立通讯。通常需要提供S7-1200的IP地址和端口号。 4. 通讯数据交互:根据通讯协议的要求,使用LabWindows CVI提供的函数来读取和写入S7-1200的数据。可以通过读取S7-1200的PLC变量值,或者设定S7-1200的输出状态等。 5. 断开连接:在通讯完成后,通过LabWindows CVI提供的函数断开与S7-1200的连接,释放资源。 在配置LabWindows CVI和S7-1200通讯时,需要了解LabWindows CVI的编程知识和S7-1200的通讯协议。可以参考相关的LabWindows CVI和S7-1200的文档和教程,以了解更多关于通讯配置和编程的细节。 综上所述,通过以上步骤和相关的LabWindows CVI和S7-1200的文档,可以成功实现LabWindows CVI与西门子S7-1200之间的通讯。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值