VS2013工控机间通信

VS2013工控机间通信2018.10.17

一、页面布局及加入控件

1, 安装好vs2013如图


2, 新建一个基于VC++MFC项目MSCOMM


注意:点击确定,然后下一步,这时候要将应用程序类型改成基于对话框

接着下一步到最后一个对话框是将生成的类改成CCommDlg,然后完成

4, 将新生成的项目的对话框默认dialog edit删去,如图

5,点开右边工具箱,在对话框中加入两个Static Text,两个Edit Control,两个Button。更改属性外观—Caption

成品图例如以下

6,加入comm控件

右键空白位置,插入ActiveX控件,选择Microsoft Communication Control, version 6.0(SP6),点击确定。如果你的电脑没有这个选项,说明你的VS2013没完全安装。CSDN有解决办法。

这时候对话框会出现一个电话图标,可能有一半白边去不了。这时候右击电话图标点击编辑控件就能够去掉了。如下图

7,定义各个控件ID 和属性

右键需要更改的控件,属性

杂项里,ID,直接修改,两个编辑框ID IDC_receive, IDC_send

小电话,IDC_MMSCOMM1

两个按钮,发送:IDOK,退出: IDCANCEL

8添加横条滚动和多行显示

对于Send编辑框,行为里的MutilineWant return,外观里的Horizontal Scroll改为True,对于receive编辑框,行为里的Mutiline,外观里的Horizontal Scroll改为True

得到对话框如图

9, 加入成员变量。右击对话框,点击类向导,点击成员变量标签。选中须要加入的id,双击就可以加入

依次为下表中的ID加入变量

控件号:IDC_MSCOMM1     变量类型:CMSComm     变量名:m_ctrlcomm

控件号:IDC_receive         变量类型:CString        变量名:m_strReceive

控件号:IDC_send           变量类型:CString        变量名:m_strSend

控件号:IDC_send           变量类型:CEidt          变量名:m_ctrlSend

DC_send弄了两个,只需要再次双击IDC_send就可以,只是两次选择的类别不一样,如下图:

如果,IDC_MSCOMM1控件在标签中没有,则在生成的对话框中右击comm控件点击添加变量就可以


9, mscomm,两个button加入响应事件,切换到class wizardvirtual function双击控件ID,加入响应事件,默认就可以,也可改为自己想要的标题

comm控件加入响应事件可能双击不了(我就是遇到这样的问题)。这时候仅仅要右击comm控件图标。点击添加事件处理程序就可以。如上图

这时候基本界面已经布置好了。开始加入代码了。

二、代码加入

1、找到解决方式(solution explorer)的sources files点开,双击当中的mscommDlg.cpp我们的全部代码将加入到这个源文件里

2、进行串口初始化及其它串口设置

将下面代码加入到oninitialdialog函数(复制粘贴)

m_ctrlcomm.put_CommPort(3);//选择com3
m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//
输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//
设置串口参数:9600波特率。无奇偶校验。8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//
打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//
预读缓冲区以清空残留数据
m_ctrlcomm.put_CommPort(3);//选择com3
m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//
输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//
设置串口参数:9600波特率,无奇偶校验,8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//
打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//
预读缓冲区以清空残留数据
3、实现发送button,退出button对应的响应函数

void CmscommDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here

CDialogEx::OnOK();
UpdateData(1);//
读取编辑框内容
m_ctrlcomm.put_Output(COleVariant(m_strSend));//发送数据
}
void CmscommDlg::OnBnClickedExit()
{
// TODO: Add your control notification handler code here

m_ctrlcomm.put_PortOpen(0);//关闭串口
CDialog::OnCancel();//退出程序
}

4、实现MSComm控件对应的响应函数OnOnCommMsComm1()

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];//
设置byte数组
CString strtemp;
if(m_ctrlcomm.get_CommEvent()==2)//
事件2表示接受缓冲区有字符
{
variant_inp=m_ctrlcomm.get_Input();//
读缓冲区
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++){//将数组转换成CString型变量
BYTE bt=*(char *)(rxdata+k);//字符型
strtemp.Format((char) bt);//将字符送入暂时变量strtemp存放
m_strReceive+=strtemp;//增加接收编辑框对应字符串
}
}
UpdateData(0);//
更新编辑框内容

5、编译执行程序

在调试执行时。必须两台机子同一时候执行此程序。而且都要开启同一个串口号

亲测,按照流程一定没有问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章