串行异步通信程序的设计1

上传人:仙*** 文档编号:99920678 上传时间:2022-06-01 格式:DOC 页数:37 大小:720KB
返回 下载 相关 举报
串行异步通信程序的设计1_第1页
第1页 / 共37页
串行异步通信程序的设计1_第2页
第2页 / 共37页
串行异步通信程序的设计1_第3页
第3页 / 共37页
点击查看更多>>
资源描述
word*实践教学*某某理工大学计算机与通信学院2013年秋季学期计算机通信课程设计题目:串行异步通信程序设计 专业班级:通信工程1班某某:学号: 10250119 指导教师:成绩:34 / 37摘 要计算机与外部设备之间的通信方式有两种,一种是并行通信,另一种是串行通信。在Windows环境下实现通信的方法主要有利用MSm控件和直接用WindowsAPI编程。本次课程设计首先通过VC+6.0创建异步通信界面,通过插入MSm控件,用vspm虚拟串口实现串行异步通信,具体实现过程是先建立工程,然后在项目中插入MSm控件,再通过布局,初始化串口,设置MSm控件的属性,添加串口事件消息处理函数Onm(),就可以发送数据,通过虚拟发送可以在同一界面上出现发送和接收消息,也可以互相发送消息,从而实现串行异步通信。关键词:VC+6.0;MSm;串口通信目 录前言1第一章根本原理21.1 串口通信的根本概念21.1.1 串行通信21.1.2 串行通信的工作模式21.2 串行通信协议41.2.1 异步协议41.2.2 同步协议51.3 根本参数6第二章 VC+软件简介7简介7的Microsoft munications Control 控件7第三章系统详细设计93.1 建立工程93.2 在程序中添加MSm控件123.3 布局143.4 初始化串口:设置MSm控件的属性153.5 添加串口事件消息处理函数Onm()183.6 发送数据20第四章串口通信调试224.1 虚拟串口224.2 设置串口大师224.3 用串口大师测试MSmTest程序24总结27参考文献28致谢29附录30前言现如今,随着多媒体技术、网络应用和信息高速公路的开展,使得计算机系统成为人们同外界联系、实现信息和资源共享的强有力的手段和工具。而这些技术实现的关键是基于计算机的通信技术的支持。计算机与外部设备之间的通信方式有两种,一种是并行通信,另一种是串行通信。由于串行接口简单、使用方便,从而使得异步串行通信成为计算机之间极为常用的通信手段。随着计算机网络化和微机分级分布式应用系统的开展,通信的功能越来越重要。通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。随着通信技术和计算机网络技术的开展、Internet网的普与,计算机远程通信已渗透到国民经济的各个领域,在数据通信中,通常将待传送的每个字符的二进制代码按照由低位到高位的顺序依次发送的方式成为串行通信。由于串行通信只需在发送方和接收方之间建立一条通信信道,因此可以减小通信系统的造价。在远程通信中,一般采用串行通信的方式。而串行异步通信作为最简单的计算机通信之一,有着广泛的应用价值,作为市场广泛的VC+当仁不让的成为了最通用的编程语言之一,其中在本文当中VC+6.0通过建立工程等创立了用户界面,而vspm虚拟串口如此通过改变端口号实现了串行异步通信,其中重要的是MSm控件的插入和虚拟串口的设置,本次课程设计综合讨论了以上实现方案的可行性,并且通过大胆的实验,通过数据显示结果与理论结果完全一致,得到了课设所要求的目的。第一章根本原理1.1 串口通信的根本概念 串行通信串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进展传输,如图1-1所示。图1-1 串行通信串行数据传送的特点是:数据传送按位顺序进展,最少只需要一根传输线即可完成,节省传输线。与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。但是串行通信传送速度比并行通信慢得多,并行通信时间为T,如此串行时间为NT。正是由于串行通信的接线少、本钱低,因此它在数据采集和控制系统中得到了广泛的应用,产品也多种多样。 串行通信的工作模式通过单线传输信息是串行数据通信的根底。数据通常是在两个站点对点之间进展传送,按照数据流的方向可分成3种传送模式:单工、半双工和全双工。1单工形式。单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方如此固定为接收端。信息只能沿一个方向传送,使用一根传输线,如图1-2所示。单工形式一般用在只向一个方向传送数据的场合。例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。还有在某些通信信道中,如单工无线发送等。图1-2 单工形式2半双工形式。半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式既可以使用一条数据线,也可以使用两条数据线,如图1-3所示。图1-3 半双工形式半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟。信息传输效率低些。但是对于像打印机这样单方向传输的外围设备,用半双工方式就能满足要求了,不必采用全双工方式,可节省一根传输线。3全双工形式。全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进展传送,通信双方都能在同一时刻进展发送和接收操作,如图1-4所示。图1-4 全双工形式在全双工方式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高1.2 串行通信协议串行传输中,数据是一位一位按照到达的顺序依次传输的,每位数据的发送和接收都需要时钟来控制。发送端通过发送时钟确定数据位的开始和完毕,接收端需要在适当的时间间隔对数据流进展采样来正确地识别数据。接收端和发送端必须保持步调一致,否如此就会在数据传输中出现过失。为了解决以上问题,串行传输可采用以下两种方法:异步传输和同步传输。 异步协议在异步传输方式中,字符是数据传输单位。在通信的数据流中,字符间异步,字符内部各位间同步。异步通信方式的“异步主要表现在字符与字符之间通信没有严格的定时要求。异步传输中,字符可以是连续地、一个个地发送,也可以是不连续地、随机地进展单独发送。在一个字符格式的停止位之后,立即发送下一个字符的起始位,开始一个新的字符的传输,这叫做连续的串行数据发送,即帧与帧之间是连续的。断续的串行数据传送是指在一帧完毕之后维持数据线的“空闲状态,新的起始位可在任何时刻开始。一旦传送开始,组成这个字符的各个数据位将被连续发送,并且每个数据位持续的时间是相等的。接收端根据这个特点与数据发送端保持同步,从而正确地恢复数据。收发双方如此以预先约定的传输速率,在时钟的作用下,传送这个字符中的每一位。 异步通信协议的实例起止式异步协议、特点与格式:起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位完毕,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位低电平,逻辑值0,字符本身有57位数据位组成,接着字符后面是一位校验位也可以没有校验位,最后是一位,或意味半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平逻辑值,这样就保证起始位开始处一定有一个下跳沿。异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。假如接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合小于19.2kbit/s。在高速传送时,一般要采用同步协议。 同步协议在同步传输方式中,比特块以稳定的比特流的形式传输,数据被封装成更大的传输单位,称为帧。每个帧中含有多个字符代码,而且字符代码与字符代码之间没有间隙以与起始位和停止位。和异步传输相比,数据传输单位的加长容易引起时钟漂移。为了保证接收端能够正确地区分数据流中的每个数据位,收发双方必须通过某种方法建立起同步的时钟。可以在发送器和接收器之间提供一条独立的时钟线路,由线路的一端发送器或者接收器定期地在每个比特时间中向线路发送一个短脉冲信号,另一端如此将这些有规律的脉冲作为时钟。这种技术在短距离传输时表现良好,但在长距离传输中,定时脉冲可能会和信息信号一样受到破坏,从而出现定时误差。另一种方法是通过采用嵌有时钟信息的数据编码位向接收端提供同步信息。1 面向字符的同步协议特点与格式:这种协议的特点是一次传送由假如干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与完毕标志以与整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由字符组成,故被称作面向字符的协议。2 面向比特的同步协议特点与格式:特点是所传输的一帧数据可以是任意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和完毕,故称“面向比特的协议。帧信息的分段SDLC/HDLC的一帧信息包括以下几个场(Filed,所有场都是从有效位开始传送。1.3 根本参数波特率:实际上就是传输速度,它表示每秒钟传送的bit的个数。当我们提到时钟周期时,我们就是指波特率。波特率可以远远大于这些值,但是波特率和距离成反比。数据位:是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。第二章 VC+软件简介2.1 简介VC+6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C+语言的要求编写,并且参加了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大局部Windows API函数和Windows控件,它包含的功能涉与到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比拟高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。在VC+中有两种方法可以进展串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft munications Control。另一种是直接用VC+访问串口。下面主要简述前一种方法。2.2 VC+6.0的Microsoft munications Control 控件Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进展通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。该控件有很多自己的属性,可以通过它的属性窗口来设置,也可以用程序设置。用程序设置,更灵活。以下介绍设置中遇到的几个相关函数。SetmPort:指定使用的串口。GetmPort:得到当前使用的串口。SetSettings:指定串口的参数。一般设为默认参数9600,N,8,1。这样方便与其他串口进展通讯。GetSettings:取得串口参数。SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。GetPortOpen:取得串口状态。GetInBufferCount:输入缓冲区中承受到的字符数。SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。GetInPut:读取输入缓冲区。GetOutBufferCount:输出缓冲区中待发送的字符数。SetOutPut:写入输出缓冲区。一般而言,使用上述函数和属性就可以进展串口通讯了。第三章 系统详细设计3.1 建立工程打开VC+6.0建立基于对话框的MFC应用程序10250119,如如下图所示:图 3-1创建项目文件10250119图 3-2应用程序10250119图 3-3应用程序10250119图3-4应用程序10250119图 3-5应用程序10250119图3-6进入软件构件界面3.2 在程序中添加MSm控件首先打开工程对话框,然后单击增加到工程选项,然后双击ponents and Controls,再打开Registered ActiveX Controls控件,选择Microsoft munications Control, version 6.0,点击插入,按默认值添加,多了个图标,这是增加后串口通信控件。如如下图所示:图3-7 插入MSm控件图3-8插入MSm控件图3-9 插入MSm控件3.3 布局删除确认、取消和提示框,添加“、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局,如图 3-10 所示:图3-10 软件布局界面图3-11设置按钮ID图3-12 设置发送框ID图3-13设置接收框ID3.4 初始化串口:设置MSm控件的属性首先打开工具栏的查看,选择建立类向导MFC ClassWizard,在选择Member Viariable,打开ClassName为Cmy10250119Dlg的类,Control ID为MSM1,双击它,为它添加控制变量m_ctrlm类似的,选择其它项修改,改后如如下图:3-14 设置control 变量3-15 设置发送框传输变量3-16 设置接收框变量图3-17 设置MSm控件的属性对CWy10250119:OnInitDialog()函数中写入对串口的初始化语句,串口初始化语句由IDC_MSM1的CMSm控制变量m_ctrlm来设置串口控件属性。添加初始化代码代码如下:/ TODO: Add extra initialization here if(m_ctrlm.GetPortOpen() m_ctrlm.SetPortOpen(FALSE); m_ctrlm.SetmPort(1); /选择1 if( !m_ctrlm.GetPortOpen() m_ctrlm.SetPortOpen(TRUE);/打开串口 else AfxMessageBox(cannot open serial port); m_ctrlm.SetSettings(9600,n,8,1); /波特率9600,无校验,8个数据位,1个停止位 m_ctrlm.SetInputModel(1); /1:表示以二进制方式检取数据 m_ctrlm.SetRThreshold(1); /参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的Onm事件 m_ctrlm.SetInputLen(0); /设置当前接收区数据长度为0 3.5 添加串口事件消息处理函数Onm()打开工具栏查看按钮,建立类向导MFC ClassWizard,然后选择Message Maps,在Class Name中选择类Cmy10250119Dlg,再在Object IDs 中选择IDC_MSM1,然后在Message中双击消息Onm,在弹出的对话框中将函数名改为Onm,单击“OK,就参加了串口事件的消息处理函数,如图3-18图 3-18添加消息处理函数然后编写Onm()中的代码,主要任务是从串口接收数据并显示在接收编辑框中。代码如下:void CSmTestDlg:Onm() / TODO: Add your control notification 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_ctrlm.GetmEvent()=2) /事件值为2表示接收缓冲区内有字符 /以下你可以根据自己的通信协议参加处理代码 variant_inp=m_ctrlm.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;kLoadIcon(IDR_MAINFRAME);void CMy10250119Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMy10250119Dlg)DDX_Control(pDX, IDC_MSM1, m_ctrlm);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_SYSMAND()ON_WM_DESTROY()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_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 mand range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX 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 extra initialization here if(m_ctrlm.GetPortOpen() m_ctrlm.SetPortOpen(FALSE); m_ctrlm.SetmPort(3); /选择1 if( !m_ctrlm.GetPortOpen() m_ctrlm.SetPortOpen(TRUE);/打开串口 else AfxMessageBox(cannot open serial port); m_ctrlm.SetSettings(9600,n,8,1); /波特率9600,无校验,8个数据位,1个停止位 m_ctrlm.SetInputMode(1); /1:表示以二进制方式检取数据 m_ctrlm.SetRThreshold(1); /参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的Onm事件 m_ctrlm.SetInputLen(0); /设置当前接收区数据长度为0 m_ctrlm.GetInput();/先预读缓冲区以去除残留数据 return TRUE; / return TRUE unless you set the focus to a controlvoid CMy10250119Dlg:OnSysmand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysmand(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) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CMy10250119Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;BEGIN_EVENTSINK_MAP(CMy10250119Dlg, CDialog) /AFX_EVENTSINK_MAP(CMy10250119Dlg)ON_EVENT(CMy10250119Dlg, IDC_MSM1, 1 /* Onm */, Onm, VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CMy10250119Dlg:Onm() / TODO: Add your control notification handler code hereVARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlm.GetmEvent()=2) /事件值为2表示接收缓冲区内有字符 /以下你可以根据自己的通信协议参加处理代码 variant_inp=m_ctrlm.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型变量 BYTE bt=*(char*)(rxdata+k); /字符型 strtemp.Format(%c,bt); /将字符送入临时变量strtemp存放 m_strRXData+=strtemp; /参加接收编辑框对应字符串 UpdateData(FALSE); /更新编辑框内容 void CMy10250119Dlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /读取编辑框内容 m_ctrlm.SetOutput(COleVariant(m_strTXData);/发送数据
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!