1.微软应用程序接口
Windows是多任务的操作系统。除了协调应用程序的执行、分配内存、管理系统资源……之外,它同时也是一个很大的服务中心。调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的。由于这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interface,简称API函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
Api内容丰富,功能很强,种类繁多。其中有串口通信的多个函数,用来处理通信是很方便的。有关用于串口通信的函数较多,但主要有4个,即串口设定与打开CreateFile()、串口写数据WriteFile()(发送通信命令)、串口接收数据ReadFile()及串口关闭CloseHandle()。
用VC编写Api函数通信程序有4个要点,按这4个要点组织程序就可以了。这4要点是:串口建立及打开,发送数据,接收数据及关闭串口。以下列出这4个要点的VC程序。当然,为装载这些代码,还得有个容器。最简单可用对话框。
用VC编程,调用Api函数,先写好头文件调用语句就可以了。所以较方便。而用VB编程,用前要先按VB的格式定义该函数。以下就是口设定及打开(CreateFile)与口关闭(CloseHan-dle)函数声明。
Public Declare Function CreateFile Libkernel32AliasCreateFileA(ByVal lpFileName As String,ByVal dwDesiredAccess As Long,ByVal dwShareMode As Long,lpSecurityAttributes As SECURITY_ATTRIBUTES,ByVal dwCreationDisposition As Long,ByVal dwFlagsAndAttributes As Long,ByValhTemplateFile As Long)As Long
Public Declare Function CloseHandle Libkernel32AliasCloseHandle(ByVal hObject As Long)As Long
但使用Api函数,还必须先弄清有关通信协议。不清楚协议,通信程序是无法编写的。
VC通信程序可以使用API(Application Program Interface,应用程序接口)函数。Windows除了协调应用程序的执行、分配内存、管理系统资等之外,同时也是一个很大的服务中心,提供了上千个API函数,为编程提供很大的方便。凡是在Windows工作环境底下执行的应用程序,都可以调用Windows API。
(1)串口通信用API函数。
CreateFile,打开串口;
GetCommState,读取串口通信参数;
SetCommState,设置串口通信参数;
BuilderCommDCB,用字符串中的值来填充设备控制块;
GetCommTimeouts,读取通信超时参数;
SetCommTimeouts,设置通信超时参数;
SetCommMask,设置被监控事件;
WaitCommEvent,等待单个被监控事件发生;
WaitForMultipleObjects,等待多个被监测对象的结果;
WriteFile,发送数据,即写串口;
ReadFile,接收数据,即读串口;
GetOverlappedResult,返回最后重叠(异步)操作结果;
PurgeComm,清空串口缓冲区,退出所有相关操作;
ClearCommError,更新串口状态结构体,并清除所有串口硬件错误;
CloseHandle,关闭串口。
(2)串口通信程序要点。
串口通信有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,调用的API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
无论哪种操作方式,一般都通过四个步骤来完成:即打开串口、配置串口、读写串口及关闭串口。
1)打开串口。用API函数CreateFile来打开或创建。该函数的原型为:
其中,
lpFileName:将要打开的串口逻辑名,如“COM1”;
dwDesiredAccess:指定串口访问的类型,可以是读、写或读写共三种方式;
dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;
lpSecurityAttributes:引用安全性属性结构,默认值为NULL;
dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;
dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作FILE_FLAG_OVER-LAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;
hTemplateFile:对串口而言该参数必须置为NULL;
2)配置串口。在打开串口,获得通信设备句柄后,需要对串口进行配置。为此,要用到DCB(Device Control Block,设备控制块)结构。DCB结构包含了串口通信的各项参数设置,诸如波特率、数据位数、奇偶校验和停止位数等信息。下面仅介绍该结构几个常用的参数:
除了上述设置,一般还要设置I/O缓冲区大小和超时值。Windows用I/O缓冲区来暂存串口输入和输出的数据,调用SetupComm函数可以设置串口的输入和输出缓冲区的大小。即
(www.daowen.com)
在读写串口时,需要考虑超时问题。超时的作用是指在指定的时间内没有读取或发送指定数量的字符,读写仍然会结束。
要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。经验证明COMMTIMEOUTS结构中各个参数的设置将会影响到通信效率。在保证正确通信的前提下,各个参数的值越小,通信速度越快。
3)读写串口。可以使用ReadFile和WriteFile读写串口,下面是这两个函数:
在使用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠执行。同步执行时,函数直到操作完成后或设置的超时时间到才返回,这意味着当前线程被阻塞,从而导致效率下降。重叠执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作可以在后台进行。
如果操作成功,这两个函数都返回TRUE。需要注意的是当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING,这说明重叠操作还未完成。
4)关闭串口。利用API函数关闭串口非常简单,只需使用CreateFile函数返回的句柄作为参数调用CloseHandle即可。
2.【实例1】计算机与和利时LM机Modbus协议通信VC编程
图6-121所示为计算机与该例VC程序对话框。
图6-121 计算机与PLC串口Modbus协议通信VC程序对话框
从图6-121可知,它已向PLC发送读取%MW308的命令,并得到相应的回应。该程序可用以读取I、Q区位信息,强制Q区的位及读写M区字。程序代码由打开与设置串口、通信过程及关闭串口3部分组成。当然还要对所用变量、函数等做必要声明。
这些变量主要是:
(1)打开与设置串口。
其过程是先打开串口,然后设定通信参数和读写缓冲区大小,最后设置超时参数。
(2)通信过程。
先是生成命令,再是通信处理,最后为校验和显示数据。以调用OnButtonReadM函数(读取PLC M区数据)为例具体说明通信过程。
3.【实例2】计算机与欧姆龙PLCHostLink协议通信VB编程
要求是,可编辑通信命令,并按命令要求实现通信。图6-122所示为其话框。其上有5个“按钮”,3个“文本框”。“按钮”分别为打开通信口(Open Port)、关闭通信口(Close Port)、FCS校验(FCS)、发送(Send)及接收(Receive)。“文本框”分别为命令原码,用以输入通信命令;“命令原码+校验码及结束码”,用以显示FCS计算后的命令码;接收字符,用以显示接收到的字符。
只要运行本程序后,在“命令原码”处键入命令,然后点击FCS校验(FCS)“按钮”,再点击打开通信口(Open Port)“按钮”,再点击发送(Send)“按钮”,再点击接收(Receive),再点击关闭通信口(Close Port)“按钮”,如通信正常,将看到如图6-122所示的情况。
调头文件代码:
这可在与对话框对应的.CPP文件的开头处,加入#includemscomm.h语句就可以了。有关4个要点代码,见下:
串口建立及打开:
图6-122 通信对话框
VC通信程序可处理成多线程的,即在前台处理其他工作的同时,另建立一个线程,在后台处理通信,这既提高了工作速度,又可做到程序的其他任务处理与通信两不误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。