当前位置:文档之家› RS232串口通信

RS232串口通信

RS232串口通信小结在Microsoft Windows下开发串口通信程序通常有如下几种方法:利用wIndowsAPI 通信函数。

利用Windows 的读写端口函处_inp,-inpw,_inpd,_outp,_outpw,_outpd(Windows95系列下)或开发驱动程序(Windows NT系列下)直接对串口进行操作。

利用第三方提供或自己编写的通信类.使用串口通信组件,如ActiveX控件MSComm。

以下几种方法中第一种(即API函数法)使用面较广,但由于比较复杂,使用较困难。

第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高。

第三种方法使用面向对象技术封装W1n32API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方使地使用,但编写能普通应用的这种类相当困难。

第四种方法较简单,只需要对串口进行简单配置,唯一比较困难的地方在于令人费解的V ARIANT类。

以下只简单介绍第一种(利用Windows API函数)和第四种(使用串口通信组件)方法API函数法(即第一种方法)可以说是在Windows环境下编写串口通信程序的基本方法,下面介绍的大部分内容对于其他3种方法都能适用。

第一种:API函数法1.API函数法与以往DOS下串口通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。

串行口在WED32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win32提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。

API是附带在Windows内部的一个极其重要的组成部分。

Windows的32位API主要是一系列很复杂的函数和消息集合,它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。

与串口通信有关的Windows API函数大概有20多个,如下所示:BuildCommDCBBuildCommDCBAndTimeoutsClearCommBreakClearCommErrorCommConfigDialogEscapeCommFunctionGetCommConfigGetCommMaskGetCommModemStatusGetCommPropertiesGetCommStateGetCommTimeoutsGetDefaultCommConfigPurgeCommSetCommBreakSetCommConfigSetCommMaskSetCommStateSetCommTimeoutsSetDefaultCommConfigSetupCommTransmitCommCharWaitCommEvevt在一个程序中并不是以上这些API都是必须用的,比如说要检测当前串口的设置可以只用SetCommState,而不用GetCommProperties和GetCommConfig,虽然它们返回的信息可能更多;同样,如果有些值需要用缺省的,比如缓冲区的大小和超时的时间等,那么SetupComm和BuildCommDCBAndTimeouts, SetCommTimeouts也可以不用, TransmitCommChar是马上在发送序列中优先插入发送一个字符用的.下面将简单介绍一下经常用到的API和使用API编写串口程序的一般步骤.(1)打开串口使用CreatFile函数可以打开串口。

通常有两种方法可以打开串门,一种是同步方式(NonOverlapped),另外一种异步方式(Overlapped)。

使用异步方式打开时,适用的方法是:HANDLE hComm;hComm = CreatFile( gszPort;//gszPort值为“comn”(n为串口号),作为文件名打开串口GENERIC_READ\GENERIC_WRITE, //读写0,//注意:串口为不共享设备,本参数(共享方式)应设为00,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,//异步方式0);if(hComm == INV ALID_HANDLE_V ALUE)/////串口打开失败,错误处理!(2)配置串口DCB(Device Control Block)结构定义了串口通信设备的控制设置。

许多重要设置都是在DCB结构中设置的,有3种方式可以初姑化DCB。

1)通过GetCommState函数得DCB的初始值.2)用BuildcommDCB函数初始化DCB结构,该函数填充DCB的数据传榆率、奇偶校验类型、数据位、停止位。

对于流控成员函数设置了缺省值。

3)用SetCommState函数手动设置DCB初值,手动设置DCB值时、DCB的结构的各成员的含义,可以参看MSDN帮助。

(3)流控设置流控有如下两种设置:硬件流控:串口通信中的硬件流控有两种、DTE/DSR方式和RTS/CTS方式、这与DCB结构的初始化有关系,DCB结构中的OutxCtsFlow,fOutDstrFlow,fDsrSensitivity,fRtsControl,fDtrControl几个成员的初始值很关键,不同的值代表不同流拄,也可以自己设置流控,但建议采用标准流行的流控方式。

采用硬件流控时,DTE,DSR,RTS,CTS的逻辑位直接影响到数据的读写及收发数据的缓冲区控制。

软件流控:串口通信中采用特殊字符XON和XOFF作为控制串口数据的收发,与此相关的DCB成员是:fOut,fInX,XoffChar,XonChar,XoffLim和XonLim(4)串口读写方式:串口读写有两种方式:同步方式(NonOverlapped)和异步方式(Overlapped)。

同步方式是指必须完成了读写操作,函数才返回,这可能会使程序失去响应,因为如果在读写时发生了错误,永远不返回就会出错,可能线程将停在原地。

而界步方式则灵活得多,一旦读写不成功,就将读写挂起,函数直接返回,可以通过GetLastError函数得知读写未成功的原因,所以串口读写常常采用异步方式操作.ReadFile()函数用于完成读操作。

写操作与读操作相似,不再详述,它调用的APl函数是WriteFile()。

(5)关闭串口程序结束或需要释放串口资源时,必须正确关闭串口。

关闭串口比较简单,调用CloseHandle函数关闭串口的句柄即可。

CloseHandle(hComm);值得注意的是在关闭串口之前必须保证读写串口线程已经退出,否则会引起误操作,一般采用的办法是使用事件驱动机制,启动一事件,通知串口读写线程强制退出,在线程退出之前,通知主线程可以关闭串口。

(6)其他问题串口通信中其他必须处理的问题主要有如下几个:检测通信事件:错误处理和通信状态:WaitCommEvent函数返回时,只是指出了如CTS等等状态有变化。

但要了解具体变化情况必须使用GetCommEvent函数来获得串口线路状态更详细的信息。

2.串口操作方式(1)同步方式同步(NonOverLapped)方式是比较简单的一种方式,编写的代码长度要明显少于异步(OverLapped)方式。

同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间己到时才返回。

(2)异步方式在异步方式中,利用windows的多线程结构,可以让串口的读写操作在后台进行,而应用程序的其他部分在前台执行。

(3)查询方式查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间,它交际上是同步力式的—种派生。

(4)事件驱动方式若对端口数据的响应时间要求较严格,可采用事件驱动力式。

事件驱动方式通过设置事件通知,当所希望的事件发生时,winows发出该事件已发生的通知,这与DOS环境下的中断方式很相似。

Windows定义了9种串口通信事件,较常用的有以下3种:EV_RXCHAR:接收到一个字节,并放入输入缓冲区。

EV_TXEMPTY:输出缓冲区中的最后一个字符,发送出去.EV_RXFLAG:接收到事件字符(DCB结构中EvtChar成员),放入输入缓冲区。

(5)总结。

在一般要求情况下,查询方式是一种最直接的读串口方式。

但定时查询存在一个致命弱点,即查询是定时发生的,可能发生得过早或过晚。

在数据变化较快的情况下,特别是主控计算机的串口通过扩展板扩展至多个时,需定时地对所有串口轮流查询,此时容易发生数据的丢失。

虽然定时间隔越小,数据的实时件越高,但系统的资源也被占去越多。

Windows中提出文件读写的异步方式,主要是针对文件I/O相对较慢的速度而进行的改进,它利用了Windows的多线程结构。

虽然在windows中没有实现任何对文件I/O的异步操作,但它却能对串口进行异步操作。

采用异步方式,可以提高系统的整体性能,在对系统强壮性要求较高的场合.建议采用这种方式。

事件驱动方式是一种高效的串口读方式。

这种方式的实时性较高,特别是对于扩展了多个串口的情况,并不要求像查询方式那样定时地对所有串口轮流查询,而是像中断方式那样,只有当设定的事件发生时,应用程序得到Windows操作系统发出的消息后,才进行相应处理,以避免数据丢失。

第四种方法一、MSComm控件Microsoft Communications Control[(以下简称MSComm)是Micmsoft公司提供的简化windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法,在Visual C++,Visual Basic,DelPhi等语言中均可使用。

本节将简单介织一下MSComm 控件的的使用方法。

1.MSComm控件两种处理通信的方式MsComm控件提供下列两种处理通信的方式:事件驱动方式和查询万式(1)事件驱动方式事件驱动方式是处理串行端口交互作用的一种非常有效的方法。

在许多情况下,事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect或Request To Send(RTS)线上一个字符到达或一个变化发生时。

在这些情况下,可以利用MsComm控件的OnComm事件捕获并处理这些通信事件;oncomm事件还可以检查和处理通信错误(所有通信事件和通信错误的列表,请参阅CommEvent属性),在OnComm事件处理函数中加入自己的处理代码。

事件驱动方法的优点是程序响应及时,可靠性高。

每个MsComm控件对应着一个串行端口。

如果应用程序需要访问多个串行端口,必须使用多个MsComm控件。

相关主题