文档详情

串口调试助手编写过程

小***
实名认证
店铺
DOC
51KB
约9页
文档ID:159505397
串口调试助手编写过程_第1页
1/9

目录:1建立项目2.在项目中插入 MSComm 控件3.利用 ClassWizard 定义 CMSComm 类控制变量4.在对话框中添加控件5.添加串口事件消息处理函数 OnComm()6.打开和设置串口参数7.发送数据8.发送十六进制字符9.在接收框中以十六进制显示10.如何设置自动发送11什么是 VARIANT 数据类型?如何使用 VARIANT 数据类型?在众多网友的支持下,串口调试助手从 2001 年 5 月 21 日发布至今,短短一个月,在全国各地累计下载量近 5000 人次,在近 200 多个电子邮件中,20 多人提供了使用测试意见,更有 50 多位朋友提出要串口调试助手的源代码,为了答谢谢朋友们的支持,公开推出我最初用 VC 控件 MSComm 编写串口通信程序的源代码,并写出详细的编程过程,姑且叫串口调试助手源程序 V1.0 或 VC 串口通讯源程序吧,我相信,如果你用 VC 编程,那么有了这个代码,就可以轻而易举地完成串口编程任务了也许本文过于详细,高手就不用看)开始吧:1.建立项目:打开 VC+6.0,建立一个基于对话框的 MFC 应用程序 SCommTest(与我源代码一致,等会你会方便一点);2.在项目中插入 MSComm 控件选择 Project 菜单下 AddToProject 子菜单中的 ComponentsandControls选项,在弹出的对话框中双击 RegisteredActiveXControls 项(稍等一会,这个过程较慢),则所有注册过的 ActiveX 控件出现在列表框中。

选择MicrosoftCommunicationsControl,version6.0,单击 Insert 按钮将它插入到我们的 Project 中来,接受缺省的选项如果你在控件列表中看不到MicrosoftCommunicationsControl,version6.0,那可能是你在安装 VC6 时没有把 ActiveX项选上,重新安装 VC6,选上 ActiveX 就可以了),这时在 ClassView 视窗中就可以看到 CMSComm 类了,(注意:此类在ClassWizard 中看不到,重构 clw 文件也一样),并且在控件工具栏 Controls中出现了图标(如图 1 所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的EAsabl口AQ園63.利用 ClassWizard 定义 CMSComm 类控制对象打开 ClassWizardMemberViariables 选项卡,选择 CSCommTestDlg 类,为IDC_MSC0MMl 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了/AFXINCLUDESO#includemscomm.h/AFX_INCLUDES(这时运行程序,如果有错,那就再从头开始)。

4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据 ID 为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID 为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其 ID 设为IDC_BUTTON_MANUALSEND别忘记了将接收编辑框的 PropertiesStyles 中把Miltiline 和 VerticalScroll 属性选上,发送编辑框若你想输入多行文字,也可选上 Miltiline再打开 ClassWizardMemberViariables 选项卡,选择 CSCommTestDlg 类,为IDC_EDIT_RXDATA 添加 CString 变量 m_strRXData,为 IDC_EDIT_TXDATA 添加CString 变量 m_strTXData说明:m_strRXData 和 m_strTXData 分别用来放入接收和发送的字符数据休息一会吧?我们天天与电脑打交道,要注意保重,我现在在单杠上做引体向上可以来 40 次,可我都 32 了,佩服吗?再接着来,下面是关键了:5.添加串口事件消息处理函数 OnComm()打开 ClassWizardMessageMaps,选择类 CSCommTestDlg,选择IDC_MSCOMM1,双击消息 OnComm,将弹出的对话框中将函数名改为 OnComm,(好记而已)0K。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在 OnComm()函数加入相应的处理代码就能实现自已想要的功能了请你在函数中加入如下代码:voidCSCommTestDlg:OnComm()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048;/设置 BYTE 数组 An8-bitintegerthatisnotsigned.CStringstrtemp;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 型数组for(k=0;kMessageMaps,选择类 CSCommTestDlg,选择 IDC_BUTTON_MANUALSEND,双击BN_CLICKED 添加 OnButtonManualsend()函数,并在函数中添加如下代码:voidCSCommTestDlg:OnButtonManualsend()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);/读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送数据运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一端的串口调试助手(或别的调试工具)接收框里出现了什么。

如果你真是初次涉猎串口编程,又一次成功,那该说声谢谢我了,因为我第一次做串口程序时可费劲了,那时网上的资料也不好找开开玩笑,谢谢你的支持,有什么好东西别忘了给我寄一份最后说明一下,由于用到 VC 控件,在没有安装 VC 的计算机上运行时要从 VC 中把 mscomm32.ocx、msvcrt.dll、mfc42.dll 拷到 Windows 目录下的 System 子目录中(win2000 为 System32)并再进行注册设置,在主对话框中加入一个复选接钮,ID 为 IDC_CHECK_HEXSENDCaption:十六进制发送,再利用 ClassWizard 为其添加控制变量:m_ctrlHexSend;在 ClassView 中为 SCommTestDlg 类添加以下两个 PUBLIC 成员函数,并输入相应代码;/由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔/如:A123450B0029/CByteArray 是一个动态字节数组,可参看 MSDN 帮助intCSCommTestDlg:String2Hex(CStringstr,CByteArray&senddata)inthexdata,lowhexdata;inthexdatalen=0;intlen=str.GetLength();senddata.SetSize(len/2);for(inti=0;i=len)break;lstr=stri;hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;elsehexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSize(hexdatalen);returnhexdatalen;/这是一个将字符转换为相应的十六进制值的函数/好多 C 语言书上都可以找到/功能:若是在 0-F 之间的字符,则转换为相应的十六进制字符,否则返回-1charCSCommTestDlg:ConvertHexChar(charch)if(ch=0)&(ch=A)&(ch=a)&(ch=f)returnch-a+10;elsereturn(-1);再将 CSCommTestDlg:0nButtonManualsend()修改成以下形式:voidCSCommTestDlg:OnButtonManualsend()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);/读取编辑框内容if(m_ctrlHexSend.GetCheck()CByteArrayhexdata;intlen 二 String2Hex(m_strTXData,hexdata);/此处返回的 len 可以用于计算发送了多少个十六进制数m_ctrlComm.SetOutput(COleVariant(hexdata);/发送十六进制数据elsem_ctrlComm.SetOutput(COleVariant(m_strTXData);/发送 ASCII 字符数据现在,你先将串口线接好并打开串口调试助手 V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入 00010203A1CC 等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到 00010203A1CC 了。

9.在接收框中以十六进制显示这就容易多了:在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAYCaption:十六进制显示,再利用 ClassWizard 为其添加控制变量:m_ctrlHexDiaplay然后修改 CSCommTestDlg:OnComm()函数:voidCSCommTestDlg:OnComm()/TODO:AddyourcontrolnotificationhandlercodehereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata2048;/设置 BYTE 数组 An8-bitintegerthatisnotsigned.CStringstrtemp;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 型数组for(k=0;klen;k+)/将数组转换为 Cstring 型变量BYTEbt=*(char*)(rxdata+k);/字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format(%02X,bt);/将字符以十六进制方式送入临时变量 strtemp 存放,注意这里加入一个空隔elsestrtemp.Format(%c,bt);/将字符送入临时变量 strtemp 存放m_strRXData+=strtemp;/加入接收编辑框对应字符串UpdateData(FALSE);/更新编辑框内容测试:在串口调试助手发送框中输入 00010203A1CC 等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00010203A1CC 了。

10.如何设置自动发送最简单的设定自动发送周期是用 SetTimer()函数,这在数据采集中很有用,在控制中指令的传送也可能用到定时发送方法是:在 ClassWizard 中选上 MessageMap 卡,然后在 ObjectsIDs 选中 CSCommTestDlg 类,再在 Messages 框中选上 WM_TIMER 消息,单击ADD_FUNCTION 加入 voidCSCommTestDlg:OnTimer(UINTnIDEvent)函数,这个函数是放入“时间到”后要处理的代码:voidCSCommTestDlg:OnTimer(UINTnIDEvent)/TODO:Addyourmessagehandlercodehereand/orcalldefaultOnButtonManualsend();CDialog:OnTimer(nIDEvent);再在在主对话框中加入一个复选接钮,ID 为 IDC_CHECK_AUTOSENDCaption:自动发送(周期 1 秒),再利用 ClassWizard 为其添加 BN_CLICK 消息处理函数voidCSCommTestDlg:OnCheckAutosend():voidCSCommTestDlg:OnCheckAutosend()/TODO:Addyourcontrolnotificationhandlercodeherem_bAutoSend=!m_bAutoSend;if(m_bAutoSend)SetTimer(1,1000,NULL);/时间为 1000 毫秒elseKillTimer(1);/取消定时其中:m_bAutoSend 为 BOOL 型变量,在 CLASSVIEW 中为 CSCommTestDlg 类加入,并在构造函数中初始化:m_bAutoSen=FALSE;现在可以运行程序测试了。

11.什么是 VARIANT 数据类型?如何使用 VARIANT 数据类型?不知如何使用 VARIANT 数据类型,有不少朋友对 VARIANT 这个新的数据类型大感头疼SetOutput()函数中需要的 VARIANT 参数还可以使用COleVariant 类的构造函数简单生成,现在 GetInput()函数的返回值也成了VARIANT 类型,那么如何从返回的值中提取有用的内容VARIANT 及由之而派生出的 COleVariant 类主要用于在 OLE 自动化中传递数据实际上 VARIANT 也只不过是一个新定义的结构罢了,它的主要成员包括一个联合体及一个变量该联合体由各种类型的数据成员构成,而该变量则用来指明联合体中目前起作用的数据类型我们所关心的接收到的数据就存储在该联合体的某个数据成员中该联合体中包含的数据类型很多,从一些简单的变量到非常复杂的数组和指针由于通过串口接收到的内容常常是一个字节串,我们将使用其中的某个数组或指针来访问接收到的数据这里推荐给大家的是指向一个 SAFEARRAY(COleSafeArray)类型变量新的数据类型 SAFEARRAY 正如其名字一样,是一个“安全数组”,它能根据系统环境自动调整其 16 位或 32 位的定义,并且不。

下载提示
相关文档
正为您匹配相似的精品文档