基于VC++串口通信的实现
关API函数。
在32位windows系统中,串口和其他通信设备都是作为文件处理的。串口的打开、关
闭、读取和写入所有的函数与操作文件的函数完全一致。
打开串口
通信会话以调用CreateFile()开始。CreateFile()为读访问、写访问或读写访问“打开”串
口。按照windows的通常做法,CreateFile()返回一个句柄,随后在打开端口的操作中使用。
CreateFile()函数非常复杂,复杂性的原因之一是他是通用的。可以使用 CreateFile 打开已经
存在的文件,创建新文件和打开根本就不是文件的设备,例如串口、并口、和调制解调器。
CreateFile()函数声明如下:
HANDLE CreateFile(
LPCTSTR lpszName, //lpszName:指定要打开的串口逻辑名,用字符串表示,
例如”COM1”,表示串口1
DWORD fdwAccess, //fdwAccess:用来指定串口访问的类型。与文件一样,
串口也是可以被打开一并读取写入或者两者兼有。
GENERIC_READ为读取访问,GENERIC_WRITE 为写访问
const GENERIC_READ = 0x80000000h;
const GENERIC_WRITE = 0x40000000h;
因为大部分串口通信都是双向的, 所以在设置中通常将
两个标识连接起来使用,
即 fdwAccess = GENERIC_READ|GENERIC_WRITE
DWORD fdwShareMode, //fdwShareMode:指定该端口的共享属性。该参数是为
那些有许多应用程序共享的文件提供的。 对于不能共享
的串口,它必须设为0。这就是文件与通信设备之间的
主要差异之一。 如果在当前的应用程序调用 CreateFile()
时,另一个应用程序已经打开了串口,该函数就会返回
错误代码,原因是两个应用程序不能共享一个端口。然
而, 同一个应用程序的多个线程可以共享由 CreateFile()
返回的端口句柄,并且根据安全性属性设置,该句柄可
以被打开端口的应用程序的子程序所继承。
LPSECURITY_ATTRIBUTES lpsa, //lpsa: 引 用 安 全属性 结构
(SECURITY_ARRTIBUTES) ,该结构定义了一些属
性,例如通信句柄如何被打开端口的应用程序的子
程序所继承。将该参数设置为NULL将为该端口分
配默认的安全性属性。 子应用程序所继承的默认属
性是该端口不能被继承的。
安全属性结构 SECURITY_ATTRIBUTES 声明如下:
typedef struct _SECURITY_ATTRIBUTES{
DWORD nLength;//指明该结构的长度
DWORD lpSecurityDescriptor;//指向一个安全描
述字符
BOOL bInheritHandle;//表明句柄是否能被继承
}SECURITY_ATTRIBUTES;
DWORD fdwCreate, //fdwCreate:指定如果 CreateFile()正在被已有的文件调
用时应采取的动作。因为串口总是存在,fdwCreate 必
须设置成 OPEN_EXISTING。该标志告诉 Windows 不要
企图创 建 新端口,而是打开 已存在的端 口。
OPEN_EXISTING 常数定义为:const OPEN_EXISTING = 3;
DWORD fdwAttrsAndFlags, //fdwAttrsAndFlags:描述了端口的各种属性。对于
文件来说,对于文件来说可能具有很多属性,但对于串
口,唯一有意义的设置是 FILE_FLAG_OVERLAPPED。当
创建时指定该设置, 端口 I/O可以在后台进行(后台 I/O
也叫异步I/O) 。 FILE_FLAG_OVERLAPPED常数定义如下:
const FILE_FLAG_OVERLAPPED = 0x40000000h;
HANDLE hTemplateFile //hTemplateFile:指向模版文件的句柄,当端口处于打开
状态时,不使用该参数,因而必须设置成 0。
)
当使用 CreateFile()函数打开串口时,为实现调制解调器的排他性访问,共享标识
(fdwShareMode)必须设为零;创建标识(fdwCreate)必须设为 OPEN_EXISTING;模板句柄(hTemplateFile)必须设置为空。
以上内容只是毕业设计作品的部分资料介绍,如果了解更多详情请联系客服QQ:57510459
购买帮助>>
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论