《串行异步通信程序设计1.doc》由会员分享,可在线阅读,更多相关《串行异步通信程序设计1.doc(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、*实践教学*兰州理工大学计算机与通信学院2013年秋季学期计算机通信课程设计题 目:串行异步通信程序设计 专业班级: 通信工程(1)班 姓 名: 学 号: 10250119 指导教师: 成 绩: 34摘 要 计算机与外部设备之间的通信方式有两种,一种是并行通信,另一种是串行通信。在Windows环境下实现通信的方法主要有利用MSComm控件和直接用Windows API编程。 本次课程设计首先通过VC+6.0创建异步通信界面,通过插入MSComm控件,用vspm虚拟串口实现串行异步通信,具体实现过程是先建立工程,然后在项目中插入MSComm控件,再通过布局,初始化串口,设置MSComm控件的属
2、性,添加串口事件消息处理函数OnComm(),就可以发送数据,通过虚拟发送可以在同一界面上出现发送和接收消息,也可以互相发送消息,从而实现串行异步通信。关键词:VC+6.0;MSComm;串口通信目 录前言1第一章 基本原理21.1 串口通信的基本概念21.1.1 串行通信21.1.2 串行通信的工作模式21.2 串行通信协议41.2.1 异步协议41.2.2 同步协议51.3 基本参数6第二章 VC+软件简介72.1 VC+6.0简介72.2 VC+6.0的Microsoft Communications Control 控件7第三章 系统详细设计93.1 建立工程93.2 在程序中添加MS
3、Comm控件123.3 布局143.4 初始化串口:设置MSComm控件的属性153.5 添加串口事件消息处理函数OnComm()183.6 发送数据20第四章 串口通信调试224.1 虚拟串口224.2 设置串口大师224.3 用串口大师测试MSCommTest程序24总 结27参考文献28致谢29附录30前言现如今,随着多媒体技术、网络应用和信息高速公路的发展,使得计算机系统成为人们同外界联系、实现信息和资源共享的强有力的手段和工具。而这些技术实现的关键是基于计算机的通信技术的支持。计算机与外部设备之间的通信方式有两种,一种是并行通信,另一种是串行通信。由于串行接口简单、使用方便,从而使得
4、异步串行通信成为计算机之间极为常用的通信手段。随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。随着通信技术和计算机网络技术的发展、Internet网的普及,计算机远程通信已渗透到国民经济的各个领域,在数据通信中,通常将待传送的每个字符的二进制代码按照由低位到高位的顺序依次发送的方式成为串行通信。由于串行通信只需在发送方和接收方之间建立一条通信信道,因此可以减小通信系统的造价。在远程通信中,一般采用串行通信的方式。而串行异步通信作为最简单的计算机通信
5、之一,有着广泛的应用价值,作为市场广泛的VC+当仁不让的成为了最通用的编程语言之一,其中在本文当中VC+6.0通过建立工程等创立了用户界面,而vspm虚拟串口则通过改变端口号实现了串行异步通信,其中重要的是MSComm控件的插入和虚拟串口的设置,本次课程设计综合讨论了以上实现方案的可行性,并且通过大胆的实验,通过数据显示结果与理论结果完全一致,得到了课设所要求的目的。第一章 基本原理1.1 串口通信的基本概念 1.1.1 串行通信串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输,如图1-1所示。图1-1 串行通信串行数据传送的特
6、点是:数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。但是串行通信传送速度比并行通信慢得多,并行通信时间为T,则串行时间为NT。正是由于串行通信的接线少、成本低,因此它在数据采集和控制系统中得到了广泛的应用,产品也多种多样。1.1.2 串行通信的工作模式通过单线传输信息是串行数据通信的基础。数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模
7、式:单工、半双工和全双工。(1)单工形式。单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方则固定为接收端。信息只能沿一个方向传送,使用一根传输线,如图1-2所示。单工形式一般用在只向一个方向传送数据的场合。例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。还有在某些通信信道中,如单工无线发送等。图1-2 单工形式(2)半双工形式。半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式既可以使用一条数据线,也可以使用两条数据线,如图1-3所示。图1
8、-3 半双工形式半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟。信息传输效率低些。但是对于像打印机这样单方向传输的外围设备,用半双工方式就能满足要求了,不必采用全双工方式,可节省一根传输线。(3)全双工形式。全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进行传送,通信双方都能在同一时刻进行发送和接收操作,如图1-4所示。图1-4 全双工形式在全双工方式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高1.2 串行通信协议串行传输中,数据是一位一位按照到达的顺序依次传输的
9、,每位数据的发送和接收都需要时钟来控制。发送端通过发送时钟确定数据位的开始和结束,接收端需要在适当的时间间隔对数据流进行采样来正确地识别数据。接收端和发送端必须保持步调一致,否则就会在数据传输中出现差错。为了解决以上问题,串行传输可采用以下两种方法:异步传输和同步传输。1.2.1 异步协议在异步传输方式中,字符是数据传输单位。在通信的数据流中,字符间异步,字符内部各位间同步。异步通信方式的“异步”主要体现在字符与字符之间通信没有严格的定时要求。异步传输中,字符可以是连续地、一个个地发送,也可以是不连续地、随机地进行单独发送。在一个字符格式的停止位之后,立即发送下一个字符的起始位,开始一个新的字
10、符的传输,这叫做连续的串行数据发送,即帧与帧之间是连续的。断续的串行数据传送是指在一帧结束之后维持数据线的“空闲”状态,新的起始位可在任何时刻开始。一旦传送开始,组成这个字符的各个数据位将被连续发送,并且每个数据位持续的时间是相等的。接收端根据这个特点与数据发送端保持同步,从而正确地恢复数据。收发双方则以预先约定的传输速率,在时钟的作用下,传送这个字符中的每一位。 异步通信协议的实例起止式异步协议、特点与格式:起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平,逻辑值0),字符本身有
11、57位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位,或意味半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开始处一定有一个下跳沿。异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小于19.2kb
12、it/s)。在高速传送时,一般要采用同步协议。1.2.2 同步协议在同步传输方式中,比特块以稳定的比特流的形式传输,数据被封装成更大的传输单位,称为帧。每个帧中含有多个字符代码,而且字符代码与字符代码之间没有间隙以及起始位和停止位。和异步传输相比,数据传输单位的加长容易引起时钟漂移。为了保证接收端能够正确地区分数据流中的每个数据位,收发双方必须通过某种方法建立起同步的时钟。可以在发送器和接收器之间提供一条独立的时钟线路,由线路的一端(发送器或者接收器)定期地在每个比特时间中向线路发送一个短脉冲信号,另一端则将这些有规律的脉冲作为时钟。这种技术在短距离传输时表现良好,但在长距离传输中,定时脉冲可
13、能会和信息信号一样受到破坏,从而出现定时误差。另一种方法是通过采用嵌有时钟信息的数据编码位向接收端提供同步信息。(1) 面向字符的同步协议特点与格式:这种协议的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由字符组成,故被称作面向字符的协议。(2) 面向比特的同步协议特点与格式:特点是所传输的一帧数据可以是任意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面向比特”的协议。帧信息的分段SDLC/HDLC的一帧信息包括以下几个场(Fi
14、led),所有场都是从有效位开始传送。1.3 基本参数波特率:实际上就是传输速度,它表示每秒钟传送的bit的个数。当我们提到时钟周期时,我们就是指波特率。波特率可以远远大于这些值,但是波特率和距离成反比。数据位:是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。奇偶校验位:在串口通信中一种简
15、单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。第二章 VC+软件简介2.1 VC+6.0简介VC+6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C+语言的要求编写,并且加入了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Wi
16、ndows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。在VC+中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC+访问串口。下面主要简述前一种方法。2.2 VC+6.0的Microsoft Communications Control 控件Microsoft公司在WINDOWS中提供了一个串口通讯控件,
17、用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。该控件有很多自己的属性,可以通过它的属性窗口来设置,也可以用程序设置。用程序设置,更灵活。以下介绍设置中遇到的几个相关函数。SetCommPort:指定使用的串口。GetCommPort:得到当前使用的串口。SetSettings:指定串口的参数。一般设为默认参数9600,N,8,1。这样方便与其他串口进行通讯。GetSettings:取得串口参数。SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。G
18、etPortOpen:取得串口状态。GetInBufferCount:输入缓冲区中接受到的字符数。SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。GetInPut:读取输入缓冲区。GetOutBufferCount:输出缓冲区中待发送的字符数。SetOutPut:写入输出缓冲区。一般而言,使用上述函数和属性就可以进行串口通讯了。第三章 系统详细设计3.1 建立工程打开VC+6.0建立基于对话框的MFC应用程序10250119,如下图所示:图 3-1创建项目文件10250119图 3-2应用程序10250119图 3-3应用程序10250119图3-4
19、应用程序10250119图 3-5应用程序10250119图3-6进入软件构件界面3.2 在程序中添加MSComm控件首先打开工程对话框,然后单击增加到工程选项,然后双击Components and Controls,再打开Registered ActiveX Controls控件,选择Microsoft Communications Control, version 6.0,点击插入,按默认值添加,多了个电话图标,这是增加后串口通信控件。如下图所示:图3-7 插入MSComm控件图3-8插入MSComm控件图3-9 插入MSComm控件3.3 布局删除确认、取消和提示框,添加“电话”、静态文
20、本、按钮、编辑框,拖动添加的控件,根据喜好布局,如图 3-10 所示:图3-10 软件布局界面图3-11设置按钮ID图3-12 设置发送框ID图3-13设置接收框ID3.4 初始化串口:设置MSComm控件的属性首先打开工具栏的查看,选择建立类向导MFC ClassWizard,在选择Member Viariable,打开ClassName为Cmy10250119Dlg的类,Control ID为MSCOMM1,双击它,为它添加控制变量m_ctrlComm类似的,选择其它项修改,改后如下图:3-14 设置control 变量3-15 设置发送框传输变量3-16 设置接收框变量图3-17 设置M
21、SComm控件的属性对CWy10250119:OnInitDialog()函数中写入对串口的初始化语句,串口初始化语句由IDC_MSCOMM1的CMSComm控制变量m_ctrlComm来设置串口控件属性。添加初始化代码代码如下:/ TODO: Add extra initialization here if(m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpen(FALSE); m_ctrlComm.SetCommPort(1); /选择com1 if( !m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpen(
22、TRUE);/打开串口 else AfxMessageBox(cannot open serial port); m_ctrlComm.SetSettings(9600,n,8,1); /波特率9600,无校验,8个数据位,1个停止位 m_ctrlComm.SetInputModel(1); /1:表示以二进制方式检取数据 m_ctrlComm.SetRThreshold(1); /参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.SetInputLen(0); /设置当前接收区数据长度为0 3.5 添加串口事件消息处理函数OnCo
23、mm()打开工具栏查看按钮,建立类向导MFC ClassWizard,然后选择Message Maps,在Class Name中选择类Cmy10250119Dlg,再在Object IDs 中选择IDC_MSCOMM1,然后在Message中双击消息OnComm,在弹出的对话框中将函数名改为OnComm,单击“OK”,就加入了串口事件的消息处理函数,如图3-18图 3-18 添加消息处理函数然后编写OnComm()中的代码,主要任务是从串口接收数据并显示在接收编辑框中。代码如下:void CSCommTestDlg:OnComm() / TODO: Add your control notif
24、ication handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /事件值为2表示接收缓冲区内有字符 /以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); /读缓冲区 safearray_inp=varia
25、nt_inp; /VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); /得到有效数据长度 for(k=0;klen;k+) safearray_inp.GetElement(&k,rxdata+k);/转换为BYTE型数组 for(k=0;kLoadIcon(IDR_MAINFRAME);void CMy10250119Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMy10250119Dlg)DDX_C
26、ontrol(pDX, IDC_MSCOMM1, m_ctrlComm);DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData);DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMy10250119Dlg, CDialog)/AFX_MSG_MAP(CMy10250119Dlg)ON_WM_SYSCOMMAND()ON_WM_DESTROY()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_
27、MANUALSEND, OnButtonManualsend)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMy10250119Dlg message handlersBOOL CMy10250119Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOU
28、TBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, 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 ex
29、tra initialization here if(m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpen(FALSE); m_ctrlComm.SetCommPort(3); /选择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.
30、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 controlvoid CMy10250119Dlg:OnSysCommand(UINT nID, LPARAM
31、 lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CMy10250119Dlg:OnDestroy()WinHelp(0L, HELP_QUIT);CDialog:OnDestroy();/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CMy10250119Dlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM)
限制150内