简单的串口通信

来源:互联网 发布:python buffer函数 编辑:程序博客网 时间:2024/05/21 11:27

(3)在对话框中添加控件:向主对话框中添加通讯 控件、按钮、文本框、编辑框和组合框,其中部分属性如表3所示。  

 (4)初始化串口:

在OnInitDialog()函数中添加初始化串口参数的代码 

// TODO: Add extra initialization here 

if(m_ctrlComm.GetPortOpen()) 

  m_ctrlComm.SetPortOpen(FALSE); 

m_ctrlComm.SetCommPort(1); //选择com1 if( !m_ctrlComm.GetPortOpen())   m_ctrlComm.SetPortOpen(TRUE);//打开串口 

else  AfxMessageBox("cannot open serial port"); 

m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位  m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据 m_ctrlComm.SetRThreshold(16); //参数15表示每当串口接收缓冲区中有多于或等于15个字     符时将引发一个接收数据的OnComm事件

 m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 

m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 

(5)编写帧校验函数:

首先在CSCommTestDlg类中加入公共成员函数说明 

 BYTE PLCData[30];//定义输入数据存储区

  Void verfun(BYTE vdata[],int n);//定义校验函数  

然后写帧校验函数:

 void CSCommTestDlg::verfun(BYTE vdata[],int n) 

{    int i;    BYTE sum=vdata[0]; 

   for(i=1;i<=n-2;i++) 

      sum^=vdata[i];//计算校验码 

   vdata[n]=sum;//保存帧校验码

 } 

(6)为通讯控件IDC_MSComm1添加OnComm消息处理函数OnComm()  

  void CSCommTestDlg::OnComm()

 { 

VARIANT variant_inp;

 COleSafeArray safearray_inp;

 LONG len,k; BYTE rxdata[2048]; //设置BYTE数组(8位无符号整数)

 CString strtemp;

 if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 

{ variant_inp=m_ctrlComm.GetInput();//读缓冲区 

safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量

 len=safearray_inp.GetOneDimSize(); //得到有效数据长度

 for(k=0;k<len;k++) 

safearray_inp.GetElement(&&k,rxdata+k);//转换为BYTE型数组

 for(k=0;k<len;k++)//将数组转入存储区 

   PLCData[k]=rxdata[k]; 

verfun(PLCData,16);//计算校验码 

if(PLCData[15]==PLCData[16]) 

{ //接收数据正确发送确认信号  

m_ctrlComm.SetOutput(COleVariant("K@"));     //可以在下面自行加上对数据的处理

 if(!m_quit)//如果没有结束信号则续传数据 

  m_ctrlComm.SetOutput(COleVariant("C@")); 

  else  

 m_ctrlComm.SetOutput(COleVariant("Z@"));

 } 

else

 //接收数据出错要求重发数据 

m_ctrlComm.SetOutput(COleVariant("R@")); 

(7)为按钮IDC_BUTTON_START和IDC_BUTTON_QUIT添加消息处理函数OnButtonStart()和On ButtonQuit()

   void CSCommTestDlg::OnButtonQuit()  

  m_quit=TRUE;

 }  

void CSCommTestDlg::OnButtonStart()

 {   m_quit=FALSE;  

 m_ctrlComm.SetOutput(COleVariant("A@"));     //发送请求信号 

 }  

4 结束语     本文运用VC++和MFC开发了计算机与PLC的通讯系统,充分利用计算机和PLC本身的资源实现了上位机对PLC的实时监控,可以有效地对作业工具进行监控和管理。本文介绍的通讯系统用于超高压带电作业机器人的控制系统,实践表明,系统简练、稳定,取得了令人满意的效果。  参考文献: [1]朱正礼等.基于VC++的PLC与上位机的通讯.电气传动,2002(2). [2]西门子有限公司.西门子S7-200可编程序控制器系统手册,1999.