版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录:1. 建立项目2. 在项目中插入 MSCom控件3. 利用ClassWizard定义CMSCon#控制变量4. 在对话框中添加控件5. 添加串口事件消息处理函数OnComm()6. 打开和设置串口参数7. 发送数据8. 发送十六进制字符9. 在接收框中以十六进制显示10. 如何设置自动发送11. 什么是VARIANTS据类型?如何使用 VARIANTS据类型?在众多网友的支持下,串口调试助手从2001年5月21日发布至今,短短一个月, 在全国各地累计下载量近5000人次,在近200多个电子邮件中,20多人提供了 使用测试意见,更有50多位朋友提出要串口调试助手的源代码,为了答谢谢朋 友们
2、的支持,公开推出我最初用VC控件MSCom编写串口通信程序的源代码,并 写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序 吧, 我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编 程任务了。(也许本文过于详细,高手就不用看)开始吧:1.建立项目:打开VC+ + 6.0,建立一个基于对话框的 MFC应用程序SCommTesK与我源代码 一致,等会你会方便一点);2.在项目中插入 MSCom控件选择 Project 菜单下 Add To Project 子菜单中的 Componentsand Controls, 选项,在弹出的对话框中双击Register
3、ed ActiveX Con trols项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择MicrosoftCommunications Control, version 6.0,单击 Insert 按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到MicrosoftCom mun icatio ns Con trol, version 6.0,那可能是你在安装 VC6时没有把ActiveX 一项选上,重新安装 VC6选上ActiveX就可以了),这时在ClassView视窗中就可以看到 CMSConim了,(注意:此类在Clas
4、sWizard 中看不到,重构clw文件也一样),并且在控件工具栏 Controls中出现了电话 图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行 后,这个图标是看不到的。ControlESgl1!函K1F1 日ffl國 kabl区囲拿噪鬥題彩3.利用ClassWizard定义CMSCom类控制对象打开 ClassWizard >Member Viariables 选项卡,选择 CSCommTestDI类,为 IDC_MSC0MM1加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件 中自动加入了 AFX_INCLUDES() #include &quo
5、t;mscomm.h" /AFX_INCLUDES(这时运行程序,如果有错,那就再从头开始)。4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA 另一个用于输入发送数据,ID为IDC_EDIT_TXDATA再添加一个按钮,功能是 按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSE别忘记了将接收编辑框的 Properties >Styles 中把 Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上 Miltiline 。再打开 ClassW
6、izard >MembeViariables 选项卡,选择 CSCommTestDI类,为 IDC_EDIT_RXDAT添力卩 CString 变量 m_strRXData, 为 IDC_EDIT_TXDAT添力卩 CString 变量 m_strTXData。说明:m_strRXData 和 m_strTXData 分别用来放入 接收和发送的字符数据。一一休息一会吧?我们天天与电脑打交道,要注意保重,我现在在单杠上做引体向上可以来40次,可我都32 了,佩服吗? 兰。好了,再接着来,下面是关键了:5.添加串口事件消息处理函数 OnComm()打开 ClassWizard >Mes
7、sageMaps选择类 CSCommTestDl,选择 IDC_MSCOM,1 双击消息On Comm将弹出的对话框中将函数名改为 On Comm (好记而已)OK这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个 串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我 们在On Comm函数加入相应的处理代码就能实现自已想要的功能了。请你在函 数中加入如下代码:void CSCommTestDIg: :On Comm()/ TODO: Add your con trol no tificati on han dler code hereVARIANT vari
8、a nt_in p;COIeSafeArray safearray_i np;LONG le n,k;BYTE rxdata2048; / 设置 BYTE数组 An 8-bit integerthat is not sig ned.CStri ng strtemp;if(m_ctrlComm.GetCommEvent()=2)/事件值为2表示接收缓冲区内有字符_ /varia nt_in p=m_ctrlComm.Getl nput(); / safearray_i np=varia nt_inp; /VARIANT ColeSafeArray 型变量len=safearray_i np.Ge
9、t On eDimSize(); / for(k=0;k<le n;k+)safearray_i np.GetEleme nt(&k,rxdata+k);/ for(k=0;k<le n;k+) /将数组转换为以下你可以根据自己的通信协议加入处理代码读缓冲区 型变量转换为得到有效数据长度转换为BYTE型数组Cstring型变量字符型/将字符送入临时变量strtemp存放 加入接收编辑框对应字符串BYTE bt=*(char*)(rxdata+k); / strtemp.Format("%c",bt); m_strRXData+=strtemp; /Upd
10、ateData(FALSE); /更新编辑框内容到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运 行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:6.打开串口和设置串口参数你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的 处理函数中打开串口。现在我们在主对话框的 CSCommTestDlg:O nln itDialog() 打开串口,加入如下代码:/ TODO: Add extra initialization here if(m_ctrlComm.GetPortOpe n()m_
11、ctrlComm.SetPortOpe n(FALSE);m_ctrlComm.SetCommPort(1); / 选择 coml if( !m_ctrlComm.GetPortOpe n() m_ctrlComm.SetPortOpen(TRUE);/ 打开串口 elseAfxMessageBox("ca nnot ope n serial port");m_ctrlComm.SetSettings("9600,n,8,1"); /波特率 9600,无校验,8 个数据位,1个停止位m_ctrlComm.Set In putMode(1); /1:表示以
12、二进制方式检取数据m_ctrlComm.SetRThreshold(1);/参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的On Com事件m_ctrlComm.Set In putLe n(0); /设置当前接收区数据长度为 0m_ctrlComm.Getl nput();先预读缓冲区以清除残留数据 现在你可以试试程序了,将串口线接好后( 不会接?去看看我写的 串口接线基 本方法),打开串口调试助手,并将串口设在com2,选上自动发送,也可以等 会手动发送。再执行你编写的程序,接收框里应该有数据显示了。7. 发送数据先为发送按钮添加一个单击消息即 BN_CLICKE处
13、理函数,打开ClassWizard>Message Maps 选择类 CSCommTestD,选择 IDC_BUTTON_MANUALSEND 击BN_CLICKE添力卩OnButtonManualsend()函数,并在函数中添加如下代码:void CSCommTestDlg:O nButto nMan ualse nd()/ TODO: Add your con trol no tificati on han dler code here UpdateData(TRUE); /读取编辑框内容m_ctrlComm.SetOutput(COIeVaria nt(m_strTXData);发
14、送数据厂一运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另 一端的串口调试助手(或别的调试工具)接收框里出现了什么。如果你真是初次涉猎串口编程,又一次成功,那该说声谢谢我了,因为我第一 次做串口程序时可费劲了,那时网上的资料也不好找。开开玩笑,谢谢你的支 持,有什么好东西别忘了给我寄一份。最后说明一下,由于用到 VC控件,在没有安装VC的计算机上运行时要从 VC中 把 mscomm32.ocxmsvcrt.dll 、mfc42.dll 拷到 Windows目录下的 System 子目 录中(win2000为System32)并再进行注册设置,在主对话框中加入一个复选接钮,
15、ID 为 IDC_CHECK_HEXSECNaDption: 十六进制 发送,再利用 ClassWizard 为其添加控制变量: m_ctrlHexSend ;在ClassView中为SCommTestDI咲添加以下两个PUBLIC成员函数,并输入 相应代码 ;/ 由于这个转换函数的格式限制, 在发送框中的十六制字符应该每两个字符之间 插入一个空隔/ 如:A1 23 45 0B 00 29/CByteArray是一个动态字节数组,可参看 MSD帮助int CSCommTestDlg:String2Hex(CString str, CByteArray &senddata)int hex
16、data,lowhexdata;int hexdatalen=0;int len=str.GetLength();senddata.SetSize(len/2);for(int i=0;i<len;)char lstr,hstr=stri;if(hstr=' ')i+;continue;i+;if(i>=len)break;lstr=stri;hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;elsehexdata=hexd
17、ata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSize(hexdatalen);return hexdatalen;/ 这是一个将字符转换为相应的十六进制值的函数/好多C语言书上都可以找到/ 功能:若是在 0-F 之间的字符,则转换为相应的十六进制字符,否则返回 -1 char CSCommTestDlg:Co nvertHexChar(char ch)if(ch>='0')&&(ch<='9')return ch-0x30;
18、else if(ch>='A')&&(ch<='F')return ch-'A'+10;else if(ch>='a')&&( ch<='f)return ch-'a'+10;else return (-1);再将 CSCommTestDlg:OnButtonManualsend()修改成以下形式:void CSCommTestDlg:O nButto nMan ualse nd()/ TODO: Add your con trol no tifica
19、ti on han dler code hereUpdateData(TRUE); /读取编辑框内容if(m_ctrlHexSe nd.GetCheck()CByteArray hexdata;int len=String2Hex(m_strTXData,hexdata); /此处返回的 len 可以用于计算发送了多少个十六进制数m_ctrlComm.SetOutput(COIeVaria nt(hexdata); /发送十六进制数据elsem_ctrlComm.SetOutput(COIeVariant(m_strTXData);发送 ASCII 字符数据现在,你先将串口线接好并打开串口调试
20、助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框 中应该可以看到00 01 02 03 A1 CC 了。9.在接收框中以十六进制显示这就容易多了:在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAYCaption:十六进制显示,再利用 ClassWizard为其添加控制变量: m_ctrlHexDiaplay。然后修改 CSCommTestDlg:OnComm函数:void CSCommTestDlg: :On Comm()/ TOD
21、O: Add your con trol no tificati on han dler code hereVARIANT varia nt_in p;COleSafeArray safearray_i np;LONG le n,k;BYTE rxdata2048; / 设置 BYTE数组 An 8-bit integerthat is not signed.CStri ng strtemp;if(m_ctrlComm.GetCommEve nt()=2) / _varia nt_in p=m_ctrlComm.Getl nput(); / safearraynp=varia nt_inp;
22、/VARIANT len=safearray_i np.Get On eDimSize(); /事件值为2表示接收缓冲区内有字符读缓冲区型变量转换为ColeSafeArray型变量得到有效数据长度for(k=0;k<le n;k+)safearray_inp.GetElement(&k,rxdata+k);转换为 BYTE型数组for(k=0;k<len;k+) /将数组转换为Cstring型变量BYTE bt=*(char*)(rxdata+k); / 字符型 if(m_ctrlHexDisplay.GetCheck() strtemp.Format("%02X
23、 ",bt); /将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔elsestrtemp.Format("%c",bt); /将字符送入临时变量strtemp存放m_strRXData+=strtemp; / 加入接收编辑框对应字符串厂UpdateData(FALSE); /更新编辑框内容测试:在串口调试助手发送框中输入 00 01 02 03 A1 CC等十六进制字符,并选 上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示, 在串 口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03
24、A1 CC 了。10.如何设置自动发送最简单的设定自动发送周期是用SetTimer()函数,这在数据采集中很有用,在控制中指令的传送也可能用到定时发送。方法是:在 ClassWizard中选上 MessageMa卡,然后在 Objects IDs 选中 CSCommTestDI类,再在 Messages框中选上 WM_TIME消息,单击 ADD_FUNCTION 加入 void CSCommTestDlg:OnTimer(UINT nIDEvent) 函数,这个函数是放入“时间到”后要处理的代码:void CSCommTestDlg: :On Timer(UINT nIDEve nt)/ TO
25、DO: Add your message han dler code here an d/or call default On ButtonManualsend();CDialog:O nTimer( nIDEve nt);再在在主对话框中加入一个复选接钮,ID为IDC_CHECK_AUTOSEND Captio自动发送(周期1秒),再利用ClassWizard为其添加BN_CLICK消息处理函数void CSCommTestDlg:O nCheckAutose nd(): void CSCommTestDlg: :On CheckAutose nd()/ TODO: Add your con trol no tificati on han dler code here m_bAutoSe nd=!m_bAutoSe nd;if(m_bAutoSe nd) _SetTimer(1,1000,NULL); 时间为 1000 毫秒 else KillTimer(1); /取消定时其中:m_bAutoSend为 BOO型变量,在 CLASSVIE中为 CSCommT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度安全生产责任与激励机制责任合同书范本2篇
- 二零二五年度新型腻子材料销售代理合同2篇
- 二零二五年度定制化纯电动汽车租赁定制合同2篇
- 二零二五年度二手空调销售与技术支持服务合同
- 二零二五年度房地产项目教育地产投资合同3篇
- 2025版水电安装与维护专业兼职合同3篇
- 思考引领青春无畏
- 化脓性中耳炎的护理查房
- 动静脉内瘘病人护理课件
- 二零二五年医疗护理机构护工服务合同范例3篇
- 2024年06月上海广发银行上海分行社会招考(622)笔试历年参考题库附带答案详解
- 2024-2025学年六上科学期末综合检测卷(含答案)
- 数字图像处理-第2章-数字图像处理基础课件
- 矿山档案(台帐) 表格参照模板参考范本
- 《机械设备维护与保养》课程标准
- 圆管钢立柱柱吊装施工方案
- 河南省对口升学文秘类专业课试题卷
- 医疗器械经营质量管理体系文件(全套)
- 磷酸铁锂电池工商业储能项目施工组织设计方案
- 建筑节能分部工程质量验收报告(样本)
- 泌尿外科护理疑难病例讨论
评论
0/150
提交评论