实验1 串口通信实验 - 图文

更新时间:2023-10-01 14:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验1 串口通信实验

【实验目的】

(1)了解串口的通信方式。

(2)掌握串口通信的原理,了解串口通信的编程的初步概念和相应函数,掌握一个具体开发平台下的串口编程。

【实验要求】

本实验将介绍串行通信的基本原理,以及在Windows 2000、Windows 98环境下用MFC实现串口(COM)通信的方法,并用串口通信实现简单的通讯协议。 思考题:

(1)串口通信与网络上的通信有什么不同?

(2)程序中SENDDATA这个union,起到什么样的作用?可不可以用其他类型来代替?

【实验原理】 一、什么是串口

在Windows应用程序的开发中,常常需要面临计算机(或单片机)与外围数据源设备进行通信的问题。设计一个相应的串口通信程序,完成数据通信任务,是一个不错的想法!串行端口的本质功能是作为CPU和串行设备问的编码转换器。当数据从CPU经过串行端口发送出

去时,字节数据转换为串行的位。而在接收数据时,串行的位又被转换为字节数据。 二、串口通信的过程

常用的DOS系统主要是工作在响应中断方式下。PC机串行通信程序大多利用其BIOS块的INT 14H中断,以查询串口的方式完成异步串行通信。与DOS响应中断的工作方式不同,在Windows环境(Windows NT、Windows 98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信。如果想要使用串口进行通信,则必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。Windows系统函数已经包含了通信支持中断功能。Windows系统为每个通信设备开辟了用户定义的输入输出缓冲区(即读/写缓冲区),数据进出通信口均由系统后台来完成,应用程序只需完成对输入输出区操作即可。

详细过程:每接收一个字符,系统产生一个低级硬件中断,Windows系统中的串行驱动程序就取得了控制权,并将接受到的字符放入输入数据缓冲区,然后将控制权返回正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据。队列中的数据按“先进先出”的次序处理。

Windows系统通过使用一个数据结构对串行口和串行通信驱动程序进行配置,该数据结构被称为设备控制块(Device Control Block),简称DCB。 通常可按以下四步实现串行通信:

(1)按协议的设置初始化并打开串行口。这样做的目的是通知Windows本应用程序需要 这个串口,并让其封锁其他应用程序,使它们不能使用此串口。 (2)配置串行口。

(3)在串口上往返的传输数据,并在传输过程中进行校验。在编写程序时,主要的代码 集中在这一步。

(4)不需要此串口时,关闭串口,即释放串口以供其他应用程序使用。 以上四步的具体流程如图所示:

打开串口的方法一般有四种:

(1)以文件方式打开串口。这里使用的是Win32 API函数,所以无论在BCB或VC下都可以实现。具体的函数的意义可以参考Win32 API的帮助。这里有一个易于使用的BCB下的类,可以方便地使用串口。 (2)使用现成的控件。易于使用的是微软的MS CommFuncication控件,它是作为一个.ocx提供的。可以用Import ActiveX Control将它加入到BCB中,缺省是加载在ActiveX页中,就可以作为一个普通的BCB控件来使用了(也有不少第三方提供的其他硬件操作控件)。 (3)直接嵌入汇编法。利用vC的直接嵌入汇编功能,可以在VC程序中用汇编语言直接 对串口进行操作。这种方法可以把原来在DOS下开发的汇编程序经过修改后移植到VC中继 续使用。

【实验步骤】

(1)在MFC的应用程序向导里选择Dialog Based。以下均遵循默认选项。dialog面板布置控件如图所示。

(2)各控件的I【)和Caption如下表: Type Breton Button EditBox EditBox ComboBox Type EditBox EditBox ID IDC_BuTroN_SEND IDC_BUTTON_QUlT IDC_EDIT_SEND IDC Edrr_RECEIVE IDC_COMBO_COM ID IDC_EDIT_SEND IDC_EDIT_RECEIVE Caption Send Quit Variables CString CString 打开Class Wizard为各控件添加控制变量,如下表: (3)接下来为程序添加一个新类,该类用于控制串口的初始化及其超时控制等等。该类 名为:CcomStatus;

●其头文件为ComStams.h

●CComControl的实现文件中本文件中添加几个全局变量: BYTE XwCom=0x40;

BYTE sComl[5],sCom2[MAXBLOCKLENGTH+12],sCom3[MAXBLOCKLENGTH+12]; BYTE opation;

shortComNum; //串口ID CComControl::CComControl() {

m_hCom=NULL;

m_bComId=(char)ComNum;//COM1

m_bBytcSize=8;

m_bStopBits=ONESTOPBIT; m_bParity=NOPARlTY; m_dwBaudRate=9600; m_bEvtChar=EVENTCHAR; m_fBinary=l;

m_bConnected=FALSE; m_bFlowCtrl=FC_XONXOFF; m_fXonXoff=FALSE; }

以下是重载的ComControl构造函数: CComConla-ol::CComControl(BYTE bComId,BYTE bByteSiZC,BYTE bStopBitS. BYTE bParity,DWORD dwBaudRate',‘WORD fChEVL’,chal\ DWORD fBinary) {

m_hCom=NULL: m_bComId=bComId;

m_bByteSize=bByteSize; m_bStopBitS=bStopBitS; m_bParity=bParity;

m_dwBaudRate=dwBaudRate; m_bEvtChar=-bEvtChar; m_fBinary=fBiIlary; m_bConnected=FALSE; m_bROWCtrl=FC_XoNXOFF; m_fXonXoff=FALSE;

OpenConnection函数:此函数用于设置相应参数。例如,超时控制参数CommTimeOuts、 OVERLAPED,确定通信COM口的ID。

SetupConnection函数:用于通过变量dcb对DCB属性进行操作,完成对串口各个属性的配置。在这里请注意参数设置的顺序,以及两个重要函数GetCommstate和SetCommState的使用。理解DCB结构的各个参数的意义是关键。通过计算机串口通信之前,必须根据监控设备的有关通信参数约定双方的通信方式,包括波特率的设置、奇偶校验及停止位的设置等。确定数据传输帧格式,确定UART操作方式。逐个对线路控制寄存器、波特率因子寄存器和MODEM寄存器进行写入操作。

接着,要查询发送流程,只要CPU检测到UART发送器保持寄存器为空,即向UART输出一个字符。发送方首先输出RTS和DTR有效,检测MODEM寄存器。只有收到DECshurude CTS、DSR有效,CPU才向UART输出一发送符。

然后,我们要查询接收流程。只要CPU检测到UART接收器数据准备就绪,即可从接收器数据寄存器中接收字符。接收方首先输出数据中断就绪有效(DTR=1),然后检测MODEM状态寄存器·只有DSR=I,CPU才接收一字符。在API函数的串口通信方法中,DCB参数包含了这些参数的设置。我们只需得到串口的DCB结构变量即可。

IsConnccted函数用于判断连接成功; CloseConnection显式的关闭了串口文件; 我们在实验指导书中只提供了重要的函数,具体细节请同学们自行编写,在完成了程序的编辑之后,对其进行编译连接、运行。此实验过程需要两台计算机和一根串口线。实验比较简单,只实现了数字的传输。在阅读程序时,建议先掌握原理,对程序中的错误处理可以先略去不看,而只看关键代码。 注意:

串行通信程序的调试相对来说是比较麻烦的,一般可以采用以下步骤:

(1)检查连线是否正确。在三线制方式中,要注意“交叉”问题:还要注意握手信号线 14R

的正确连接。

(2)简单的用逻辑笔检查发接信号的有无(注意逻辑笔只能检查TrL信号。因此,检查 点一般为经接口芯片转换后的TXD,RXD)。

(3)在确认有接发信号的前提下,如果接发数据不正常,则重点应检查通信协议是否一 致,例如波特率的设置、奇偶校验、停止位数、通信的应答等设置。

(4)在只有单机的情况下的串口程序调试,可采用将串口的TXD与RXD直接相连的办 法,简单方便。

本文来源:https://www.bwwdw.com/article/ervd.html

Top