串行通信中的关键是串行通信设备的初始化、数据的发送和接收及其实现方式。
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
在Dos环境下,用户可以直接对通信设备编程,可以通过查询中断的方式使用通信设备。但是Windows不提倡应用程序直接控制硬件,而是通过Windows所提供的设备驱动程序来进行数据传递。在Windows环境中,通信支持中断功能,当通信设备接收到一个输入字符的时候就产生一个硬件中断,该中断暂停应用程序的执行,并把接收到的字符存入到一个叫接收数据队列的内存缓冲区中。而待发数据也先存入到一个叫发送数据队列的内存缓冲区中,再由Windows系统负责在后台进行发送。因此,在Windows下接收和发送数据的关键就是如何从接收队列取数据和如何向发送数据队列发数据。Windows提供了相应的API函数来实现这些功能。
WWW_P※LCJS_COM-PLC-)技.术_网
P.L.C.技.术.网——可编程控制器技术门户
串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作。在Win32环境下,可以把串口看作由文件系统访问的设备。使用标准的CreateFile()函数打开端口,再使用ReadFile()和WriteFile()函数读写数据,就如同端口只是一个文件对象一样。对于串行通信,Win 32提供了相应的文件I/O函数与通信函数,使用这些函数,可以编制出符合不同需要的通信程序。
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
通常实现串行通信的步骤如下:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
plcjs.技.术_网
1 ) 按协议的设置初始化并打开串行口,这样做就是通知Windows本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
2) 配置这个串行口。
WWW_PLCJS@_COM%-PLC-技.术_网
WW.W_PLCJS_COM-PLC-技.术_网
3) 在串口上往返地传输数据,并在传输过程中进行校验。
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW.PLCJS.COM——可编程控制器技术门户
4) 不需要此串口时,关闭串口,即释放串口以供其它应用程序使用。
WWcW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
在这四个步骤中,主要的程序代码集中在第3步。
WWW_PL※CJS_COM-PLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
本文就Win32环境下基于VC++开发串口通信三种方式的编程问题展开讨论。
WWcW_PLCJS_COM-PLC-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
1采用MFC串口通信编程
P.L.C.技.术.网——可编程控制器技术门户
WWW_P※LCJS_CO※M-PLC-技-.术_网
Win32系统把文件的概念进行了扩展,无论是文件、通信设备、命名管道、邮件槽、磁盘还是控制台都被看作是文件。因此,可以用MFC中的CFile类来实现对串口的操作,并且Win32中的文件I/O函数支持重叠式输入输出,这使得线程从费时的I/O操作中解放出来。Win32 API包含了一系列访问通信资源的通信函数。
WWW_PLCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
通常采用MFC的串口通信编程主要步骤如下:
P.L.C.技.术.网——可编程控制器技术门户
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
1)在MainFrmcpp中定义全局变量
WWW_PLC※JS_COM-PmLC-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
HANDLE hCom;//准备打开的串口的句柄
WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PmLC-技.术_网
2)打开串口
WW.W_PLC※JS_C,OM-PL,C-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
Windows通信会话以调用CreateFile()函数打开串行口开始。通信程序从CreateFile处指定串口设备及相关的操作属性,并返回一个句柄,该句柄将被用于后续的通信操作。
WWW_P※LCJS_COM-PLC-)技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
3)串口初始化(设置串口参数及进行串口超时设置)
WW.W_PLCJS_COM-PLC-技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
在打开通信设备句柄后,通常要对串口进行初始化工作(即配置参数如波特率、数据位数、停止位数、奇偶校验以及握手和流控协议等),配置串口通过改变数据结构——设备控制块DCB(Device Control Block)来实现。结构DCB有近30个数据成员,对于采用3线方式的串行通信来说,只要设置好波特率、数据位、停止位、校验位等几个关键参数就可以。
W1WW_P4LCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
调用GetCommState函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。要修改串口配置,应该先修改串口的DCB结构,然后调用SetCommState函数用指定的DCB结构来设置串口。
WWW_PLCJS@_COM%-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
除了在结构DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。超时设置是为了避免当通信过程中由于数据传输突然中断时而造成对串口的读写操作进入无限期的等待状态。超时设置过程分为两步,首先设置超时结构COMMTIMEOUTS中的五个成员,然后调用SetCommTimeouts()函数设置超时值。
WWcW_PLCJS_COM-PLC-技.术_网