在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.安装好VS2010,网上很多人说使用VC6.0的mscomm32.ocx控件,下载并注册,注册过程看上去还很复杂。我是使用VS2010自带的控件,因此没有这些过程,只需要安装好VS2010就行了。2.建立“基于对话框”的MFC工程,命名为CommTest,应用程序类型选择“基于对话框”建立好的工程如下图所示。3.删除默认的“确定”,“取消”按钮和静态文本框“TODO:在此放置对话框控件”,添加如下对话框控件:①“打开串口”按钮,添加方法为从右侧“工具箱”拖放一个“Button”到对话框,并在右侧“属性”卡中修改“Caption”为“打开串口”,修改“ID”为“IDC_BUTTON_OPEN”。②“关闭串口”按钮,添加方法为从右侧“工具箱”拖放一个“Button”到对话框,并在右侧“属性”卡中修改“Caption”为“关闭串口”,修改“ID”为“IDC_BUTTON_CLOSE”。③“发送”按钮,添加方法为从右侧“工具箱”拖放一个“Button”到对话框,并在右侧“属性”卡中修改“Caption”为“发送”,修改“ID”为“IDC_BUTTON_SEND”。④“发送编辑框”。⑤“接受编辑框”4.添加串口通信控件。在对话框上“右键”对话框右下角(默认在左上角)的电话图标就是串口控件。5.给控件添加变量在控件(电话图标)上“右键”命名为m_mscomm,点击完成,工程中会自动添加“mscomm.h”和“mscomm.cpp”两个文件。6.给两个编辑框添加成员变量7.添加三个按钮的事件直接“双击”三个按钮,在CommTestDlg.cpp文件中会增加如下几个函数:voidCCommTestDlg::OnBnClickedButtonSend(){//TODO:在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?}voidCCommTestDlg::OnBnClickedButtonOpen(){//TODO:在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?}voidCCommTestDlg::OnBnClickedButtonClose(){//TODO:在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?}消息映射已经自动关联。8.添加串口控件的事件处理程序。点击“添加编辑”即可,在CommTestDlg.cpp文件中会增加函数:voidCCommTestDlg::OnCommMscomm1(){//TODO:在¨²此ä?处ä|添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?}数据接收将在此函数中进行。9.打开串口及串口设置。voidCCommTestDlg::OnBnClickedButtonOpen(){//TODO:在此添加控件通知处理程序代码if(m_mscomm.get_PortOpen())//如果串口是打开的,则行关闭串口{m_mscomm.put_PortOpen(FALSE);}m_mscomm.put_CommPort(1);//选择COM1m_mscomm.put_InBufferSize(1024);//接收缓冲区m_mscomm.put_OutBufferSize(1024);//发送缓冲区m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取m_mscomm.put_InputMode(1);//以二进制方式读写数据m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件m_mscomm.put_Settings(_T(9600,n,8,1));//波特率9600无检验位,8个数据位,1个停止位if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开{m_mscomm.put_PortOpen(TRUE);//打开串口AfxMessageBox(_T(串口1打开成功));}else{m_mscomm.put_OutBufferCount(0);AfxMessageBox(_T(串口1打开失败));}}10.添加关闭串口按钮的消息响应函数voidCCommTestDlg::OnBnClickedButtonClose(){//TODO:在此添加控件通知处理程序代码m_mscomm.put_PortOpen(FALSE);//关闭串口AfxMessageBox(_T(串口1已关闭));}11.添加发送按钮消息响应函数voidCCommTestDlg::OnBnClickedButtonSend(){//TODO:在此添加控件通知处理程序代码UpdateData(true);//读取编辑框内容m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据m_EditSend.Empty();//发送后清空输入框UpdateData(false);//更新编辑框内容}12.接收数据voidCCommTestDlg::OnCommMscomm1(){//TODO:在此处添加消息处理程序代码staticunsignedintcnt=0;VARIANTvariant_inp;COleSafeArraysafearray_inp;longlen,k;unsignedintdata[1024]={0};byterxdata[1024];//设置BYTE数组CStringstrtemp;if(m_mscomm.get_CommEvent()==2)//值为2表示接收缓冲区内有字符{cnt++;variant_inp=m_mscomm.get_Input();//读缓冲区消息safearray_inp=variant_inp;///变量转换len=safearray_inp.GetOneDimSize();//得到有效的数据长度for(k=0;klen;k++){safearray_inp.GetElement(&k,rxdata+k);}for(k=0;klen;k++)//将数组转换为CString型变量{strtemp.Format(_T(%x),*(rxdata+k));m_EditReceive+=strtemp;CStringtemp=_T(\r\n);//换行m_EditReceive+=temp;}}UpdateData(FALSE);//更新编辑框内容}接收到的数据存放在byte型数组rxdata[1024]中,再进行进一步处理,此处只是以16进制显示出来。结束。说明(自己的理解):上面是基于事件驱动型的串口通信方式,感觉事件驱动与中断类似,但绝对不是中断,每一次响应事件的时候接收缓冲区的数据的长度不是固定的。例如:我的下位机发送了10个BYTE的数据,第一次上位机响应的时候只接收到8个,第二次响应时接收到另外两个。并不是每收到一个数据就响应一次。下图是测试结果:接收到的是字母‘a’,‘b’,……‘j’10个字母,显示出来的是他们的16进制数。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功