VC6.0MFC串口通信编写全过程精编版.doc_第1页
VC6.0MFC串口通信编写全过程精编版.doc_第2页
VC6.0MFC串口通信编写全过程精编版.doc_第3页
VC6.0MFC串口通信编写全过程精编版.doc_第4页
VC6.0MFC串口通信编写全过程精编版.doc_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

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

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

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

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

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

6、函数就会执行,我们在 OnComm()函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下代码:代码段 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 8 intterthat is not signed.CSt

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

8、ement(&k,rxdata+k);/ 转换为 BYTE 型数组for(k=0;klen;k+)/将数组转换为Cstring 型变量BYTE bt=*(char*)(rxdata+k);/if(m_ctrlHexSend.GetCheck()/如果是 HEX 显示则转为16 进制/strtemp.Format(%02x ,bt);/将 16 进制数送入临时变量strtemp 存放/else3strtemp.Format(%c,bt);/ 将字符送入临时变量strtemp 存放m_strRXData+=strtemp;/ 加入接收编辑框对应字符串UpdateData(FALSE);/ 更新编辑

9、框内容(主要是接收编辑框中的)到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然, 你肯定哪儿没看仔细,因为我是打开 VC6 对照着做一步写一行的,运行试试。没错吧?那么做下一步:E、打开串口和设置串口参数你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的提示 4:此 5 句是我们下面要用到的暂时可以不用理会CSCommTestDlg:OnInitDialog()打开串口,加入如下代码:代码段 2:BOOL CSCommTestDlg:OnInitDialog()CDialog:OnInit

10、Dialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog.The framework doe

11、s this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here/m_ComboBox.SetCurSel(0);/ 打开软件时串口选择框默认显示COM1提示 3:此句以下才是我们要添加的语句/m_BaudRate_M.SetCurSel(0);/ 打开软件时波特率选择框默认显示9600/m_

12、Date_Select_M.SetCurSel(0);/ 打开软件时数据位选择框默认显示8/m_StopBit_M.SetCurSel(0);/ 打开软件时停止位选择框默认显示1/m_ParityCheck_M.SetCurSel(0);/ 打开软件时奇偶校验选择框默认显示无校验N4/ 下面 if 语句用于打开默认串口/*/if(m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(FALSE);/ 关闭串口m_ctrlComm.SetCommPort(1);/ 打开软件时默认使用 COM1 串口 if(!m_ctrlComm.GetPortOpen()

13、m_ctrlComm.SetPortOpen(TRUE);/ 打开串口elseAfxMessageBox(cannot open serial 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.SetInput

14、Len(0);/ 设置当前接收区数据长度为0m_ctrlComm.GetInput(); / 先预读缓冲区以清除残留数据return TRUE;/ return TRUEunless you set the focus to a controlF、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard Message Maps ,选择 IDC_BUTTON_MANUALSEND ,双击 BN_CLICKED 添加 OnButtonManualsend() 函数,并在函数中添加如下代码:代码段 3:void CSCommTestDlg:OnButtonM

15、anualsend()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送数据此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。5 、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:56 、添加 5 个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:7 、添加 5 个“组

16、框”控件,效果如下图:6逐一对各个组框属性编辑如下:串口号:常规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 : ID

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

18、 5、 4样式 将“分类勾选去掉”进入类向导添加变量,为IDC_COMBO_Date_Select 添加一个 value 类 int 型变量m_Date_Select 点击 OK 后,再添加一个 Control 类 CComboBox 型变量 m_Date_Select _M 点击 OK 最后“确定”7停止位:常规 ID : IDC_COMBO_StopBit数据 输入列表框项目(N): 1、 2样式 将“分类勾选去掉”进 入 类 向 导添 加 变 量 , 为IDC_COMBO_StopBit添 加一 个value类int型 变 量m_StopBit点击 OK 后,再添加一个Control 类

19、 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 、为

20、各个列表框添加处理函数:A、在建立类向导中 Message Maps , object IDs 中选中 IDC_COMBO_CommSelect 再在 Messages 中选中 CBN_SELCHANG 双击后单击 OK,再在 Member funtions 中双击刚才生成的函数进入程序编辑页面,添加程序代码如下:代码段 4:void CSCommTestDlg:OnSelchangeCOMBOCommSelect()/ TODO: Add your control notification handler code herem_Index=(CComboBox*)GetDlgItem(IDC

21、_COMBO_CommSelect)-GetCurSel();/ 当前选中的行(CComboBox*)GetDlgItem(IDC_COMBO_CommSelect)-SetCurSel(m_Index);/ 设 置 当前选中的行的内容为显示的内容if(m_ctrlComm.GetPortOpen()/ 当要改变时则要先关闭串口才可以用按键进行打开,所以先判断当前串口是否打开/ 如果是打开的则先关闭m_ctrlComm.SetPortOpen(FALSE);/关闭串口SetDlgItemText(IDC_BUTTON1, 打开串口 );/ 将打开或关才按钮改为打开串口 显示状态B、同理为 ID

22、C_COMBO_BaudRate_Select添加处理函数程序代码如下:代码段 5:void CSCommTestDlg:OnSelchangeCOMBOBaudRateSelect()/ TODO: Add your control notification handler code hereUpdateData(true);m_BaudRate=(CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select)-GetCurSel();/提示 5:下面添加串口打开或关闭按钮后将用到此将用到此判断及以下语句8/当前选中的行/*/根据当前选中的值进行波特率设置/

23、*/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(57600,);break;case 6: m_ctrlComm.SetSettings(115200,);break;case 7: m

24、_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:OnSelchangeCOMBODateSelect()/ TODO: Add your control notification handler code hereUpda

25、teData(true);m_Date_Select=(CComboBox*)GetDlgItem(IDC_COMBO_Date_Select)-GetCurSel() ;/ 当前选中的行/* */*/switch(m_Date_Select)9case 1: m_ctrlComm.SetSettings(,7,);break;case 2: m_ctrlComm.SetSettings(,6,);break;case 3: m_ctrlComm.SetSettings(,5,);break;case 4: m_ctrlComm.SetSettings(,4,);break;default:m

26、_ctrlComm.SetSettings(,8,);break;/*/UpdateData(false);D、 同理为 IDC_COMBO_StopBit添加处理函数程序代码如下:代码段 6:void CSCommTestDlg:OnSelchangeCOMBOStopBit()/ TODO: Add your control notification handler code here UpdateData(true);m_StopBit=(CComboBox*)GetDlgItem(IDC_COMBO_StopBit)-GetCurSel();/ 当前 选中的行/* */*/switch

27、(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()10/ TODO: Add your control notification handler code here UpdateData(true);m_ParityCheck=(C

28、ComboBox*)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 中所指的那 5 个语句前的“ /”删除9、串口添加打开或关闭按钮以同样的方式添加按钮,并将

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

30、则进行关串口操作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);break;default : Afx

31、MessageBox(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(FALSE);/更新按键状态br

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

33、f(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、添加一个“按钮

34、”控件,修改其 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()/判断是否打开

35、串口AfxMessageBox(请打开串口 );elseSetDlgItemText(IDC_BUTTON_AutoSend, 自动发送 .);/ 更改按键指示SetTimer(1,m_Timer,NULL);13E、为“停止自动发送”按钮添加BN_CLICKED 处理函数, 程序代码如下:代码段 9:void CSCommTestDlg:OnBUTTONStopAutoSend()/ TODO: Add your control notification handler code here SetDlgItemText(IDC_BUTTON_AutoSend, 自动发送 );/ 更改按键指示

36、KillTimer(1);F、因为要设置自发送,所以要添加一个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 default UpdateData(TRUE);if(m_ctrlHexSend.GetChec

37、k()CByteArray hexdate;int len=String2Hex(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 ,然后为为

38、SCommTestDlg类 添 加 以 下 两 个 PUBLIC 成 员 函 数 , 在 Class view 中 右击CCommTestDlg选中 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=s

39、tr.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)break;elsehexdate=hexdate*16+lowhexdate;i+;senddatehexdatelen=(char)hexdate;hexdatelen+;senddate.SetSize(hexdatelen);return hexdatelen;再添加别一个 CCommTestDlg添加两个成员函数,在函数类型中输入“ char”,在函数描述中输入“ ConvertHexChar(char ch)”然后确定。编辑函数体如下:代码段 12:char CSCommTestDlg:ConvertHexChar(char ch)if(ch=0)&(ch=A)&(ch=a)&(ch

温馨提示

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

最新文档

评论

0/150

提交评论