Windows串口通信

        Windows环境下的编程的最大特征之一就是设备无关性,它通过设备驱动程序将Windows应用程序同不同的外部设备隔离。Windows封装了Windows的通信机制,这种方式称为通信API,Windows程序可以利用Windows通信API进行编程,不用对硬件直接进行操作。

1.1  打开串口

在32位的Windows系统中,串口和其它通信设备是作为文件处理的。串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。

通信会话以调用CreateFile()开始。CreateFile()为读访问、写访问或读写访问“打开”串口。按照Windows的通常做法,CreateFile()返回一个句柄,随后在打开的端口的操作中使用CreateFile()函数非常复杂,复杂性的原因之一是它是通用的。可以使用CreateFile打开已存在的文件,创建新文件和打开根本就不是文件的设备,例如串口、并口和调制解调器。CreateFile()函数声明如下:

HANDLE CreateFile(

  LPCTSTR lpszName,

  DWORD fdwAccess,

  DWORD fdwShareMode,

  LPSECURITY_ATTRIBUTES lpsa,

  DWORD fdwCreate,

  DWORD fdwAttrsAndFlags,

  HANDLE hTemplateFile

 )

 CreateFile函数中的参数解释如下:

·lpszName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2。

·fdwAccess:用来指定串口访问的类型。与文件一样,串口也是可以被打开以供读取、写入或者两者兼有。

 GENERIC_READ位读取访问打开端口,GENERIC_READ位写访问打开端口。这两个常数定义如下:

const GENERIC_READ = 0x80000000h;

const GENERIC_WRITE = 0x40000000h;

用户可以用逻辑操作将这两个标识符连接起来,为读/写访问权限打开端口。因为大部分串口通信都是双向的,因此常常在设置中将两个标识符连接起来使用。如:

fdwAccess = GENERIC_READ | GENERIC_WRITE;

·fdwShareMode:指定该端口的共享属性。该参数是为那些由许多应用程序共享的文件提供的。对于不能共享的串口,它必须设置为0。这就是文件与通信设备之间的主要差异之一。如果在当前的应用程序调用CreateFile()时,另一个应用程序已经打开了串口,该函数就会返回错误代码,原因是两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享由CreateFile()返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。

·Ipsa:引用安全性属性结构(SECURITY_ARRTIBUTES),该结构定义了一些属性,例如通信句柄如何被打开端口的应用程序的子程序所继承。将该参数设置为NULL将为该端口分配缺省的安全性属性。子应用程序所继承的缺省属性是该端口不能被继承的。

安全属性结构SECURITY_ARRTIBUTES结构声明如下:

typedef struct_SECURITY_ARRTIBUTE {

    DWORD nLength;

    LPVOID lpSecurityDescriptor;

    BOOL  bInheritHandle;

} SECURITY_ARRTIBUTE;

SECURITY_ARRTIBUTES结构成员nLength指明该结构的长度,lpSecurityDescriptor指向一个安全描述字符,bInheritHandle表明句柄是否能被继承。

·fdwCreate:指定如果CreateFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,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

·hTemplateFile:指向模板文件的句柄,当端口处于打开状态时,不使用该参数,因而必须置成0。

调用CreateFile()函数打开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: 由GreatFile()返回的指向已打开端口的句柄。

·dwInQueue和dwOutQueue: 接收缓冲区的大小和发送缓冲区的大小。这两个定义并非是实际的缓冲区的大小,指定的大小仅仅是“推荐的”大小,而Windows可以随意分配任意大小的缓冲区。Windows设备驱动程序可以获得这两个数据,并不直接分配大小,而使用来优化性能和避免缓冲区超限。

注意:当使用CreateFile()函数打开串口时:为实现调制解调器的排他性访问,共享标识必须设为零;创建标识必须设为OPEN_EXISTING;模板句柄必须置为空。

1.2  关闭串口

关闭串口比打开串口简单得多,只需要调用CloseHandle()函数关闭由CreateHandle()函数返回得句柄即可。

CloseHandle函数声明如下:

BOOL CloseHandle(

  HANDLE hObject   // 需关闭的设备句柄

);

使用串口时一般要关闭它,如果忘记关闭串口,串口就会始终处于打开状态,其它应用程序就不能打开并使用串口了。

2.2   串口配置和串口属性

Windows 9x/NT/2000中配置串口提供了比Windows的早期版本更为强大的功能,当然相应也更加复杂。CreateFile函数打开串口后,系统将根据上次打开串口时设置的值来初始化串口,可以集成上次打开操作后的数值,包括设备控制块(DCB)和超时控制结构(COMMTIMEOUTS)。如果是首次打开串口,Windows操作系统就会使用缺省的配置。

1.  串口配置

Windows 使用GetCommState()函数获取串口的当前配置,使用SetCommState()重新分配串口资源的各个参数。

GetCommState()函数声明如下:

BOOL GetCommState(

   HANDLE hFile, // 通信设备句柄

   LPDCB lpDCB   // 指向device-control block structure的指针

);

其中的参数说明如下:

·hFile:由CreateFile()函数返回的指向已打开串口的句柄。

·lpDCB:一个非常重要的结构—设备控制块DCB ( Device Control Block )。

DCB结构的主要参数说明如下:

·DCBLength: 一字节为单位指定的DCB结构的大小。

·Baudrate: 用于指定串口设备通信的数据传输速率,它可以是实际的数据传输速率数值,也可以是下列数据之一:CBR_110, CBR_19200, CBR_300, CBR_38400, CBR_600, CBR_56000, CBR_1200, CBR_57600, CBR_2400, CBR_115200, CBR_4800, CBR_12800, CBR_9600, CBR_25600, CBR_14400。

·fBinary: 指定是否允许二进制。Win32API不支持非二进制传输,因此这个参数必须设置为TRUE,如果设置为FALSE则不能正常工作。

·fParity: 指定是否允许奇偶校验,如果这个参数设置为TRUE,则执行奇偶校验并报告错误信息。

·fOutxCtsFlow: 指定CTS是否用于检测发送流控制。当该成员为TRUE,而CTS为OFF时,发送将被挂起,直到CTS置ON。

·fOutxDsrFlow: 指定DSR是否用于检测发送流控制,当该成员为TRUE,而DSR为OFF时,发送将被挂起,直到DSR置ON。

·fDtrControl: 指定DTR流量控制,可以是表1中的任一值。

表1                           DTR流量控制

                      值

              功能描述

        DTR_CONTROL_DISABLE

禁止DTR线,并保持禁止状态

        DTR_CONTROL_ENABLE

允许DTR线,并保持允许状态

        DTR_CONTROL_HANDSHAKE

允许DTR握手,如果允许握手,则不允许应用程序使用EscapeCommFunction函数调整线路

表2                        RTS 流量控制

                  值

           功能描述

RTS_CONTROL_DISABLE

打开设备时禁止RTS线,并保持禁止状态

RTS_CONTROL_ENABLE

打开设备时允许RTS线,并保持允许状态

DTR_CONTROL_HANDSHAKE

允许握手。在接收缓冲区小于半满时将RTS 置为ON,在接收缓冲区超过3/4时将RTS置为OFF。如果允许握手,则不允许应用程序使用EscapeCommFunction函数调整线路

DTR_CONTROL_TOGGLE

当发送的字节有效,将RTS置为 ON,发送完缓冲区的所有字节后, RTS置为OFF

·fRtsControl: 指定  RTS 流量控制,可以取表2中的值。0值和DTR_CONTROL_HANDSHAKE等价。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值