1、其于 MFC 的串口调试助手编辑过程一、新建打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名 XXXX) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定” “取消” 及提示框)删除或修改使用,至此基本框架完成如下图:二、往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏 工程 添加到工程 Components and controls R
2、egistered 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 号,此编辑框 用于
4、接收显示数据的其 ID号为 IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取 ID 号一致), 再在此窗口的样式中勾选”多行” ,同时将 “自动水平滚动(T) ”勾选去掉,再勾选“垂直滚动(V) ”,此勾选操作是用于垂直多行显示的,按回车后即可输入; 同理右击另一编辑框输入 ID 号为 IDC_EDIT_TXDATA 此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加 ID 号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送” ,功能是按一次就把发送编辑框中的内容发送一次。C、为以上两个编辑
5、框添加变量,与串口通信控件一样添加,为 IDC_EDIT_RXDATA添加 CString 型变量 m_strRXData ;为 IDC_EDIT_TXDATA 添加 CString 型变量m_strTXData。说明: m_strRXData 和 m_strTXData 分别用来放入接收和发送的字符数据。D、添加串口事件消息处理函数 OnComm() 打开 ClassWizardMessage 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 8intte
7、rthat is not signed.CString strtemp;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_STR
8、ING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does 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);/打开软件
9、时串口选择框默认显示 COM1/ m_BaudRate_M.SetCurSel(0);/打开软件时波特率选择框默认显示 9600/ m_Date_Select_M.SetCurSel(0);/打开软件时数据位选择框默认显示 8/ m_StopBit_M.SetCurSel(0);/打开软件时停止位选择框默认显示 1提示 3:此句以下才是我们要添加的语句提示 4:此5 句是我们下面要用到的暂时可以不用理会/ m_ParityCheck_M.SetCurSel(0);/打开软件时奇偶校验选择框默认显示无校验 N/下面 if 语句用于打开默认串口/*/if(m_ctrlComm.GetPortOpe
10、n()m_ctrlComm.SetPortOpen(FALSE);/关闭串口m_ctrlComm.SetCommPort(1);/打开软件时默认使用 COM1 串口if(!m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(TRUE);/打开串口elseAfxMessageBox(“cannot open serial port“);/*/m_ctrlComm.SetSettings(“9600,n,8,1“);/打开软件时端口设置默认为波特率 9600,无校验位,8 位数据,1 位停止位m_ctrlComm.SetInputMode(1); /1:表
11、示以二进制方式检取数据m_ctrlComm.SetRThreshold(1); /参数 1 表示每当串口接收缓冲区中有多于或等于 1个字符时将引发一个接收数据的 OnComm 事件m_ctrlComm.SetInputLen(0); /设置当前接收区数据长度为 0m_ctrlComm.GetInput();/先预读缓冲区以清除残留数据return TRUE; / return TRUE unless you set the focus to a controlF、发送数据,先为发送按钮添加一个单击消息即 BN_CLICKED 处理函数,打开ClassWizardMessage Maps,选择
12、IDC_BUTTON_MANUALSEND,双击BN_CLICKED 添加 OnButtonManualsend()函数,并在函数中添加如下代码:代码段 3:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送数据此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作
13、。5、添加两个“ 组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:6、添加 5 个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:7、添加 5 个“组框”控件,效果如下图:逐一对各个组框属性编辑如下:串口号:常规 ID:IDC_COMBO_CommSelect 数据 输入列表框项目(N):COM1、COM2、COM3、COM4、COM5、COM6 、COM7 、COM8、COM9(注意每输入一个数据选项以 Ctrl+Enter 回车后再输入下一个数据选项)样式 将“分类勾选去掉”进入类向导添加变量,为 IDC_COMBO_CommSe
14、lect 添加一个 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 后,再添加一个 C
15、ontrol 类 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样式
16、将“分类勾选去掉”进入类向导添加变量,为 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 类 CComboBo
17、x 型变量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:OnSelchangeCOMBOCommSele
18、ct() / TODO: Add 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()/当要改变时则要先关闭串口才可以用按键进行打开,所以先判断当前串口是否打开/如果是打开的则先关闭m_ctrlComm.
19、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(IDC_COMBO_
20、BaudRate_Select)-提示 5:下面添加串口打开或关闭按钮后将用到此将用到此判断及以下语句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;cas
21、e 5: m_ctrlComm.SetSettings(“57600,“);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 添加处理函数程序代码如下:代码段
22、6:void CSCommTestDlg:OnSelchangeCOMBODateSelect() / 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.SetSetting
23、s(“,6,“);break;case 3: m_ctrlComm.SetSettings(“,5,“);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 handle
24、r code hereUpdateData(true);m_StopBit=(CComboBox*)GetDlgItem(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()