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 FileLibkernel32AliasCreateFileA(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 Libkernel32AliasCloseHandle(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来打开或创建。该函数的原型为
其中,
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结构包含了串口通信的各项参数设置,诸如波特率、数据位数、奇偶校验和停止位数等信息。下面仅介绍该结构几个常用的参数:
用CreateFile打开串口后,可以调用GetCommState函数来读取串口通信初始参数。
即
如果需要修改通信参数,可先修改DCB结构,然后再调用SetCommState函数实现所作的更改。即
除了上述设置,一般还要设置I/O缓冲区大小和超时值。Windows用I/O缓冲区来暂存串口输入和输出的数据,调用SetupComm函数可以设置串口的输入和输出缓冲区的大小。即
在读写串口时,需要考虑超时问题。超时的作用是指在指定的时间内没有读取或发送指定数量的字符,读写仍然会结束。
要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIME-OUTS结构。调用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.实例:计算机与欧姆龙PLCHostLink协议通信VB编程
要求是可编辑通信命令并按命令要求实现通信。图5-118所示为对其话框。其上有5个“按钮”和3个“文本框”。“按钮”分别为打开通信口(OpenPort)、关闭通信口(Close Port)、FCS校验(FCS)、发送(Send)及接收(Receive)。“文本框”分别为命令原码(用以输入通信命令)、“命令原码+校验码及结束码”(用以显示FCS计算后的命令码)、接收字符(用以显示接收到的字符)。
图5-118 通信对话框
只要运行本程序后,在“命令原码”处键入命令,然后用鼠标左键依次点击FCS校验(FCS)、打开通信口(OpenPort)、发送(Send)、接收(Receive)、关闭通信口(Close Port)“按钮”,如通信正常,将看到如图5-118所示的情况。
调头文件代码:
这可在与对话框对应的.CPP文件的开头处,加入#includemscomm.h语句就可以了。
有关4个要点代码,见下:
串口建立及打开:
串口关闭:
VC通信程序可处理成多线程的,即在前台处理其它工作的同时,另建立一个线程,在后台处理通信(VB只好用中断了),这既提高了工作速度,又可做到程序的其它任务处理与通信两不误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。