;DwShareMode参数是共享模式,对串口物理设备必须取0;LpSecurityAttributes参数是安全属性,取值为NULL;DwFlagsAndAttributes是文件属性和标识,一般取值为FILE_ATTRIBUTE_NORMAL。该函数返回串口操作的句柄。
(2) 对该串口句柄对应的设备进行配置,如波特率、数据位、停止位、是否奇偶校验等。这部分首先使用GetCommState()函数得到当前的串口配置信息,将这些信息存放在一个DCB结构中,然后对该DCB结构里面的内容进行重新按要求设置,最后调用SetCommState()函数使修改的设置生效。
(3) 配置串口事件。SetCommMask()函数可以设置多个串口信息事件,其串口的信息事件可以是以下任意的组合:
EV_BREAK:在输入时Windows检测到中断;
EV_CTS :CTS信号改变状态;
EV_DSR :DSR信号改变状态;
EV_ERR :发生线状态错误;
EV_RING :检测到振铃指示;
EV_RLSD :接收线信号探测状态发生改变;
EV_RXCHAR:接收缓冲区里收到字符;EV_RXFLAG:收到事件字符,并放入接收缓冲区;
EV_TXEMPTY:输出缓冲区空。
(4) 创建串口监视线程监视串口事件。首先使用WaitForSingleObject()、WaitForCommEvent()、WaitForMultipleObjects()等等待函数对线程进行控制,当没有数据收发时,将线程阻塞,减少其CPU的资源占用;当有数据收发时,线程自动启动,完成数据的收发。最后调用CreateThread()函数启动线程。
(5) 串口使用结束,用CloseHandle()函数关闭串口,回收资源。
由此可见,利用Win32 API函数编写串口通信程序比较复杂,需要掌
握大量的系统和通信知识,其优点是实现的功能强大,应用面广泛,适合编写较为复杂的地层次应用程序。
3. 使用MSComm控件进行串口编程
Microsoft Communication Control(MSComm)是Microsoft公司提供的Windows下串行通信编程的AcitiveX控件。该控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令接口,可以用它创建全双工、事件驱动、高效实用的通信程序。MSComm控件通过串口传输和接收数据,为应用程序提供串行通信功能。
MSComm的主要属性及事件:
(1) CommPort:设置或返回串行端口号,缺省值1;
(2) Setting:设置或返回串口通信参数,格式为"波特率,奇偶校验位,数据位,停止位";
(3) PortOpen:打开或关闭串行端口;
(4) InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节;
(5) InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区;
(6) RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件;
(7) SThreshold:该属性为一阀值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件;
(8) InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容;
(9) Input:从接收缓冲区读取一串字符;
(10) InputMode:返回从Input中取回的数据类型,可以是ANSI码和二进制数据数组;
(11) OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节;
(12) OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区;
(13) OutPut:向发送缓冲区传送一串字符。
如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:
(1) ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值;
(2) ComEvReceive:值为2,接收缓冲区内字符