开发真空测量与控制系统
开发真空测量与控制系统
VC++下用MSComm控件实现PG500真空计与PC机的通讯
0、引言
上海玉川真空有限技术公司推出的PG500+DM100AC真空计产品是可以和PC机、PLC、单片机系统、组态软件--组态王等上位机进行通讯的。本文建立PG500真空计与PC机的通讯,可以实现真空计的压力值显示、远程操作、状态控制、数据处理等功能。本文介绍了在基于对话框的MFC应用程序中应用MSComm控件编程实现PG500真空计串口与PC机串口的控制代码,并加入了测量数据的数据库处理(如将真空计压力数值记录在Excel表格中等)。
1、硬件连接
PG500真空计的通讯接口为RS-485串行接口,而PC机上为RS-232-C串口,所以事前准备好了RS-485与RS-232-C的转换器,连接方式如右图
2、软件代码
这里总结一下用MSComm控件进行串口编程的基本步骤:
- 在建立的工程中插入MSComm控件
- 添加MSComm控件ID的控制变量或对象
- 对串口进行初始化,设置MSComm控件的属性
- 添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据 处理代码
- 编写串口发送等其他代码
- 关闭串口
2.1、创建工程并添加MSComm控件
建立首先打开VC 6.0,建立一个基于对话框的MFC应用程序:PG500。在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。
2.2、初始化串口:设置MSComm控件的属性
在CPG500Dlg::OnInitDialog()函数中写入对串口的初始化语句:
//串口初始化
m_DM100Comm.SetCommPort(1);//选择COM1
m_DM100Comm.SetInputMode(1);//输入方式为二进制方式
m_DM100Comm.SetInBufferSize(1024);//设置输入缓冲区大小
m_DM100Comm.SetOutBufferSize(512);//设置输出缓冲区大小
m_DM100Comm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
if (!m_DM100Comm.GetPortOpen())//如果串口没有打开则打开
m_DM100Comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("串口已打开或不存在");
m_DM100Comm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_DM100Comm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读
m_DM100Comm.GetInput();//先预读缓冲区以清除残留数据
2.3、添加串口事件消息处理函数
MSComm控件一般用事件驱动方式来从串口接收数据,也就是消息处理,当串口有时间发生时,程序调用消息函数来处理数据。
void CDM100Dlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT m_input;
COleVariant nyVar;
char* str;
if(m_DM100Comm.GetCommEvent()==2)//事件值为2表示接收缓冲区
{
int l = m_DM100Comm.GetInBufferCount();
if(l > 0)
{
nyVar.Attach(m_DM100Comm.GetInput());//读缓冲区
m_input=nyVar;//VARIANT型变量转换为ColeSafeArray型变量
str = (char*)(unsigned char*)m_input.parray->pvData;//字符型
}
str[l]='\0';
if(str[0]==':')
{
m_zstrtmp=_T("");
}
m_zstrtmp+=(const char*)str;
if(str[l-1]==0x0D)
{
if (m_bShowData)//已发送数据
{
m_strtmp=m_zstrtmp;
m_strfinal=GetShowMode();//显示压力值的单位以及压力数据显示方式
if (m_strtmp.Mid(3,2)=="1D")//
{
m_nCount1++;
m_strRecv1=m_strfinal;
if (m_bExcelSave)//存入Excel表格的数据
{
m_time=m_time.GetCurrentTime();
m_SampleArray.Add(m_time.Format("%H:%M:%S"));
m_SampleArray.Add(m_strRecv1);
}
UpdateData(FALSE);
}
else if (m_strtmp.Mid(3,2)=="2D")
m_strRecv2=m_strfinal;
else if (m_strtmp.Mid(3,2)=="1R")
m_strExpo1=m_strfinal;
else if (m_strtmp.Mid(3,2)=="2R")
m_strExpo2=m_strfinal;
else if (m_strtmp.Mid(3,2)=="3R")
m_strExpo3=m_strfinal;
UpdateData(FALSE);
}
m_zstrtmp.Empty();
}
}
}
2.4、发送数据
为发送按钮添加一个单击响应函数,添加如下代码
void CDM100Dlg::OnCheckCycleSend1() //向PG500配置的DM100显示屏1通道循环发送数据
{
// TODO: Add your control notification handler code here
if (m_bAutoSend2)
{
m_ctrlCycleSend2.SetCheck(0);
KillTimer(2);
}
if (m_ctrlCycleSend1.GetCheck())
{
m_bAutoSend1=TRUE;
((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow(FALSE);
SetTimer(1,m_nCycleTime1,NULL);
}
else
{
m_bAutoSend1=FALSE;
((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow();
KillTimer(1);
}
}
void CDM100Dlg::OnCheckCycleSend2() //向PG500配置的DM100显示屏2通道循环发送数据
{
// TODO: Add your control notification handler code here
if (m_bAutoSend1)
{
m_ctrlCycleSend1.SetCheck(0);
KillTimer(1);
}
if (m_ctrlCycleSend2.GetCheck())
{
m_bAutoSend2=TRUE;
((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow(FALSE);
SetTimer(2,m_nCycleTime2,NULL);
}
else
{
m_bAutoSend2=FALSE;
((CButton*)GetDlgItem(IDC_BTN_PORT_OPEN))->EnableWindow();
KillTimer(2);
}
}
定时器消息处理函数代码如下:
void CDM100Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case 1:
OnBtnShow1();//1通道发送一次数据
break;
case 2:
OnBtnShow2();//2通道发送一次数据
break;
case 3:
SetWindowText(m_strCaption.Mid(0,13+m_ncaption));
if(m_ncaption<(m_strCaption.GetLength()+1))
m_ncaption++;
else
m_ncaption=0;
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
3、结束语
使用以上代码可以通过PC机实现PG500真空计的远程设置、压力显示、状态控制、数据处理等过程。
注:以上代码为PG500真空计与PC机通讯的主干代码,另有大部分函数原型由于文字限制在本文中未写出。 真空测量软件开发可联系仇小姐,电话:021-61526449,分机号8002