论文1.docx
《论文1.docx》由会员分享,可在线阅读,更多相关《论文1.docx(27页珍藏版)》请在冰豆网上搜索。
论文1
毕业设计说明书(论文)
作者:
高宇学号:
0707240515
学院:
自动化工程学院班级:
自动075班
专业:
自动化□测控技术与仪器
所在系:
控制科学与工程□仪器科学与技术
题目:
计算机串口通信服务的开发与应用
指导者:
辛红伟签字:
评阅者:
2011年6月吉林
摘要
串口调试助手是串口通信常用的软件之一,广泛的应用于教学、科研等领域。
串口调试助手是专门测试串口通信用的,比如说有设备要发送数据到pc处理或保存,这时候就可以直接用串口调试助手接收查看发送来的数据,供分析用等等。
本文介绍了如何使用VC++制作串口调试助手,串口调试助手的一些基本用途的和使用方法。
硬件要求能运行Windows9X/2000/XP的PC机,配有两个串行口。
软件环境要求VisualC++6.0,Windows9X/2000/XP。
要求串口调试助手支持各种串口设置,如波特率,校验位、数据位和停止位等等。
支持ASCII/Hex发送,发送和接收的数据可以在16进制和AscII码之间任意转换。
可以自动在发送的数据尾增加校验位,支持多种校验格式。
支持间隔发送,循环发送,批处理发送,输入数据可以从外部文件导入,并且能够自动将接收到的数据保存到磁盘文件。
支持常用的300-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。
[1][2]
目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调(MODEM)。
最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。
[3]
关键词:
VC++;串口调试;波特率
ABSTRACT
Serialcommunicationserialportdebuggingassistantisoneofcommonlyusedsoftware,widelyusedinteaching,researchingandotherfields.SerialDebugAssistantisspecificallyusedforthetestserialcommunication,suchasadevicesendingdatatothepcdealorsave,Thistimewecandirectlyviewreceiverwithaserialdebuggingassistantsenttothedataforanalysisandsoon.
ThisarticledescribeshowtousetheVC++debuggingserialproductionassistant,assistantserialdebuggingsomeofthebasicpurposesanduse.HardwarerequirementstorunWindows9X/2000/XPPC,equippedwithtwoserialports.SoftwareenvironmentrequiresVisualC++6.0,Windows9X/2000/XP.
Assistantrequiredtosupportavarietyofserialportdebuggingsettingssuchasbaudrate,parity,databitsandstopbitsandsoon.SupportsASCII/Hexsend,sendandreceivedatacanbebetween16hexandAscIIanycodeconversion.Thedatacanbeautomaticallyaddedattheendtosendparitybit,supportformultiplevalidationformat.Supportforsendinginterval,circularsent,batchtransmission,theinputdatacanbeimportedfromanexternalfile,andcanreceivedataautomaticallysavedtodiskfile.Supportthecommon300-115200bpsbaudrate,settingtheparity,databitsandstopbits,canhexadecimalASCIIcodeordataortoreceiveorsendanycharacters(includingChinese),canbesetautomaticallysendcycle,andcanreceivedatasavedastextfiles,cansendatextfileofanysize.
Nowmorecommonlyused9-pinserialport(DB9)and25-pinserialport(DB25),whiletheshortdistancecommunication(<12m),powercablescanbeconnecteddirectlytothestandardRS232port(RS422,RS485far),ifthedistanceoverfar,themodemtobeattached(MODEM).Themostsimpleandcommonlyusedisthethree-wireconnection,thatis,thereceivedataandsenddatatripodconnected.
Keywords:
vc++,SerialDebug,baudrate
摘要I
ABSTRACTII
第1章绪论4
1.2本课题重点研究的问题、解决的思路4
1.3完成本课题的工作方案4
第2章串口通信在VC++环境下的应用5
2.1串口通信的基本原理5
2.2VC下的32位串口应用程序5
2.3使用简单而强大的多线程串口编程工具CSerialPort类6
2.4VC中应用MSComm空间编程步骤:
6
2.5MSComm控件串行通信处理方式6
2.6MSComm控件的属性说明7
第3章使用VC++制作串口调试助手8
3.1串口调试助手的流程图8
3.2串口调试助手具体制作方法10
3.2.1.建立项目:
10
3.2.2.在项目中插入MSComm控件10
3.2.3.利用ClassWizard定义CMSComm类控制对象10
3.2.4.在对话框中添加控件11
3.2.5.添加串口事件消息处理函数OnComm11
3.2.6.打开串口和设置串口参数12
3.2.7.发送数据14
3.2.8.发送十六进制字符15
3.2.9.在接收框中以十六进制显示17
3.2.10.如何设置自动发送18
第4章调试19
结论20
参考文献22
致谢23
第1章绪论
1.1课题背景与意义
随着计算机系统的应用和微机网络的发展,通信功能越来越显得重要。
这里所说的通信是只计算机与外界的信息交换。
因此,通信既包括计算机与计算机之间,也包括计算机和外部设备之间、计算机与单片机之间的信息交换。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等、上位机与下位机之间的通信,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口。
[4][5]
串行通信广泛应用于Internet、电信、金融、工业控制、服务业、终端连线及其他应用领域,在不同的应用领域,串行通信可以与其他通信方式相结合、与Access或Mssql数据库相结合、与WinSock通信相结合,方便的与SMS模块、Modem、Rabbit2000潜入式系统、PLC通信程序、MATLAB环境等进行通信,所以研究基于windows的串口通信软件设计具有很强应用价值.。
[5]
1.2本课题重点研究的问题、解决的思路
本课题重点研究的问题是:
1.串口通信协议;2.C++builder制作串口调试助手
解决问题的思路:
掌握C++builder及MSComm控件的使用方法;学习串口知识;通过相关书籍学习掌握使用C++builder软件制作串口调试助手。
实现预期目标可行性分析;在Windows环境下,利用C++builder实现串口通信的主要编程方法是调用Windows的API函数。
使用API函数,既能保证数据的完整,又可以清楚的让我们掌握串口通信的机制。
在C++builder环境中,利用WindowsAPI函数进行串口通信的方法,已经成功应用到工业控制领域多个方面。
所以,利用C++builder编写串口通信程序具有可行性。
[6]
1.3完成本课题的工作方案
选择c++builder作为本课题发展平台;学习该软件的使用方法并熟练操作。
通过查阅相关论文深入学习串口通信。
掌握相关材料利用c++builder编程软件并调试串口调试助手,最终完成串口通信服务的开发。
第2章串口通信在VC++环境下的应用
2.1串口通信的基本原理
串口的本质功能是作为CPU和串口通信设备间的编码转换器。
当数据从CPU经过串口发送出去时,字节数据转换为串口的位。
在接收数据时,串口的位被转换为字节数据。
在Windows环境下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源,即关闭串口。
2.2VC下的32位串口应用程序
32位下串口通信程序可以用3种方法实现:
MSComm控件;使用API通信函数或者CSerialPort类。
2.2.1使用MSComm控件
VC++6.0提供的MSComm控件通过串口端口发送和接收数据,为应用程序提供串口通信功能,使用非常方便。
在当前的对话框中插入一个MSComm控件,然后在ClassWizard中为新创建的通信控件定义一个成员对象(CMSCommm_Com),接下来只需要通过该成员对象即可设置MSComm控件的相关属性。
MSComm控件提供了很多属性,通常我们只需要设置几个常用的属性,即初始化串口,然后需要打开串口。
(1)初始化串口
串口的初始化主要是通过串口的属性设置相应的参数。
利用成员对象m_Com初始化串口参数。
(2)捕捉串口事件
MSComm控件可以采用查询或事件驱动的方式从端口获取数据。
事件驱动方式是处理串口端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如:
在串口接收缓冲区中有字符,或者CD线上或RTS线上一个字符到达或一个事件发生时,可以利用MSComm控件的OnComm事件捕获并处理这些通信事件,OnComm事件还可以检查和处理通信错误。
查询方式实质上属于事件驱动,但在某些情况下,这种方式更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent属性值来查询霎时间和错误,只要CommEvent属性的值有了变化,就表明有一个事件或一个错误发生。
如果应用程序较小,且自成一体,则该方法更为可取。
本文介绍使用比较广泛的事件驱动方法:
有事件(如接收到数据)时通知程序。
在程序中需要捕获并处理这些通信事件。
(3)串口读写
完成读写的函数很简单,只需调用GetInput()和SetOutput()两个函数即可。
两个函数的原型是:
VARIANTGetInput()及voidSetOutput(constVARIANT&NEWvALUE),两者都要使用VARIANT类型(所有Idispatch:
:
Invoke的参数和返回值在内部都是作为VARIANT对象处理的)[7,8]。
无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式。
字符串可以用BSTR表示,但是所有的BSTR都是包含宽字符,WinNT支持宽字符,而Win95并不支持。
为解决上述问题,我们在实际应用中使用CbyteArray。
OnComm事件的程序结构如下:
voidCMainFrame:
:
OnCommMscomm()
{
……
switch(m_Com.GetCommEvent())
{
……
case2:
//串口数据接收和处理
……
}
}
使用32位的API通信函数
在VC++6.0下,MFC应用程序的线程由CWinThread对象表示。
VC++把线程分为两种:
用户界面线程和工作者线程。
用户界面线程能够提供界面和用户交互,通常用于处理用户输入及其相应的各种事件和消息;而工作都线程主要用来处理程序的后台任务。
程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个线程。
创建上述的两种线程都利用这个函数。
首先在在MainFrm.cpp中定义全局变量(串口句柄hCom和hCommWatchThread),然后在程序中创建一个串口,并进行相应的串口参数设置,然后启动一个工作者线程,主要用它来监视串口状态,看有无数据到达、通信有无错误;而用户界面线程则可专心进行数据处理、提供友好的用户界面等重要的工作,最后为工作者线程写一个全局函数,主要完成数据接收的工作。
数据接收函数的编写相对较简单,首先调用SetCommMask设置只接收字符,然后调用WAITcOMMeVENT等待串口事件的发生。
当串口有数据到来时,判断其是否为字符,若是,则调用ClearCommError获取串口的状态并清除串口的错误,再调用ReadFile读取数据,并通过串口状态的cbInQue属性获取数据的大小,最后再将数据显示出来。
值得注意的是,如果在CreateFile()时使用了FILE_FLAG_OVERLAPPED,则在ReadFile()中必须采用LPOVERLAPPED结构。
否则,函数会错误地报告该操作已完成了。
在此,我们使用了多线程技术,在工作者线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告。
并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行。
2.3使用简单而强大的多线程串口编程工具CSerialPort类
使用MSComm控件编程简单,对付简单的任务完全可以胜任,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通信控件。
如果这时你不想自己编写底层的东西或者对API函数不是很了解,你可以使用CSerialPort类来完成比较复杂的任务。
这是RemonSpekreijse写的一个串口类,类作者已作了一个基于对话框,且同时能检测4个串口的示例程序。
有了这个类,我们编程就容易多了,只要在程序中加入这个类文件,然后就可以按照通常的方法使用该类中的一些函数。
该类可在相关网站上下载[11]。
2.4VC中应用MSComm空间编程步骤:
(1)在建立的程序工程中插入MicrosoftCommunicationsControl控件:
(2)添加MSComm控件ID的控制变量(或者对象);
(3)对串口进行初始化,设置MSComm控件的属性;
(4)添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码:
(5)编写串口发送等其他代码;
(6)关闭串口。
2.5MSComm控件串行通信处理方式
MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,为应用程序提供了通过串行接口收发数据的简便方法。
MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。
MSComm控件在串口编程时比较方便,程序员不必花时间去了解较为复杂的APl函数,而且在VC、VB、Delphi等语言中均可使用。
但也要了解一点:
那就是本控件通信功能的实现,还是间接调用WindowsAPI编程的结果,只是先通过Comm.drv解释,然后再传递给设备驱动程序进行的。
它提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他通信设备(如调制解调器),发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。
MSComm控件可用于创建电话拨号程序、串口通信程序和功能完备的终端程序。
具体来说,MSComm控件提供了两种处理通信问题的方法:
一是事件驱动(Event-Driven)法,二是查询法。
1.事件驱动方式事件驱动方式是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通信事件。
OnComm事件还可以检查和处理通信错误。
所有通信事件和通信错误的列表参阅CommEvent属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
对于MSComm控件的事件,在编程中常在串口事件消息处理函数OnComm()中进行处理.
2.查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,那么这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为惟一等待接收的字符是调制解调器的“确定”响应。
如果有过DOS编程经验的读者可以体会到,以上两种方式的编程与DOS下的中断和查询机理是一样的【14-16】。
2.6MSComm控件的属性说明
MSComm控件有很多重要的属性,但首先必须熟悉几个常用的属性。
《CommPort:
设置并返回通信端口号。
》Settings:
以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
》PortOpen:
设置并返回通信端口的状态。
也可以打开和关闭端口。
《Input:
从接收缓冲区返回和删除字符。
》Ou~ut:
向传输缓冲区写一个字符串。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
第三章使用VC++制作串口调试助手
3.1串口调试助手的流程图
串口调试助手的系统层次结构图如图3-1
图3-1层次结构图
窗体设计就构图如图3-2
图3-2窗体图
端口部分设计流程图如图3-3
图3-3部分设计流程图
3.2串口调试助手具体制作方法
3.2.1.建立项目:
打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);
图3-4初始图
3.2.2.在项目中插入MSComm控件
选择Project菜单下AddToProject子菜单中的ComponentsandControls…选项,在弹出的对话框中双击RegisteredActiveXControls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择MicrosoftCommunicationsControl,version6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到MicrosoftCommunicationsControl,version6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),
这时在ClassView视窗中就可以看到CMSComm类了,(注意:
此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标,现在要做的是用鼠标将此图标拖到对框中,程序运行后,这个图标是看不到的。
3.2.3.利用ClassWizard定义CMSComm类控制对象
打开ClassWizard->MemberViariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:
m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES()#include"mscomm.h"//}}AFX_INCLUDES(这时运行程序,如果有错,那就再从头开始)。
3.2.4.在对话框中添加控件
向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
别忘记了将接收编辑框的Properties->Styles中把Miltiline和VerticalScroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。
再打开ClassWizard->MemberViariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。
说明:
m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。
3.2.5.添加串口事件消息处理函数OnComm
打开ClassWizard->MessageMaps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。
请