Windows API串口编程详解
文章目录
(一)Windows API串口通信编程概述
(二)Windows串口通信相关API函数
2.1打开和关闭串口
1.打开串口
CreateFile()函数声明如下:
2.关闭串口
CloseHandle函数声明如下:
2.2串口配置和串口属性
1.串口配置
GetCommState()函数声明如下:
BuildCommDCB函数,函数声明如下:
2.缓冲区控制
PurgeComm()函数的声明如下:
2.3读写串口
1.读串口操作
ReadFile()函数声明如下:
2.写串口操作
WriteFile()函数声明如下:
3. 异步I/O操作
GetOverlappedResult()函数可声明为:
4.超时设置
超时结构定义如下:
GetCommTimeouts()函数。该函数声明如下:
SetCommTimeouts()函数。该函数声明如下:
5.通信状态和通信错误
ClearCommError()函数的声明如下:
COMSTAT结构声明如下:
2.4通信事件
1.通信事件
2.操作通信事件
SetCommMask函数的声明如下:
etCommMask()函数声明如下:
3.监听通信事件
WaitCommEvent()函数声明如下:
(一)Windows API串口通信编程概述
1.打开串口
2.配置串口
3.读写串口
4.关闭串口
Windows环境下的串口编程。Windows封装了Windows的通信机制,这种方式称为通信API,Windows程序可以利用Windows通信API进行编程,不用对硬件直接进行操作。这种体系被称为Windows开放式服务体系。
不需要许多协议层的交互式、非实时的通信可以采用Win32通信API来实现。Win32通信API把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作来实现。
(二)Windows串口通信相关API函数
2.1打开和关闭串口
1.打开串口
在32位的Windows系统中,串口和其它设备通信时作为文件处理的。串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。
通信回话以调用CreateFile()开始。CreatFile()为读访问、写访问或读写访问“打开”串口。
CreateFile()函数声明如下:
HANDLE CreateFile
(
LPCTSTR lpszName,//串口名
DWORD fdwAccess,//指定串口访问类型 读/写
DWORD fdwShareMode,//设置共享属性
LPSECURITY_ATTRIBUTES lpsa,//设置安全性结构
DWORD fdwCreate,//指定如果CreatFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,fdwCreate必须设置成OPEN_EXISTING。
DWORD fdwAttrsAndFlags,//描述了端口的各种属性
HANDLE hTemplateFile//指向模板的句柄
)
lpszName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2.
fdwAccess:用来指定串口访问的类型。与文件一样,串口也是可以被打开以供读取、写入或者两者皆有。
GENERIC_READ位读取访问打开端口,GENERIC_WRITE位写访问打开端口。
这两个常数定义如:const GENERIC_READ=0x80000000h;
const GENERIC_WRITE=0x40000000h;
用户可以用逻辑操作将这两个标识符连接起来,为读/写访问权限打开端口。因为大部分串口通信都是双向的,因此常常在设置中将这两个标识符连接起来使用。如:
fdwAccess=GENERIC_READ|GENERIC_WRITE;
fdwShareMode
指定该端口的共享属性。该参数是为那些由许多应用程序共享的文件提供的。对于不能共享的串口,它必须设置为0.这就是文件与通信设备之间的主要差异之一。如果当前程序调用了CreateFile(),另一个应用程序已经打开了串口,该函数就会返回错误代码。因为两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享由CreateFile()返回的端口句柄,并且根据安全属性设置,该句柄可以被打开端口的应用程序的子程序所继承。
Ipsa
引用安全性属性结构(SECURITY_ARRTIBUTES),该结构定义了一些属性,例如通信句柄如何被打开端口的应用程序的子程序所继承。将该参数设置为NULL将为该端口分配缺省的安全性属性。子应用程序所继承的缺省属性是该端口不能被继承的。
安全属性结构声明如下:
typedef struct_SECURITY_ARRTIBUTE
{
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ARRTIBUTE;
SECURITY_ARRTIBUTES结构成员nLength指明该结构的长度,lpSecurityDescriptor指向一个安全描述字符,bInheritHandle表明句柄是否能被继承。
fdwCreate
指定如果CreatFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,fdwCreate必须设置成OPEN_EXISTING。该标志告诉Windows不用企图创建新端口,而是打开已经存在的端口。
OPEN_EXISTING常数被定义为:
const OPEN_EXISTING =3;
fdwAttrsAndFlags
描述了端口的各种属性。对于文件来说,有可能具有很多属性,但对于串口,唯一有意义的设置是FILE_FLAG_OVERLAPPED。当创建时指定该设置,端口I/O可以在后台进行(后台I/O也叫异步I/O)。FILE_FLAG_OVERLAPPED常数定义如下:
const FILE_FLAG_OVERLAPPED=0x40000000h
hTemplatefFile
指向模板的句柄,当端口处于打开状态时,不使用改参数,因而必须设置成0。
实例:
调用CreatFile函数打开COM1串口操作的例子:
HANDLE hCom;
DWORD dwError;
hCom=CreateFile
(
“COM1”, // 文件名
GENERIC_READ | GENERIC_WRITE, // 允许读和写
0, // 独占方式
NULL,
OPEN_EXISTING, // 打开而不是创建
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 重叠方式
NULL
);
if(hCom = = INVALID_HANDLE_VALUE)
{
dwError=GetLastError(); // 处理错误
}
一旦串口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm()实现其它初始化工作。也可以不调用SetupComm()函数,Windows系统也会分配缺省的发送和接收缓冲区,并且初始化端口。但为了保证缓冲区的大小与实际需要的一致,最好还是调用该函数。SetupComm()函数声明如下:
BOOL SetupComm
(
HANDLE hFile, // 通信设备句柄
DWORD dwInQueue, // 输入缓冲区大小
DWORD dwOutQueue // 输出缓冲区大小
);
SetupComm()函数中各项含义说明如下:
hFile
由CreatFile()返回的指向已打开端口的句柄。
dwInQueue和dwOutQueue
接收缓冲区的大小和发送缓冲区的大小。这两个定义并非是实际的缓冲区的大小,指定的大小仅仅是“推荐的”大小,而Windows可以分配任意大小的缓冲区。Windows设备驱动程序可以获得这两个数据,并不直接分配大小,而使用来优化性能和避免缓冲区超限。
注意:当使用CreatFile()函数打开串口时:为实现调制解调器的排他性访问,共享标识必须设为零;创建标识必须设为OPEN_EXISTING;模板句柄必须置为空。
2.关闭串口
关闭串口比打开串口简单得多,只需要调用CloseHandle()函数关闭由CreatHandle()函数返回得句柄即可。
CloseHandle函数声明如下:
BOOL CloseHandle
(
HANDLE hObject // 需关闭的设备句柄
);
使用串口时一般要关闭它,如果忘记关闭串口,串口就会始终处于打开状态,其它应用程序就不能打开并使用串口了。
2.2串口配置和串口属性
CreatFile()打开串口后,系统将根据上次打开串口时设置的值来初始化串口,可以集成上次打开操作后的数值,包括设备控制块(DCB)和超时控制结构(COMMTIMEOUTS)。如果是首次打开串口,Windows操作系统就会使用缺省的配置。
1.串口配置
使用GetCommState()获取串口得当前配置,使用SetCommState()重新分配串口资源的各个参数。
GetCommState()函数声明如下:
BOOL GetCommState
(
HANDLE hFile, // 通信设备句柄
LPDCB lpDCB // 指向device-control block structure的指针
);
参数说明:
hFile
由CreatFile()函数返回的指向已打开串口的句柄。
lpDCB
一个非常重要的结构——设备控制块DCB(Device Control Block)
DCB结构的主要参数说明如下:
·DCBLength: 一字节为单位指定的DCB结构的大小。
·Baudrate: 用于指定串口设备通信的

本文详细介绍了Windows下串口通信的API函数,包括串口的打开与关闭、配置与属性设置、读写操作及事件处理等内容,适用于串口编程的学习与实践。
最低0.47元/天 解锁文章

1416

被折叠的 条评论
为什么被折叠?



