欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PDF文档下载
     

    VC6.0MFC串口通信编写全过程要点.pdf

    • 资源ID:5198401       资源大小:449.54KB        全文页数:17页
    • 资源格式: PDF        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    VC6.0MFC串口通信编写全过程要点.pdf

    其于 MFC 的串口调试助手编辑过程 一、新建 打开 VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存 工程位置)工程名称(输入工程名XXXX )确定选择基本对话框下一 步下一步下一步选择( CXXXXDlg )完成确定在生成的基 本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修 改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再 将控件添加到基本框内使用,步骤如下: 菜单栏工程添加到工程Components and controlsRegistered ActiveX Controls 选择“ Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为 “十” 形,在基本框架内随意划取一矩 形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后 此控件是看不到的,步骤结果如下图: 此控件 (标志) 是下面步 骤添加进 来的串口 控件 基 本 框 架 3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控 件列表框内的 “编辑框控件” ,以相同的操作即可添加两个编辑窗口及一个按纽控件如 下图所示: 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示, 上图是运行后的效果。 4、对以上四个控件编程步骤如下: a、右击串口通信控件建立类向导Member variables Control IDS 中选 择 IDC_MSCOMM1 add variableMember variable name 中输入控件变量名 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() 打开 ClassWizardMessage Maps,选择 IDC_MSCOMM1, 双击消息OnComm, 将弹出的对话框中将函数名改为OnComm,(好 记而已) OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接 收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在 OnComm() 函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下代码: 代码段 1: void CScommTestDlg:OnComm() / TODO: Add your control notification handler code here VARIANT variant_inp;/定义一个 VARIANT类对象 COleSafeArray safearray_inp;/ 定义一个COleSafeArray 对象 LONG len,k; BYTE rxdata2048;/ 设置 BYTE 数组AN 8 intterthat is not signed. CString 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;kAppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(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.SetCurSel(0);/ 打开软件时停止位选择框默认显示1 / m_ParityCheck_M.SetCurSel(0);/ 打开软件时奇偶校验选择框默认显示无校验N 提示3:此句以下才 是 我 们 要 添 加 的 语 句 提示 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(“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.SetInputLen(0); / 设置当前接收区数据长度为0 m_ctrlComm.GetInput(); / 先预读缓冲区以清除残留数据 return TRUE; / return TRUE unless you set the focus to a control F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED 处理函数,打开 ClassWizard Message Maps ,选择 IDC_BUTTON_MANUALSEND ,双击 BN_CLICKED 添加 OnButtonManualsend()函数,并在函数中添加如下代码: 代码段 3: void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code here 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、在建立类向导中Message Maps ,object IDs中选中 IDC_COMBO_CommSelect再 在 Messages 中选中 CBN_SELCHANG 双击后单击OK, 再在 Member funtions中双击刚才生 成的函数进入程序编辑页面,添加程序代码如下: 代码段 4: void CSCommTestDlg:OnSelchangeCOMBOCommSelect() / TODO: Add your control notification handler code here 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: void CSCommTestDlg:OnSelchangeCOMBOBaudRateSelect() / TODO: Add your control notification handler code here UpdateData(true); m_BaudRate=(CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select)-GetCurSel();/ 提示 5:下面 添 加 串 口 打 开 或 关 闭 按 钮 后 将 用 到 此 将 用 到 此 判 断 及 以 下 语句 /当前选中的行 /*/ /根据当前选中的值进行波特率设置 /*/ 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_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 here UpdateData(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,“); 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 here UpdateData(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() / TODO: Add your control notification handler code here UpdateData(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 中所指的那 5 个语句前的“ /”删除 9、串口添加打开或关闭按钮 以同样的方式添加按钮,并将标题修改为“关闭串口”字样,为此按钮添加处理函 数程序代码如下: 代码段 8: void CSCommTestDlg:OnButton1Start() /检查是否改变默认的串口值,没有改变m_Index 的值是 0 的,否则则不为 0 if(m_IndexSetCurSel(0);/ 如果没有另外进 行串口选择则显示COM1 if(m_BaudRateSetCurSel(0);/ 如果没有另 外进行波特率选择则显示9600 if(m_Date_SelectSetCurSel(0);/ 如果没有另外进 行数据位选择则显示8 if(m_StopBitSetCurSel(0);/ 如果没有另外进行停 止位选择则显示1 if(m_ParityCheckSetCurSel(0);/ 如果没有另外进 行校验位选择则显示没有校验位N 10、添加自动发送功能: A、添加一个“编辑框”控件,此控件用于获取自动发送的时间间隔的,修改其ID 为 IDC_EDIT_Timer ,为其添加一个 value 类 UINT 型变量 m_Timer B、添加一个“按钮”控件,修改其ID 为 IDC_BUTTON_AutoSend 修改其标题为 “自动发送” C、添加一个“按钮”控件,修改其ID 为 IDC_BUTTON_StopAutoSend 修改其标 题为“停止自动发送” D、为“自动发送”按钮添加BN_CLICKED 处理函数,程序代码如下: 代码段 9: void CSCommTestDlg:OnBUTTONAutoSend() UpdateData(TRUE); if(m_Timer=len) break; lstr=stri; hexdate=ConvertHexChar(hstr); lowhexdate=ConvertHexChar(lstr); if(hexdate=16)|(lowhexdate=16) break; else hexdate=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') else return (-1); 再将 CSCommTestDlg:OnButtonManualsend()修改成以下形式: 代码段 13: void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code here if(!m_ctrlComm.GetPortOpen()/判断是否打开串口 AfxMessageBox(“请打开串口 “); else UpdateData(TRUE); if(m_ctrlHexSend.GetCheck()/判断是否是自动发送 CByteArray hexdate; int len=String2Hex(m_strTXData,hexdate); m_ctrlComm.SetOutput(COleVariant(hexdate); else m_ctrlComm.SetOutput(COleVariant(m_strTXData); 在接收框中以十六进制显示 将代码段1,提示 2 的三句程序代码前的“/ ”去掉即可。 至此,基本功能已完成,编译运行程序是否能实现各功能,如果出错,则细仔改正,再通过添加“组 合框”控件或“静态文本”可以添加相应提示,再由菜单栏中的布局内的各种功能选择可以实现将各 控件整齐排列效果如下: 12 、保存数据功能 添加一个按钮控件,ID 为 IDC_BUTTON_SaveData ,标题为:保存数据,添加两个“复选框” 控件,一个ID 为 IDC_CHECK_HEXSave,标题为: HEX 保存,另一个ID 为 IDC_CHECK_BCDSave , 标题为: BCD 保存,选择HEX 保存则保存的数据为十六进制数据,选择BCD 保存则保存的数据为十 进制数据, 但不可两都同时选择,再为两个复选框选添加两个 control 类 CButton 型变量,一个变 量名为:m_HEXSave, 另一个为 m_BCDSave; 为 “保存数据”按钮添加一个 BN_CLICKED 函数;另外再为为 SCommTestDlg类添加以下两个PUBLIC成员函数,此函数只要用于十六进制 与十进制数据之间的转换,函数类型为 CString, 函数描述为 HEX_To_BCD(CString HexData), 函数体如下: 代码段 13: 再为“保存数据”按钮添,的BN_CLICKED 函数添加函数体,代码如下: 代码段 14: 13:清除数据: 添加一个“清除数据”按钮控件,ID 为 IDC_BUTTON_CleanRXData ,标题为:清 空数据区,添加一个BN_CLICKED 函数,函数体代码如下: 代码段 14: void CSCommTestDlg:OnBUTTONCleanRXData() / TODO: Add your control notification handler code here m_strRXData.Empty(); UpdateData(FALSE); 至此其串口调试助手其本功能已全部实现,编译程序运行后效果如下:

    注意事项

    本文(VC6.0MFC串口通信编写全过程要点.pdf)为本站会员(tbuqq)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开