首页 > 解决方案 > 如何处理检索 i2c 缓冲区和设置模型/实体属性?

问题描述

我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,我在确定从 i2c 接口获取字节数组缓冲区数据到我的实体的最佳实现时遇到了一些麻烦。这是一个简单的类似仪表板的应用程序,可以查询智能电池的状态和大约 12 个不同的寄存器值。然后,它将数据以小部件或较大的“详细信息”窗口呈现给用户。我试图避免创建更多贫血模型,因为我发现自己从早期使用 MVVM 模式开发时就掉进了那个坑,并试图打破这个习惯。

程序功能
通过 FTDI 电缆通过 SMBUS(i2c) 从 SmartBattery 检索数据,并将其显示在 WPF 应用程序中。

当前结构
FTDI

从电池中检索到的电池
数据采用字节数组格式,长度在 2 到 32 个字节之间,并且从小端到大端不等(相信我,我知道这很奇怪)。基本上,您必须将“命令”作为寄存器(例如电压为 0x09)发送到设备地址(0x0b)的写入命令。在使用传递的缓冲区执行读取命令后,缓冲区包含来自电池的数据。

让 Ftdi 通信层与应用程序的功能无关,这对我来说是有意义的,因为我可能会用 i2c 代替 SPI 等等(甚至可以与电池以外的东西进行通信)。因此,我确保该层对与之通信的设备类型一无所知。但是,这给我留下了一个问题:

我将电池寄存器的知识放在哪一层?
每个寄存器都有地址、长度、单元类型和格式。IE

电压
地址:0x09
长度:2字节
单位/格式:mV

在寄存器中,我想到了以下转换器:

那么,考虑到这一点,我应该怎么做呢?我目前的想法是:

我认为第一种方法会更容易,但我想让这个应用程序成为未来项目的“模型”,并希望在第一时间把它做好。

感谢您的帮助,并为史诗小说感到抱歉。

标签: c#wpfmvvmdomain-driven-designi2c

解决方案


使用贫血模型 + 电池服务。

这样,您可以通过 DI 正确地对服务层进行单元测试,并且正如您所说,可以使用不同的服务来服务不同的硬件类型。

更难的问题是把你需要的转换放在哪里。部分问题是字节数​​组本身与硬件耦合。我也会考虑将其抽象出来。然后,您的服务可以返回您的模型将知道并可以使用的抽象数据类型,而不用担心它来自哪里或它真正包含什么。


推荐阅读