VC60MFC串口通信编写全过程(DOC)_第1页
VC60MFC串口通信编写全过程(DOC)_第2页
VC60MFC串口通信编写全过程(DOC)_第3页
VC60MFC串口通信编写全过程(DOC)_第4页
VC60MFC串口通信编写全过程(DOC)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——VC60MFC串口通信编写全过程(DOC)其于MFC的串口调试助手编辑过程

一、新建

开启VC6.0文件新建工程MFCAppWiard(exe)位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提醒框(自动生成的“确定〞“取消〞及提醒框)删除或修改使用,至此基本框架完成如下图:

基本框架

二、往生成的基本框架中添加控件

1、由于控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:

菜单栏工程添加到工程Componentsandcontrols…RegisteredActiveXControls选择“MicrosoftCommunicationsControl,version6.0〞Insert确定OK关闭此子窗口完成添加操作标志如上图所示。2、将方才添加添加到控件列表框内的串口控件添加到基本框架内点击控件列表框内的串口控件,此时光标变为“十〞形,在基本框架内随意划取一矩

形区域,即可以添加串口控件,不需要修改此控件的大小及位置,由于程编译运行后此控件是看不到的,步骤结果如下图:

此控件(标志)是下面步骤添加进来的串口控件

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件〞,以一致的操作即可添加两个编辑窗口及一个按纽控件如下图所示:

选择其中任意一个作为输入编辑框及输出编辑框

这两个窗口需要修改大小及位置,由于程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。

4、对以上四个控件编程步骤如下:

a、右击串口通信控件建立类向导MembervariablesControlIDS中选择IDC_MSCOMM1addvariable…Membervariablename中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK确定

b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其ID号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选〞多行〞,同时将“自动水平滚动(T)〞勾选去掉,再勾选“垂直滚动(V)〞,此勾选操作是用于垂直多行显示的,按回车后即可输入;同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1〞改为“发送〞,功能是按一次就把发送编辑框中的内容发送一次。

C、为以上两个编辑框添加变量,与串口通信控件一样添加,为IDC_EDIT_RXDATA添加CString型变量m_strRXData;为IDC_EDIT_TXDATA添加CString型变量m_strTXData。说明:m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。

D、添加串口事件消息处理函数OnComm()开启ClassWizard->MessageMaps,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们方才添加的函数就会执行,我们在OnComm()函数参与相应的处理代码就能实现自已想要的功能了。在函数中参与如下代码:

提醒1:此句以下voidCScommTestDlg::OnComm()

才是我们要添加{

的语句//TODO:Addyourcontrolnotificationhandlercodehere

VARIANTvariant_inp;//定义一个VARIANT类对象

COleSafeArraysafearray_inp;//定义一个COleSafeArray对象LONGlen,k;

BYTErxdata[2048];//设置BYTE数组AN8—intterthatisnotsigned.CStringstrtemp;

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

////以下你可以根据自己的通信协议参与处理代码variant_inp=m_ctrlComm.GetInput();//读缓冲区

safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize();for(k=0;kAppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically提醒3:此句以下才//whentheapplication'smainwindowisnotadialog是我们要添加的语SetIcon(m_hIcon,TRUE);//Setbigicon句SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:Addextrainitializationhere//m_ComboBox.SetCurSel(0);//开启软件时串口选择框默认显示COM1

//m_BaudRate_M.SetCurSel(0);//开启软件时波特率选择框默认显示9600//m_Date_Select_M.SetCurSel(0);//开启软件时数据位选择框默认显示8//m_StopBit_M.SetCurSel(0);//开启软件时中止位选择框默认显示1

//m_ParityCheck_M.SetCurSel(0);//开启软件时奇偶校验选择框默认显示无校验N

提醒4:此5句是我们下面要用到的暂时可以不用搭理//下面if语句用于开启默认串口

/************************************************************/if(m_ctrlComm.GetPortOpen()){

m_ctrlComm.SetPortOpen(FALSE);//关闭串口}

m_ctrlComm.SetCommPort(1);//开启软件时默认使用COM1串口if(!m_ctrlComm.GetPortOpen()){

m_ctrlComm.SetPortOpen(TRUE);//开启串口}else{

AfxMessageBox(\}

/*************************************************************/

m_ctrlComm.SetSettings(\开启软件时端口设置默认为波特率9600,无校验位,8位数据,1位中止位

m_ctrlComm.SetInputMode(1);//1:表示以二进制方式检取数据

m_ctrlComm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}

F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,开启ClassWizard->MessageMaps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:

代码段3:

voidCSCommTestDlg::OnButtonManualsend(){

//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//读取编辑框内容

m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据

}

此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。

5、添加两个“组框〞或“静态文本〞控件,调整位置及大小,在标师处输入提醒文字,这两个控件不用编程,效果如下图:

6、添加5个“静态文本〞控件并由属性修改其标题,均不用编程,效果如下图:

7、添加5个“组框〞控件,效果如下图:

逐一对各个组框属性编辑如下:串口号:

常规ID:IDC_COMBO_CommSelect数据输入列表框项目(N):COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9(注意每输入一个数据选项以Ctrl+Enter回车后再输入下一个数据选项)

样式将“分类勾选去掉〞

进入类向导添加变量,为IDC_COMBO_CommSelect添加一个value类int型变量m_Index,点击OK后,再添加一个Control类CComboBox型变量m_ComboBox点击OK最终“确定〞

波特率:常规ID:IDC_COMBO_BaudRate_Select

数据输入列表框项目(N):9600、14400、19200、38400、56000、57600、115200、128000、256000

样式将“分类勾选去掉〞

进入类向导添加变量,为IDC_COMBO_BaudRate_Select添加一个value类int型变量m_BaudRate点击OK后,再添加一个Control类CComboBox型变量m_BaudRate_M点击OK最终“确定〞数据位:常规ID:IDC_COMBO_Date_Select数据输入列表框项目(N):8、7、6、5、4

样式将“分类勾选去掉〞

进入类向导添加变量,为IDC_COMBO_Date_Select添加一个value类int型变量m_Date_Select点击OK后,再添加一个Control类CComboBox型变量m_Date_Select_M点击OK最终“确定〞

中止位:常规ID:IDC_COMBO_StopBit数据输入列表框项目(N):1、2

样式将“分类勾选去掉〞

进入类向导添加变量,为IDC_COMBO_StopBit添加一个value类int型变量m_StopBit点击OK后,再添加一个Control类CComboBox型变量m_StopBit_M点击OK最终“确定〞奇偶校验位:

常规ID:IDC_COMBO_ParityCheck数据输入列表框项目(N):N、O、E、样式将“分类勾选去掉〞

进入类向导添加变量,为IDC_COMBO_ParityCheck添加一个value类int型变量m_ParityCheck点击OK后,再添加一个Control类CComboBox型变量m_ParityCheck_M点击OK最终“确定〞

说明:以上数据配置添加的Control类CComboBox型变量可能用不到,但value类必需为int型

8、为各个列表框添加处理函数:A、在建立类向导中MessageMaps,objectIDs中选中IDC_COMBO_CommSelect再在Messages中选中CBN_SELCHANG双击后单击OK,再在Memberfuntions中双击方才生成的函数进入程序编辑页面,添加程序代码如下:

代码段4:

voidCSCommTestDlg::OnSelchangeCOMBOCommSelect(){

//TODO:Addyourcontrolnotificationhandlercodehere

m_Index=((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->GetCurSel();//当前选中的行

((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->SetCurSel(m_Index);//设置当前选中的行的内容为显示的内容

if(m_ctrlComm.GetPortOpen())//当要改变时则要先关闭串口才可以用按键进行开启,所以先判断当前串口是否开启{//假使是开启的则先关闭m_ctrlComm.SetPortOpen(FALSE);//关闭串口}

SetDlgItemText(IDC_BUTTON1,\开启串口\将开启或关才按钮改为\开启串口\显示状态}

B、同理为IDC_COMBO_BaudRate_Select添加处理函数程序代码如下:代码段5:

voidCSCommTestDlg::OnSelchangeCOMBOBaudRateSelect(){

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(true);

m_BaudRate=((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select))->GetCurSel();/

提醒5:下面添加串口开启或关闭按钮后将用到此将用到此判断及以下语句/当前选中的行

////***********************************************************////根据当前选中的值进行波特率设置

///************************************************************/switch(m_BaudRate){

case1:m_ctrlComm.SetSettings(\break;

case2:m_ctrlComm.SetSettings(\break;

case3:m_ctrlComm.SetSettings(\break;

case4:m_ctrlComm.SetSettings(\break;

case5:m_ctrlComm.SetSettings(\break;

case6:m_ctrlComm.SetSettings(\break;

case7:m_ctrlComm.SetSettings(\break;

case8:m_ctrlComm.SetSettings(\break;

default:m_ctrlComm.SetSettings(\break;}

//*************************************************////UpdateData(false);}

C、同理为IDC_COMBO_Date_Select添加处理函数程序代码如下:代码段6:

voidCSCommTestDlg::OnSelchangeCOMBODateSelect(){

//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);

m_Date_Select=((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->GetCurSel();//当前选中的行

///*******************************************************************************/

///********************************************************************************/

switch(m_Date_Select){

case1:m_ctrlComm.SetSettings(\break;

case2:m_ctrlComm.SetSettings(\break;

case3:m_ctrlComm.SetSettings(\break;

case4:m_ctrlComm.SetSettings(\break;

default:m_ctrlComm.SetSettings(\break;}

//***********************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论