网上关于win32 API串口类库一大把,方法也都差不多,至少我认为C加API就能很好的控制串口通讯了。这里我想讲的是如果用面向对象的C++生成一个SerialPort类需要考虑的问题。
Win32串口API流程一般是:打开串口(获得串口句柄) -->设置串口参数(DCB Timeout等) --> 开启读、写线程-->结束线程 -->关闭串口(释放资源)。纵观这些流程中串口API中,Handle通常是一个“不变式”(C++之父说类就是维护它的“不变式”,大概意思吧),那么我们就生成一个类SerialPort,这个类构造函数打开串口,获得句柄,析构函数关闭这个句柄,释放这个串口资源。API函数CreateFile负责获得可用的串口资源,它返回一个句柄。CreateFile参数很多,但真正需要用户(SerialPort类的用户)参与,是提供一个串口号。我忽略掉了非重叠的IO操作,因为有人说那在NT下执行不正常,但我没试过。代码如下:
现在这个类获得了一个windows串口句柄,该进程可以使用串口资源。但是这个串口还不能为用户提供读写功能,因为还有一部分参数未初始化,其中包括DCB、Timeouts和缓冲区。考虑通常用户习惯,需要显式控制的数据有:DCB中的波特率、数据位、校验位、停止位。其它部分可以隐式的控制,不需要用户交互完成。现在提出第一个问题:SerialPort类是否需要DCB数据成员?
我查网上许多串口类中添加了DCB数据做为类成员,但我认为DCB应为一个临时变量,不需要成为类数据成员。类设计的第一步应该为:只维护其中“不变式”原则。SerialPort类的职能为:打开串口句柄,设置相句柄相关参数。当SerialPort类被实例化后,它应该可供用户使用了,否则创建过程中应抛出异。SerialPort类不是抽象类,它可以提供继承或组合应用,那么SerialPort类应该提供对原始资源句柄_handle的访问功能:一个public
GetHandle()函数。OK!现在这个SerialPort成了这个模样了:当它实例化一个对象后,
它的调用者不论是继承还是组合,都可以通过调用GetHandle()函数调用原始句柄,可以read也可以write了。
posted on 2009-04-30 19:22 C稻草 阅读(1089) 评论(0) 编辑 收藏 引用