使用C++创建传感器接口

MEMS/传感技术

1292人已加入

描述

在过去的几篇文章中,我们一直在探索开发人员如何与传感器交互并开发可重用的驱动程序。在“与现代传感器接口:接口设计”中,我们研究了如何使用 C 设计传感器接口。在本文中,我们将从更面向对象的角度使用 C++ 创建传感器接口。

使用 UML 进行界面设计

统一建模语言(UML) 提供了一种标准化的方式来表达独立于编程语言的软件概念在开始编写代码之前,想要设计传感器接口的开发人员应该创建一个简单的类图,展示他们的传感器接口类的外观。例如,传感器的类图可能如下所示:

接口

接口
(来源:雅各布·贝宁戈)

此图中有几个有趣的点需要注意。首先,接口是继承类必须实现的操作的集合。读者会注意到我们的顶层是一个接口,它描述了每个继承类必须实现的操作。在此示例中,这包括以下操作:

  • 初始化传感器
  • 写入传感器
  • 从传感器读取

任何传感器都至少有这些操作,但它们可能会提供额外的方法,例如 Power 类也提供校准操作。在面向对象的术语中,传感器类是一个抽象类。其次,我们使用空心箭头表示实现类继承自接口。温度、湿度和功率都是实现传感器的类。最后,Power 类还作为一个附加方法(操作),calibrate,它不是 Sensor 接口的一部分。

在 C++ 中实现接口

C++ 没有像 Java 等其他面向对象的编程语言那样特别具有接口。C++ 仅使用抽象类提供接口功能。抽象类是其他类从其继承的具有至少一个纯虚函数的基类。纯虚函数是已声明但未提供实现的函数。相反,继承类必须提供实现。回想一下我们的 UML 图,这是有道理的。Sensor 类正在创建一个契约,所有传感器都将提供 Init、Write 和 Read 操作,但 Sensor 类本身不知道如何实现这些操作。它将实现留给类实现来完成。

在 C++ 中创建接口相对简单。开发人员像任何其他类一样创建该类,只是它们不包含构造函数,这取决于实现类,但仍应创建解构函数。然后将每个操作声明为纯虚函数。Sensor 接口基类的示例如下所示:

类传感器接口
{
    上市:
        虚拟 void Init() = 0;
        虚拟无效写入()= 0;
        虚拟无效读取()= 0;
};

除了通常称为方法的函数被声明为虚拟并分配一个空值之外,该类的创建方式与任何其他类一样。我们还包括一个析构函数以确保我们也可以进行清理。

实现一个新的传感器类

在我们的示例图中,我们有三个不同的继承类,温度、湿度和功率。我们当然可以有更多或更少,我们甚至可能有与这些类相关或继承自这些类的类。不过今天,我们有兴趣了解如何让我们的传感器类从接口(抽象类)继承。

当我们定义将从 SensorInterface 类继承的传感器类时,我们将定义如下类:

 
温度类:公共传感器接口
{
    上市:
        无效初始化();
        无效写入();
        无效读取();
};

类湿度:公共传感器接口
{
    上市:
        无效初始化();
        无效写入();
        无效读取();
};

类电源:公共传感器接口
{
    上市:
        无效初始化();
        无效写入();
        无效读取();
        无效校准();
};

如您所见,我们在新类定义之后使用:,然后是基类。新类必须定义纯虚函数才能实例化该类。今天我不打算详细介绍它的外观,但为了给你一个大致的概念,我使用的符号是用于外部定义的,所以每个类都有一个形式的实现:

类::函数
{

}

结论

基类可用于设计其他类可以继承的接口。以这种方式创建接口的好处是它在应用程序和对象之间创建了关于如何使用它的合同。这有助于抽象出有关幕后发生的事情的细节,从而为设计增加灵活性和可扩展性。当我们开始考虑与低级硬件对象交互时,这绝对是有利的。

Jacob Beningo 是一名嵌入式软件顾问、技术顾问和教育家,目前与十几个国家的客户合作,以​​极大地改变他们的软件、系统和流程。请随时通过 jacob@beningo.com 和他的网站 www.beningo.com 与他联系,并在此处注册他的每月嵌入式字节通讯。

 

继续阅读

发表评论Cancel reply

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分