win32串口通讯(类的思考)C++起步

      网上关于win32 API串口类库一大把,方法也都差不多,至少我认为CAPI就能很好的控制串口通讯了。这里我想讲的是如果用面向对象的C++生成一个SerialPort类需要考虑的问题。

      Win32串口API流程一般是:打开串口(获得串口句柄) -->设置串口参数(DCB Timeout等) -->  开启读、写线程-->结束线程 -->关闭串口(释放资源)。纵观这些流程中串口API中,Handle通常是一个不变式C++之父说类就是维护它的不变式,大概意思吧),那么我们就生成一个类SerialPort,这个类构造函数打开串口,获得句柄,析构函数关闭这个句柄,释放这个串口资源。API函数CreateFile负责获得可用的串口资源,它返回一个句柄。CreateFile参数很多,但真正需要用户(SerialPort类的用户)参与,是提供一个串口号。我忽略掉了非重叠的IO操作,因为有人说那在NT下执行不正常,但我没试过。代码如下:

#pragma once

#ifndef  _SERIALPORT_H_
#define  _SERIALPORT_H_
class SerialPort
{
public:
    SerialPort(
int);
public:
    
~SerialPort(void);
private:
    HANDLE _handle;
}
;
#endif  _SERIALPORT_H_


#include 
<windows.h>
#include 
"SerialPort.h"

#include 
<tchar.h>

SerialPort::SerialPort(
int portNo) : _handle( INVALID_HANDLE_VALUE)
{
    TCHAR PortName[
64];
    ::wsprintf(PortName,_T(
"\\\\.\\COM%d"),portNo);

    _handle 
= ::CreateFile(
        PortName,
        GENERIC_READ 
| GENERIC_WRITE,
        
0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL 
|  FILE_FLAG_OVERLAPPED ,
        NULL
        );

}


SerialPort::
~SerialPort(void)
{
    
if(_handle != INVALID_HANDLE_VALUE)
    
{
        ::CloseHandle (_handle);
    }


}

 

       现在这个类获得了一个windows串口句柄,该进程可以使用串口资源。但是这个串口还不能为用户提供读写功能,因为还有一部分参数未初始化,其中包括DCBTimeouts和缓冲区。考虑通常用户习惯,需要显式控制的数据有:DCB中的波特率、数据位、校验位、停止位。其它部分可以隐式的控制,不需要用户交互完成。现在提出第一个问题:SerialPort类是否需要DCB数据成员?

      我查网上许多串口类中添加了DCB数据做为类成员,但我认为DCB应为一个临时变量,不需要成为类数据成员。类设计的第一步应该为:只维护其中不变式原则SerialPort类的职能为:打开串口句柄,设置相句柄相关参数。当SerialPort类被实例化后,它应该可供用户使用了,否则创建过程中应抛出异。SerialPort类不是抽象类,它可以提供继承或组合应用,那么SerialPort类应该提供对原始资源句柄_handle的访问功能:一个public

GetHandle()函数。OK!现在这个SerialPort成了这个模样了:当它实例化一个对象后,

它的调用者不论是继承还是组合,都可以通过调用GetHandle()函数调用原始句柄,可以read也可以write了。

    小结:SerialPort类就是对资源一种“罐装”,它维护进程中windows串口句柄。当它成功实例化后,它应保证,打开成功,设置参数成功(DCBTimeouts、缓冲区),此句柄资源已经准备好给用户读写用了。

posted on 2009-04-30 19:22 C稻草 阅读(1089) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


导航

<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿

随笔分类

文章档案

搜索

最新评论