首页 理论教育 微软应用程序接口通信编程指南

微软应用程序接口通信编程指南

时间:2023-06-16 理论教育 版权反馈
【摘要】:WIN32API也就是Microsoft Windows 32位平台的应用程序编程接口。其中有串口通信的多个函数,用来处理通信是很方便的。串口通信程序要点串口通信有两种操作方式:同步操作方式和重叠操作方式。在打开串口,获得通信设备句柄后,需要对串口进行配置。同步执行时,函数直到操作完成后或设置的超时时间到才返回,这意味着当前线程被阻塞,从而导致效率下降。

微软应用程序接口通信编程指南

1.微软应用程序接口

Windows是多任务的操作系统。除了协调应用程序的执行、分配内存、管理系统资源……之外,她同时也是一个很大的服务中心。调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的。由于这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interface,简称API函数。WIN32API也就是Microsoft Windows 32位平台的应用程序编程接口。

Api内容丰富、功能很强、种类繁多。其中有串口通信的多个函数,用来处理通信是很方便的。有关用于串口通信的函数较多,但主要有4个,即串口设定与打开CreateFile()、串口写数据WriteFile()(发送通信命令)、串口接收数据ReadFile()及串口关闭Close-Handle()。

用VC编程,调用Api函数,先写好头文件调用语句就可以了。所以较方便。而用VB编程,用前要先按VB的格式定义该函数。以下就是这个口的设定及打开(CreateFile)与口关闭(CloseHandle)函数声明。

Public Declare Function Create FileLib978-7-111-56641-0-Chapter06-164.jpgkernel32978-7-111-56641-0-Chapter06-165.jpgAlias978-7-111-56641-0-Chapter06-166.jpgCreateFileA978-7-111-56641-0-Chapter06-167.jpg(ByVal lpFileName As String,ByVal dwDesiredAccess As Long,ByVal dwShareMode As Long,lpSecurityAttributes As SECURITY_ATTRIBUTES,ByVal dwCreationDisposition As Long,ByVal dwFlagsAndAttributes As Long,ByVal hTemplateFile As Long)As Long

Public Declare Function CloseHandle Lib978-7-111-56641-0-Chapter06-168.jpgkernel32978-7-111-56641-0-Chapter06-169.jpgAlias978-7-111-56641-0-Chapter06-170.jpgCloseHandle978-7-111-56641-0-Chapter06-171.jpg(ByVal hObject As Long)As Long

(1)串口通信用API函数

Create File,打开串口;

GetCommState,读取串口通信参数;

SetCommState,设置串口通信参数;

BuilderCommDCB,用字符串中的值来填充设备控制块;

GetCommTimeouts,读取通信超时参数;

SetCommTimeouts,设置通信超时参数;

SetCommMask,设置被监控事件;

WaitCommEvent,等待单个被监控事件发生;

WaitForMultipleObjects,等待多个被监测对象的结果;

WriteFile,发送数据,即写串口;

ReadFile,接收数据,即读串口;

GetOverlappedResult,返回最后重叠(异步)操作结果;

PurgeComm,清空串口缓冲区,退出所有相关操作;

ClearCommError,更新串口状态结构体,并清除所有串口硬件错误

CloseHandle,关闭串口。

(2)串口通信程序要点

串口通信有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,调用的API函数会阻塞直到操作完成以后才能返回(在线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论哪种操作方式,一般都通过四个步骤来完成:即打开串口、配置串口、读写串口及关闭串口。

1)打开串口。用API函数CreateFile来打开或创建。该函数的原型为

978-7-111-56641-0-Chapter06-172.jpg

978-7-111-56641-0-Chapter06-173.jpg

其中,

lpFileName:将要打开的串口逻辑名,如“COM1”;

dwDesiredAccess:指定串口访问的类型,可以是读、写或读写共三种方式;

dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;

lpSecurityAttributes:引用安全性属性结构,默认值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;

dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;

hTemplateFile:对串口而言该参数必须置为NULL;(www.xing528.com)

2)配置串口。在打开串口,获得通信设备句柄后,需要对串口进行配置。为此,要用到DCB(DeviceControlBlock,设备控制块)结构。DCB结构包含了串口通信的各项参数设置,诸如波特率、数据位数、奇偶校验和停止位数等信息。下面仅介绍该结构几个常用的参数:

978-7-111-56641-0-Chapter06-174.jpg

用CreateFile打开串口后,可以调用GetCommState函数来读取串口通信初始参数。

978-7-111-56641-0-Chapter06-175.jpg

如果需要修改通信参数,可先修改DCB结构,然后再调用SetCommState函数实现所作的更改。即

978-7-111-56641-0-Chapter06-176.jpg

除了上述设置,一般还要设置I/O缓冲区大小和超时值。Windows用I/O缓冲区来暂存串口输入和输出的数据,调用SetupComm函数可以设置串口的输入和输出缓冲区的大小。即

978-7-111-56641-0-Chapter06-177.jpg

在读写串口时,需要考虑超时问题。超时的作用是指在指定的时间内没有读取或发送指定数量的字符,读写仍然会结束。

要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIME-OUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。经验证明COMMTIMEOUTS结构中各个参数的设置将会影响到通信效率。在保证正确通信的前提下,各个参数的值越小,通信速度越快。

3)读写串口。可以使用ReadFile和WriteFile读写串口,下面是这两个函数:

978-7-111-56641-0-Chapter06-178.jpg

在使用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠执行。同步执行时,函数直到操作完成后或设置的超时时间到才返回,这意味着当前线程被阻塞,从而导致效率下降。重叠执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作可以在后台进行。

如果操作成功,这两个函数都返回TRUE。需要注意的是当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING,这说明重叠操作还未完成。

4)关闭串口。利用API函数关闭串口非常简单,只需使用CreateFile函数返回的句柄作为参数调用CloseHandle即可。

978-7-111-56641-0-Chapter06-179.jpg

2.实例:计算机与欧姆龙PLCHostLink协议通信VB编程

要求是可编辑通信命令并按命令要求实现通信。图5-118所示为对其话框。其上有5个“按钮”和3个“文本框”。“按钮”分别为打开通信口(OpenPort)、关闭通信口(Close Port)、FCS校验(FCS)、发送(Send)及接收(Receive)。“文本框”分别为命令原码(用以输入通信命令)、“命令原码+校验码及结束码”(用以显示FCS计算后的命令码)、接收字符(用以显示接收到的字符)。

978-7-111-56641-0-Chapter06-180.jpg

图5-118 通信对话框

只要运行本程序后,在“命令原码”处键入命令,然后用鼠标左键依次点击FCS校验(FCS)、打开通信口(OpenPort)、发送(Send)、接收(Receive)、关闭通信口(Close Port)“按钮”,如通信正常,将看到如图5-118所示的情况。

调头文件代码:

这可在与对话框对应的.CPP文件的开头处,加入#include978-7-111-56641-0-Chapter06-181.jpgmscomm.h978-7-111-56641-0-Chapter06-182.jpg语句就可以了。

有关4个要点代码,见下:

串口建立及打开:

978-7-111-56641-0-Chapter06-183.jpg

978-7-111-56641-0-Chapter06-184.jpg

978-7-111-56641-0-Chapter06-185.jpg

978-7-111-56641-0-Chapter06-186.jpg

978-7-111-56641-0-Chapter06-187.jpg

串口关闭:

978-7-111-56641-0-Chapter06-188.jpg

VC通信程序可处理成多线程的,即在前台处理其它工作的同时,另建立一个线程,在后台处理通信(VB只好用中断了),这既提高了工作速度,又可做到程序的其它任务处理与通信两不误。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈