已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
兰州理工大学计算机与通信学院2012年秋季学期通信系统综合训练 题 目: 串行异步通信程序设计 专业班级: 09级通信(1)班 姓 名: xxxxxxx 学 号: xxxxxxxxx 指导教师: xxxxxxx_ _ _ 成 绩: 摘 要 本文首先通过VC+6.0创建异步通信界面,通过插入MSComm控件,用vspm虚拟串口实现串行异步通信,具体实现过程是先建立工程,然后在项目中插入MSComm控件,再通过布局,初始化串口,设置MSComm控件的属性,添加串口事件消息处理函数OnComm(),就可以发送数据,通过虚拟发送可以在同一界面上出现发送和接收消息,也可以互相发送消息,从而实现串行异步通信。关键词:VC+6.0 MSComm 串口通信目 录前言2第一章 基本原理31.1 串口通信的基本概念41.1.1 串行通信41.1.2 串行通信的工作模式41.2 串行通信协议51.2.1 串行通信协议分同步协议和异步协议。51.2.2 面向字符的同步协议51.2.3 面向比特的同步协议61.3 VC+软件简介61.3.1 VC+6.061.3.2 VC+的Microsoft Communications Control控件6第二章 系统设计82.1 建立工程82.2 在项目中插入MSComm控件102.3 布局112.4 初始化串口:设置MSComm控件的属性122.5 添加串口事件消息处理函数OnComm()162.6 发送数据17第三章 串口通信调试263.1 计算机串口设置263.2 虚拟串口273.3 设置串口大师273.4 用串口大师测试MSCommTest程序28总 结30参考文献31前言 近些年随着通信技术与计算机技术的发展,通信技术和计算机技术出现了很大的融合性,从而出现了计算机通信,而串行异步通信作为最简单的计算机通信之一,有着广泛的应用价值,作为市场广泛的VC+当仁不让的成为了最通用的编程语言之一,其中在本文当中VC+6.0通过建立工程等创立了用户界面,而vspm虚拟串口则通过改变端口号实现了串行异步通信,其中重要的是MSComm控件的插入和虚拟串口的设置,本文综合讨论了以上实现方案的可行性,并且通过大胆的实验,得到了可靠的成果。第1章 基本原理 1.1 串口通信的基本概念 1.1.1 串行通信串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输。串行数据传送的特点是:数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。但是串行通信传送速度比并行通信慢得多,并行通信时间为T,则串行时间为NT。1.1.2 串行通信的工作模式通过单线传输信息是串行数据通信的基础。数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模式:单工、半双工和全双工。(1)单工形式单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方则固定为接收端。信息只能沿一个方向传送,使用一根传输线,如图2所示。单工形式一般用在只向一个方向传送数据的场合。例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。还有在某些通信信道中,如单工无线发送等。(2)半双工形式半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式既可以使用一条数据线,也可以使用两条数据线,半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟。信息传输效率低些。但是对于像打印机这样单方向传输的外围设备,用半双工方式就能满足要求了,不必采用全双工方式,可节省一根传输线。(3)全双工形式全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进行传送,通信双方都能在同一时刻进行发送和接收操作,在全双工方式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高。1.2 串行通信协议1.2.1 串行通信协议分同步协议和异步协议。 异步通信协议的实例起止式异步协议、特点与格式:起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平,逻辑值0),字符本身有57位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位,或意味半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开始处一定有一个下跳沿。异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小于19.2kbit/s)。在高速传送时,一般要采用同步协议。1.2.2 面向字符的同步协议特点与格式:这种协议的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由字符组成,故被称作面向字符的协议。1.2.3 面向比特的同步协议特点与格式:特点是所传输的一帧数据可以是任意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面向比特”的协议。帧信息的分段SDLC/HDLC的一帧信息包括以下几个场(Filed),所有场都是从有效位开始传送。1.3 VC+软件简介1.3.1 VC+6.0VC+6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C+语言的要求编写,并加入了微软提供的功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。在VC+中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC+访问串口。下面主要简述前一种方法。1.3.2 VC+的Microsoft Communications Control控件Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。该控件有很多自己的属性,可以通过它的属性窗口来设置,也可以用程序设置。用程序设置,更灵活。以下介绍设置中遇到的几个相关函数。SetCommPort:指定使用的串口。GetCommPort:得到当前使用的串口。SetSettings:指定串口的参数。一般设为默认参数9600,N,8,1。这样方便与其他串口进行通讯。GetSettings:取得串口参数。SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。GetPortOpen:取得串口状态。GetInBufferCount:输入缓冲区中接受到的字符数。SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。GetInPut:读取输入缓冲区。GetOutBufferCount:输出缓冲区中待发送的字符数。SetOutPut:写入输出缓冲区。一般而言,使用上述函数和属性就可以进行串口通讯了。第二章 系统设计2.1 建立工程打开VC+6.0建立基于对话框的MFC应用程序09250112,如下图所示: 图 2-1应用程序09250112图 2-2 应用程序09250112图2-3 应用程序09250112图2-4 应用程序09250112图 2-5 应用程序092501122.2 在程序中添加MSComm控件首先打开工程对话框,然后单击增加到工程选项,然后双击Components and Controls,再打开Registered ActiveX Controls控件,选择Microsoft Communications Control, version 6.0,点击插入,按默认值添加,多了个电话图标,这是增加后串口通信控件。如下图所示:图2-6 插入MSComm控件图2-7 插入MSComm控件图2-8 插入MSComm控件2.3 布局删除确认、取消和提示框,添加“电话”、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局,如图 2-9 所示:图 2-9 布局2.4 初始化串口:设置MSComm控件的属性首先打开工具栏的查看,选择建立类向导MFC ClassWizard,在选择Member Viariable,打开ClassName为CmytestDlg的类,Control ID为MSCOMM1,双击它,为它添加控制变量m_ctrlComm类似的,选择其它项修改,改后如图2-10:图2-10 设置MSComm控件的属性对CMytestDlg:OnInitDialog()函数中写入对串口的初始化语句,串口初始化语句由IDC_MSCOMM1的CMSComm控制变量m_ctrlComm来设置串口控件属性。代码如下:/ mscommDlg.cpp : implementation file#include stdafx.h#include mscomm.h#include mscommDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMscommDlg dialogCMscommDlg:CMscommDlg(CWnd* pParent /*=NULL*/): CDialog(CMscommDlg:IDD, pParent)/AFX_DATA_INIT(CMscommDlg)m_recv1 = _T();m_send1 = _T();m_recv2 = _T();m_send2 = _T();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CMscommDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMscommDlg)DDX_Control(pDX, IDC_MSCOMM2, m_mscom2);DDX_Control(pDX, IDC_MSCOMM1, m_mscom1);DDX_Text(pDX, IDC_COM1_RECEIVE, m_recv1);DDX_Text(pDX, IDC_COM1_SEND, m_send1);DDX_Text(pDX, IDC_COM2_RECEIVE, m_recv2);DDX_Text(pDX, IDC_COM2_SEND, m_send2);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMscommDlg, CDialog)/AFX_MSG_MAP(CMscommDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_COM1SEND, OnBtnCom1send)ON_BN_CLICKED(IDC_BTN_COM1DELETE, OnBtnCom1delete)ON_BN_CLICKED(IDC_BTN_COM2DELETE, OnBtnCom2delete)ON_BN_CLICKED(IDC_BTN_COM2SEND, OnBtnCom2send)/AFX_MSG_MAPEND_MESSAGE_MAP()2.5 添加串口事件消息处理函数OnComm()打开工具栏查看按钮,建立类向导MFC ClassWizard,然后选择Message Maps,在Class Name中选择类CmytestDlg,再在Object IDs 中选择IDC_MSCOMM1,然后在Message中双击消息OnCom,在弹出的对话框中将函数名改为OnComm(好记),单击“OK”,就加入了串口事件的消息处理函数,如图2-11图 2-11 添加消息处理函数然后编写OnComm()中的代码,主要任务是从串口接收数据并显示在接收编辑框中。2.6 发送数据先为发送按添加一个单击消息BN_CLICKED处理函数,打开ClassWizard,选择Message Maps,打开类CMytestDlg,IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,如图2-12图 2.12 BN_CLICKED处理函数然后在函数中添加代码/ CMscommDlg message handlersBOOL CMscommDlg: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_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 /初始化COM1m_mscom1.SetCommPort(1); /串口1 m_mscom1.SetInBufferSize(1024); /设置输入缓冲区的大小,Bytes m_mscom1.SetOutBufferSize(512); /设置输入缓冲区的大小,Bytes if(!m_mscom1.GetPortOpen() /打开串口 m_mscom1.SetPortOpen(true);m_mscom1.SetInputMode(1); /设置输入方式为二进制方式 m_mscom1.SetSettings(9600,n,8,1); /设置波特率等参数 m_mscom1.SetRThreshold(1); /为1表示有一个字符即引发事件 m_mscom1.SetInputLen(0); /初始化COM2m_mscom2.SetCommPort(2); /串口2 m_mscom2.SetInBufferSize(1024); /设置输入缓冲区的大小,Bytes m_mscom2.SetOutBufferSize(512); /设置输入缓冲区的大小,Bytes if(!m_mscom2.GetPortOpen() /打开串口 m_mscom2.SetPortOpen(true);m_mscom2.SetInputMode(1); /设置输入方式为二进制方式 m_mscom2.SetSettings(9600,n,8,1); /设置波特率等参数 m_mscom2.SetRThreshold(1); /为1表示有一个字符即引发事件 m_mscom2.SetInputLen(0);return TRUE; / return TRUE unless you set the focus to a controlvoid CMscommDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ 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 CMscommDlg: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 CMscommDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;BEGIN_EVENTSINK_MAP(CMscommDlg, CDialog) /AFX_EVENTSINK_MAP(CMscommDlg)ON_EVENT(CMscommDlg, IDC_MSCOMM1, 1 /* OnComm */, OnCommMscomm1, VTS_NONE)ON_EVENT(CMscommDlg, IDC_MSCOMM2, 1 /* OnComm */, OnCommMscomm2, VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()/MSComm1控件发出OnComm事件的响应函数,在该函数中读取串口字符串void CMscommDlg:OnCommMscomm1() / TODO: Add your control notification handler code hereUpdateData(TRUE);/定义一些临时变量VARIANT variant_inp; COleSafeArray safearray_inp; long i=0;int len;BYTE rxdata1000;switch(m_mscom1.GetCommEvent() case 2: /表示接收缓冲区内有字符/读取缓冲区数据 variant_inp=m_mscom1.GetInput();/将VARIANT型变量值赋给ColeSafeArray类型变量 safearray_inp=variant_inp;/获得数据长度 len=safearray_inp.GetOneDimSize();/将数据保存到字符数组中 for(i=0;ilen;i+) safearray_inp.GetElement(&i,&rxdatai); /字符串结束rxdatai=0; m_recv1 += rxdata; UpdateData(false);break;default:break;/COM1发送数据响应函数void CMscommDlg:OnBtnCom1send() / TODO: Add your control notification handler code hereUpdateData(TRUE);CByteArray sendArr;WORD wLen;/获得发送数据长度wLen=m_send1.GetLength();/给变量sendArr设置长度 sendArr.SetSize(wLen);/把数据赋给CByteArray类型变量用于发送数据for(int i=0;iwLen;i+)sendArr.SetAt(i,m_send1.GetAt(i);/发送数据 m_mscom1.SetOutput(COleVariant(sendArr);/删除COM1发送数据框数据void CMscommDlg:OnBtnCom1delete() / TODO: Add your control notification handler code herem_send1=;UpdateData(FALSE);/MSComm2控件发出OnComm事件的响应函数,在该函数中读取串口字符串void CMscommDlg:OnCommMscomm2() / TODO: Add your control notification handler code hereUpdateData(TRUE);/定义一些临时变量VARIANT variant_inp; COleSafeArray safearray_inp; long i=0;int len;BYTE rxdata1000;switch(m_mscom2.GetCommEvent() case 2: /表示接收缓冲区内有字符/读取缓冲区数据 variant_inp=m_mscom2.GetInput();/将VARIANT型变量值赋给ColeSafeArray类型变量 safearray_inp=variant_inp;/获得数据长度 len=safearray_inp.GetOneDimSize();/将数据保存到字符数组中 for(i=0;ilen;i+) safearray_inp.GetElement(&i,&rxdatai); /字符串结束rxdatai=0; m_recv2+= rxdata; UpdateData(false);break;default:break;/COM2发送数据响应函数void CMscommDlg:OnBtnCom2send() / TODO: Add your control notification handler code hereUpdateData(TRUE);CByteArray sendArr;WORD wLen;/获得发送数据长度wLen=m_send2.GetLength();/给变量sendArr设置长度 sendArr.SetSize(wLen);/把数据赋给CByteArray类型变量用于发送数据for(int i=0;iwLen;i+)sendArr.SetAt(i,m_send2.GetAt(i);/发送数据 m_mscom2.SetOutput(COleVariant(sendArr);/删除COM2发送数据框数据void CMscommDlg:OnBtnCom2delete() / TODO: Add your control notification handler code herem_send2=;UpdateData(FALSE);第三章 串口通信调试3.1 计算机串口设置进入Windows中“我的电脑”系统属性,在“设备管理器”列表中有端口COM和LPT设备信息,选中通信端口COM1,查看其属性,在COM1端口属性的端口设置选项中,将其波特率(即每秒位数)设为9600,停止位设为1,如图3.1-3.2所示,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年小学生走进大自然植物观察日记
- 脑梗塞患者的心理护理与支持
- 2026年应急预案编制与管理规范
- 2026年校长返岗后学校后勤精细化管理
- 热点七“反向接话”亲子互动(练习)-高考语文高频热点命题练习卷
- 生态旅游可持续发展规划协议
- 2026年职场贵人识别与职场人脉分层管理
- 咖啡烘焙设备维修保养协议书
- 瑜伽普拉提赛事裁判培训合同2026年
- 压力管理咨询服务协议书
- 上海市闵行区2024-2025学年高三上学期学业质量调研(一模)地理试题(含答案)
- 2026年电气工程及其自动化试题预测试卷含答案详解【研优卷】
- 湖南省长郡教育集团2026届中考四模历史试题含解析
- 2026年临床医学检验临床基础检验模拟题库附参考答案详解(完整版)
- 2026中国武夷实业股份有限公司招聘笔试历年参考题库附带答案详解
- 2026年二级注册计量师提分评估复习及答案详解【新】
- 电梯使用管理与维修保养规则
- 国企运营岗位招聘笔试题
- 2025-2030中央空调系统节能改造项目经济效益测算及推广实施细则
- 环境监测数据质量管理制度-环境检测机构模版-2026版
- 部编版道德与法治2年级下册《少年当自强》教学设计
评论
0/150
提交评论