串口学习笔记(一)

一般来说要实现串口通信,在32位模式下有以下4种方法:
1)、以文件方式打开串口
这里使用Win32 API函数来实现,仅对32位Windows环境下的操作流程做一简单介绍。以文件方式对串口进行操作可以分成以下步骤:
i)应用CreateFile()来打开串口
API函数CreateFile()定义如下:
HANDLE CreateFile(
LPCTSTR lpFileName ,//文件名,指定要打开的串口逻辑名,用字符串表示,如“COM1”
DWORD dwDesiredAccess,//访问模式
DWORD dwShareMode,//共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes,//通常为NULL
DWORD dwCreatinonDistribution,//创建方式
DWORD dwFlagAndAttributes,//创建属性和标志
HANDLE hTemplateFile//临时文件的句柄,通常为NULL
);
dwShareMode:指定该端口的共享属性。该参数是为那些由许多应用程序共享的文件提供的。对于不能共享的串口,它必须置为0。这就是文件与通信设备之间的主要差异之一。如果在当前的应用程序调用CreateFile()jf,另一个应用程序已经打开了串口,该函数就会返回错误代码,原因是两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享同CreateFile()返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。
lpSecurityAttributes:引用安全属性结构(SECURITY_ARRTIBUTES),该结构定义了一些属性,例如通信句柄如何被打开端口的应用程序的子程序所继承。将该参数设置为NULL将为该端口分配默认的安全性属性。子应用程序所继承的默认属性是该端口中不能被继承的。
dwCreatinonDistribution:指定如果CreateFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,dwCreatinonDistribution必须设置成OPEN_EXISTING。该标志告诉Windows不要企图创建新端口,而是打开已经存在的端口。
dwFlagAndAttributes:描述了端口的各种属性。对于文件来说,有可能具有很多属性,但对于串口,唯一有意义的设置是FILE_FLAG_OVERLAPPED。当创建时指定该设置,端口I/O可以在后台进行(后台I/O也叫异步I/O)。FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED(重叠方式)。
hTemplateFile:指向模板文件的句柄,当端口处于打开状态时,不使用该参数,因而必须置成0。
如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。
一旦端口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm()实现其他初始化工作。也可以不调用SetupComm()函数,Windows系统也会分配默认的发送和接收缓冲区,并且初始化端口。但为了保证缓冲区的大小与实际需要的一致,最好还是调用该函数。SetupComm()函数声明如下:
BOOL SetupComm(
HANDLE hFile,//通信设备句柄
DWORD dwInQueue,//输入缓冲区大小
DWORD dwOutQueue//输出缓冲区大小
);
SetupComm()函数中各项含义说明如下:
hFile:由CreateFile()返回的指向已打开端口的句柄。
dwInQueue和dwOutQueue:接收缓冲区的大小和发送缓冲区的大小。这两个定义并非是实际的缓冲区大小,指定的大小仅仅是“推荐的”大小,而Windows可以随意分配任意大小的缓冲区。Windows设备驱动程序可以获得这两个数据,并不直接分配大小,而使用来优化性能和避免缓冲区超限。
注意:当使用CreateFile()函数打开串口时,为实现调制解调器的排它性访问,共享标识必须设为零;创建标识必须设为OPEN_EXISTING;模板句柄必须置为空。

作者:blindpoint
主页:www.blindpoint.net
注意:有任何问题到www.blindpoint.net/bbs论坛下进行咨询探讨先休息一下....(To Be Continue...)

猜你喜欢

转载自blog.csdn.net/bpv_kiki/article/details/325374