串口调试助手"/>
CVI 串口调试助手
基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:
#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;
}
更多推荐
CVI 串口调试助手
发布评论