VCMFC串口通信编写全过程.docx
- 文档编号:29575897
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:28
- 大小:158.53KB
VCMFC串口通信编写全过程.docx
《VCMFC串口通信编写全过程.docx》由会员分享,可在线阅读,更多相关《VCMFC串口通信编写全过程.docx(28页珍藏版)》请在冰豆网上搜索。
VCMFC串口通信编写全过程
其于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;k { safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 } for(k=0;k { BYTEbt=*(char*)(rxdata+k); //if(m_ctrlHexSend.GetCheck())//如果是HEX显示则转为16进制 //strtemp.Format("%02x",bt);//将16进制数送入临时变量strtemp存放 //else strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放 m_strRXData+=strtemp;//加入接收编辑框对应字符串 } } UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的) } 到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。 没错吧? 那么做下一步: E、打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。 现在我们在主对话框的CSCommTestDlg: : OnInitDialog()打开串口,加入如下代码: 代码段2: BOOLCSCommTestDlg: : OnInitDialog() { CDialog: : OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu! =NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(! strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog 提示4: 此5句是我们下面要用到的暂时可以不用理会 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 //下面if语句用于打开默认串口 /************************************************************/ if(m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(FALSE);//关闭串口 } m_ctrlComm.SetCommPort (1);//打开软件时默认使用COM1串口 if(! m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(TRUE);//打开串口 } else { AfxMessageBox("cannotopenserialport"); } /*************************************************************/ m_ctrlComm.SetSettings("9600,n,8,1");//打开软件时端口设置默认为波特率9600,无校验位,8位数据,1位停止位 m_ctrlComm.SetInputMode (1);//1: 表示以二进制方式检取数据 m_ctrlComm.SetRThreshold (1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 returnTRUE;//returnTRUEunlessyousetthefocustoacontrol } F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->MessageMaps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码: 代码段3: voidCSCommTestDlg: : OnButtonManualsend() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(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())//当要改变时则要先关闭串口才可以用按键进行打开,所以先判断当前串口是否打开 提示5: 下面添加串口打开或关闭按钮后将用到此将用到此判断及以下语句 {//如果是打开的则先关闭 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();//当前选中的行 ////***********************************************************/ ///根据当前选中的值进行波特率设置 ///************************************************************/ switch(m_BaudRate) { case1: m_ctrlComm.SetSettings("14400,,,"); break; case2: m_ctrlComm.SetSettings("19200,,,"); break; case3: m_ctrlComm.SetSettings("38400,,,"); break; case4: m_ctrlComm.SetSettings("56000,,,"); break; case5: m_ctrlComm.SetSettings("57600,,,"); break; case6: m_ctrlComm.SetSettings("115200,,,"); break; case7: m_ctrlComm.SetSettings("128000,,,"); break; case8: m_ctrlComm.SetSettings("256000,,,"); break; default: m_ctrlComm.SetSettings("9600,,,"); break; } //*************************************************//// UpdateData(false); } C、同理为IDC_COMBO_Date_Select添加处理函数程序代码如下: 代码段6: voidCSCommTestDlg: : OnSelchangeCOMBODateSelect() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(true); m_Date_Select=((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->GetCurSel();//当前选中的行 ///*******************************************************************************/ ///********************************************************************************/ switch(m_Date_Select) { case1: m_ctrlComm.SetSettings(",,7,"); break; case2: m_ctrlComm.SetSettings(",,6,"); break; case3: m_ctrlComm.SetSettings(",,5,"); break; case4: m_ctrlComm.SetSettings(",,4,"); break; default: m_ctrlComm.SetSettings(",,8,"); break; } //*********************************************************************************// UpdateData(false); } D、同理为IDC_COMBO_StopBit添加处理函数程序代码如下: 代码段6: voidCSCommTestDlg: : OnSelchangeCOMBOStopBit() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(true); m_StopBit=((CComboBox*)GetDlgItem(IDC_COMBO_StopBit))->GetCurSel();//当前选中的行 ///*******************************************************************************/ ///********************************************************************************/ switch(m_StopBit) { case1: m_ctrlComm.SetSettings(",,,2"); break; default: m_ctrlComm.SetSettings(",,,1"); break; } //*********************************************************************************// UpdateData(false); } E、同理为IDC_COMBO_ParityCheck添加处理函数程序代码如下: 代码段7: voidCSCommTestDlg: : OnSelchangeCOMBOParityCheck() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(true); m_ParityCheck=((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->GetCurSel();//当前选中的行 ///*******************************************************************************/ ///********************************************************************************/ switch(m_ParityCheck) { case1: m_ctrlComm.SetSettin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VCMFC 串口 通信 编写 全过程