VC6.0MFC串口通信编写全过程.doc

上传人:小飞机 文档编号:4220215 上传时间:2023-04-10 格式:DOC 页数:17 大小:224KB
返回 下载 相关 举报
VC6.0MFC串口通信编写全过程.doc_第1页
第1页 / 共17页
VC6.0MFC串口通信编写全过程.doc_第2页
第2页 / 共17页
VC6.0MFC串口通信编写全过程.doc_第3页
第3页 / 共17页
VC6.0MFC串口通信编写全过程.doc_第4页
第4页 / 共17页
VC6.0MFC串口通信编写全过程.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《VC6.0MFC串口通信编写全过程.doc》由会员分享,可在线阅读,更多相关《VC6.0MFC串口通信编写全过程.doc(17页珍藏版)》请在三一办公上搜索。

1、其于MFC的串口调试助手编辑过程一、 新建打开VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图:此控件(标志)是下面步骤添加进来的串口控件二、 往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏 工程 添加到工程 Compone

2、nts and controls Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。基本框架2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑

3、框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:选择其中任意一个作为输入编辑框及输出编辑框这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。4、对以上四个控件编程步骤如下:a、右击串口通信控件 建立类向导 Member variables Control IDS中选择IDC_MSCOMM1 add variable Member variable name中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致) OK 确定b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其I

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

5、T_RXDATA添加CString型变量m_strRXData ;为IDC_EDIT_TXDATA添加CString型变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。D、添加串口事件消息处理函数OnComm() 打开ClassWizardMessage Maps,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()

6、函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下代码:提示1:此句以下才是我们要添加的语句代码段1:void CScommTestDlg:OnComm() / TODO: Add your control notification handler code hereVARIANT variant_inp;/定义一个VARIANT类对象COleSafeArray safearray_inp;/定义一个COleSafeArray对象LONG len,k;BYTE rxdata2048;/设置BYTE数组 AN 8intterthat is not signed.CString st

7、rtemp;if (m_ctrlComm.GetCommEvent()=2)/事件值为2表示接收缓冲区内有数据/以下你可以根据自己的通信协议加入处理代码variant_inp=m_ctrlComm.GetInput();/读缓冲区safearray_inp=variant_inp;/VARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize();for(k=0;klen;k+)safearray_inp.GetElement(&k,rxdata+k);/转换为BYTE型数组提示2:此三句是下面用于是否是十六进制发送的,暂时可以不用理

8、会for(k=0;klen;k+)/将数组转换为Cstring型变量BYTE bt=*(char*)(rxdata+k);/if(m_ctrlHexSend.GetCheck()/如果是HEX显示则转为16进制/strtemp.Format(%02x ,bt);/将16进制数送入临时变量strtemp存放/elsestrtemp.Format(%c,bt);/将字符送入临时变量strtemp存放m_strRXData+=strtemp;/加入接收编辑框对应字符串UpdateData(FALSE);/更新编辑框内容(主要是接收编辑框中的)到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开

9、串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:E、打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg:OnInitDialog()打开串口,加入如下代码:代码段2:BOOL CSCommTestDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in t

10、he system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);提示3:此句以下才是我们要添加的语句/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is

11、not a dialog提示4:此5句是我们下面要用到的暂时可以不用理会SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here/m_ComboBox.SetCurSel(0);/打开软件时串口选择框默认显示COM1/m_BaudRate_M.SetCurSel(0);/打开软件时波特率选择框默认显示9600/m_Date_Select_M.SetCurSel(0);/打开软件时数据位选择框默认显示8/m_StopBit_M

12、.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);/打开串口elseAfxMessageBox(cannot open seri

13、al port);/*/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); /设置当前接收区数据长度为0m_ctrlComm.GetInput();/先预读缓冲区以清除残留数据return TRUE; / return T

14、RUE unless you set the focus to a controlF、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizardMessage Maps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:代码段3:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑

15、框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送数据此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:6、添加5个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:7、添加5个“组框”控件,效果如下图:逐一对各个组框属性编辑如下:串口号:常规 ID:IDC_COMBO_CommSelect 数据 输入列表框项目(N):COM1、COM2、COM3、COM4、COM5、CO

16、M6、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样式 将“分类勾选去掉”进入类向导添加变量,为I

17、DC_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

18、: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类C

19、ComboBox型变量m_ParityCheck_M点击OK最后“确定”说明:以上数据配置添加的Control类CComboBox型变量可能用不到,但value类必须为int型8、为各个列表框添加处理函数:A、在建立类向导中Message Maps ,object IDs中选中IDC_COMBO_CommSelect再在Messages中选中CBN_SELCHANG双击后单击OK,再在Member funtions中双击刚才生成的函数进入程序编辑页面,添加程序代码如下:代码段4:void CSCommTestDlg:OnSelchangeCOMBOCommSelect() / TODO: Ad

20、d your control notification handler code herem_Index=(CComboBox*)GetDlgItem(IDC_COMBO_CommSelect)-GetCurSel();/当前选中的行(CComboBox*)GetDlgItem(IDC_COMBO_CommSelect)-SetCurSel(m_Index);/设置当前选中的行的内容为显示的内容if(m_ctrlComm.GetPortOpen()/当要改变时则要先关闭串口才可以用按键进行打开,所以先判断当前串口是否打开提示5:下面添加串口打开或关闭按钮后将用到此将用到此判断及以下语句/如果是

21、打开的则先关闭m_ctrlComm.SetPortOpen(FALSE);/关闭串口SetDlgItemText(IDC_BUTTON1,打开串口);/将打开或关才按钮改为打开串口显示状态B、同理为IDC_COMBO_BaudRate_Select添加处理函数程序代码如下:代码段5:void CSCommTestDlg:OnSelchangeCOMBOBaudRateSelect() / TODO: Add your control notification handler code hereUpdateData(true);m_BaudRate=(CComboBox*)GetDlgItem(

22、IDC_COMBO_BaudRate_Select)-GetCurSel();/当前选中的行/*/根据当前选中的值进行波特率设置/*/switch(m_BaudRate)case 1: m_ctrlComm.SetSettings(14400,);break;case 2: m_ctrlComm.SetSettings(19200,);break;case 3: m_ctrlComm.SetSettings(38400,);break;case 4: m_ctrlComm.SetSettings(56000,);break;case 5: m_ctrlComm.SetSettings(5760

23、0,);break;case 6: m_ctrlComm.SetSettings(115200,);break;case 7: m_ctrlComm.SetSettings(128000,);break;case 8: m_ctrlComm.SetSettings(256000,);break;default:m_ctrlComm.SetSettings(9600,);break;/*/UpdateData(false);C、同理为IDC_COMBO_Date_Select添加处理函数程序代码如下:代码段6:void CSCommTestDlg:OnSelchangeCOMBODateSele

24、ct() / TODO: Add your control notification handler code hereUpdateData(true);m_Date_Select=(CComboBox*)GetDlgItem(IDC_COMBO_Date_Select)-GetCurSel();/当前选中的行/*/*/switch(m_Date_Select)case 1: m_ctrlComm.SetSettings(,7,);break;case 2: m_ctrlComm.SetSettings(,6,);break;case 3: m_ctrlComm.SetSettings(,5,

25、);break;case 4: m_ctrlComm.SetSettings(,4,);break;default:m_ctrlComm.SetSettings(,8,);break;/*/UpdateData(false);D、同理为IDC_COMBO_StopBit添加处理函数程序代码如下:代码段6:void CSCommTestDlg:OnSelchangeCOMBOStopBit() / TODO: Add your control notification handler code hereUpdateData(true);m_StopBit=(CComboBox*)GetDlgIt

26、em(IDC_COMBO_StopBit)-GetCurSel();/当前选中的行/*/*/switch(m_StopBit)case 1: m_ctrlComm.SetSettings(,2);break;default:m_ctrlComm.SetSettings(,1);break;/*/UpdateData(false);E、同理为IDC_COMBO_ParityCheck添加处理函数程序代码如下:代码段7:void CSCommTestDlg:OnSelchangeCOMBOParityCheck() / TODO: Add your control notification han

27、dler code hereUpdateData(true);m_ParityCheck=(CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck)-GetCurSel();/当前选中的行/*/*/switch(m_ParityCheck)case 1: m_ctrlComm.SetSettings(,O,);break;case 2: m_ctrlComm.SetSettings(,O,);break;default:m_ctrlComm.SetSettings(,N,);break;/*/UpdateData(false);此时应将代码段2:提示4中所指的那

28、5个语句前的“/”删除9、串口添加打开或关闭按钮以同样的方式添加按钮,并将标题修改为“关闭串口”字样,为此按钮添加处理函数程序代码如下:代码段8:void CSCommTestDlg:OnButton1Start() /检查是否改变默认的串口值,没有改变m_Index的值是0的,否则则不为0if(m_Index0)/串口的默认值没有改变switch(m_ctrlComm.GetPortOpen()/点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作case 1:/*关闭串口前先将自动发送功能关闭*/SetDlgItemText(IDC_BUTTON_AutoSend,自动发送);/更改

29、按键指示KillTimer(1);/*/当前串口是打开的则进行关串口操作m_ctrlComm.SetPortOpen(FALSE);/关闭串口SetDlgItemText(IDC_BUTTON1,打开串口);/更改按键指示UpdateData(FALSE);/更新按键状态break;case 0:/当前串口是关闭的则进行开串口操作m_ctrlComm.SetCommPort(1);/如果要打开串口则应先选择哪个串口m_ctrlComm.SetPortOpen(TRUE);/打开串口SetDlgItemText(IDC_BUTTON1,关闭串口);/更改按键指示UpdateData(FALSE)

30、;break;default : AfxMessageBox(cannot open or close serial port);else/串口的默认值有改变switch(m_ctrlComm.GetPortOpen()/点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作case 0:/当前串口是关闭的则进行开串口操作m_ctrlComm.SetCommPort(m_Index+1);/如果要打开串口则应先选择哪个串口m_ctrlComm.SetPortOpen(TRUE);/打开串口SetDlgItemText(IDC_BUTTON1,关闭串口);/更改按键指示UpdateData(

31、FALSE);/更新按键状态break;case 1: /*关闭串口前先将自动发送功能关闭*/SetDlgItemText(IDC_BUTTON_AutoSend,自动发送);/更改按键指示KillTimer(1);/*/当前串口是打开的则进行关串口操作m_ctrlComm.SetPortOpen(FALSE);SetDlgItemText(IDC_BUTTON1,打开串口);UpdateData(FALSE);break;default : AfxMessageBox(cannot open serial port);if(m_IndexSetCurSel(0);/如果没有另外进行串口选择则

32、显示COM1if(m_BaudRateSetCurSel(0);/如果没有另外进行波特率选择则显示9600if(m_Date_SelectSetCurSel(0);/如果没有另外进行数据位选择则显示8if(m_StopBitSetCurSel(0);/如果没有另外进行停止位选择则显示1if(m_ParityCheckSetCurSel(0);/如果没有另外进行校验位选择则显示没有校验位N10、添加自动发送功能:A、添加一个“编辑框”控件,此控件用于获取自动发送的时间间隔的,修改其ID为IDC_EDIT_Timer,为其添加一个value类UINT型变量m_TimerB、添加一个“按钮”控件,修

33、改其ID为IDC_BUTTON_AutoSend修改其标题为“自动发送”C、添加一个“按钮”控件,修改其ID为IDC_BUTTON_StopAutoSend修改其标题为“停止自动发送”D、为“自动发送”按钮添加BN_CLICKED处理函数,程序代码如下:代码段9:void CSCommTestDlg:OnBUTTONAutoSend() UpdateData(TRUE);if(m_Timer=0)/判断是否设置自动发送时间间隔AfxMessageBox(请设置自动发送时间间隔);else if(!m_ctrlComm.GetPortOpen()/判断是否打开串口AfxMessageBox(请打

34、开串口);elseSetDlgItemText(IDC_BUTTON_AutoSend,自动发送.);/更改按键指示SetTimer(1,m_Timer,NULL);E、为“停止自动发送”按钮添加BN_CLICKED处理函数,程序代码如下:代码段9:void CSCommTestDlg:OnBUTTONStopAutoSend() / TODO: Add your control notification handler code hereSetDlgItemText(IDC_BUTTON_AutoSend,自动发送);/更改按键指示KillTimer(1);F、因为要设置自发送,所以要添加一

35、个Windows定时函数,步骤如下:进入类向导,Message Maps中的Object IDs中选择CScommTestDlg再选择Messages中的WM_TIMER,进入TIMER函数后,添加如下程序代码如下:代码段10:void CSCommTestDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultUpdateData(TRUE);if(m_ctrlHexSend.GetCheck()CByteArray hexdate;int len=String2Hex(

36、m_strTXData,hexdate);m_ctrlComm.SetOutput(COleVariant(hexdate);elsem_ctrlComm.SetOutput(COleVariant(m_strTXData);CDialog:OnTimer(nIDEvent);11、十六进制数据发送及接收显示添加一个“复选框”控件,修改ID为IDC_CHECK_HexSend,标题为“HEX发送”,进入类向导添加control类CButton型变量,变量名为m_ctrlHexSend,然后为为SCommTestDlg类添加以下两个PUBLIC成员函数,在Class view中右击CCommTe

37、stDlg选中Add Member Function 然后在函数类型中输入“int”,在函数描述中输入“String2Hex(CString str, CByteArray &senddate)”然后确定。编辑函数体如下:代码段11:int CSCommTestDlg:String2Hex(CString str, CByteArray &senddate)int hexdate,lowhexdate;int hexdatelen=0;int len=str.GetLength();senddate.SetSize(len/2);for(int i=0;i=len)break;lstr=stri;hexdate=ConvertHexChar(hstr);lowhexdate=ConvertHexChar(lstr);if(hexdate=16)|(lowhexdate=16)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号