实验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;
实验1 串口通信实验



