主要内容

MATLAB附加类

MATLAB®库的类必须继承自matlabshared.addon.LibraryBase类别:

classdefMyAddon终止

笔记

MATLAB类中的类、包、函数、脚本和变量名仅使用ASCII字符。

这个matlabshared.addon.LibraryBase类包括各种属性和方法。下图显示了外接程序的典型类继承:

要实现MATLAB附加类,必须重写以下属性和方法:

根据外接程序的设计,您可能还需要重写以下属性和方法:

命令标识符

命令标识符,通常命名为司令部,是8位十六进制值司令部用于sendCommand提供到命令处理程序中的方法C++头文件.

使用以下语法指定司令部属性在MATLAB类中:

属性(Access=private,Constant=true)加载项操作=hex2dec(cmdID)…终止

这个创建LCD附加组件示例显示了司令部他在房间里LCDAddon.mclassdef文件为:

属性(访问=private,常数=true)LCD_CREATE=hex2dec('00')LCD_INITIALIZE=hex2dec('01')LCD_CLEAR=hex2dec('02')LCD_打印=hex2dec('03')LCD_DELETE=hex2dec('04')终止

同样地液晶显示器定义司令部s:

#定义LCD_创建0x00#定义LCD_初始化0x01#定义LCD_清除0x02#定义LCD_打印0x03#定义LCD_删除0x04

笔记

为了保持一致的行为,MATLAB类中的命令标识符必须与司令部它用于命令处理程序方法从C++头文件中提取。

库规范

库规范定义了附加的名称和所需C++源文件和库的位置。库规范是用此代码设置的属性:

属性(Access=protected,Constant=true)LibraryName=“MyAddon文件夹/MyAddon”DependentLibraries={}LibraryHeaderFile={}CppHeaderFile=fullfile(arduinoio.FilePath(mfilename(“完整路径”)),“src”,“MyAddon.h”)类名称=“我的插件”终止

五个库规范属性的定义必须如中所示matlabshared.addon.LibraryBase或如下表所示。

所有物 描述
图书馆名称

加载项库的名称为字符串。该字符串使用与加载项文件夹结构相同的语法:/

附属图书馆

作为字符串单元格数组的附加组件所需的其他附加组件库。

图书馆馆长文件

您的附加程序需要的任何C++头文件。图书馆基地有关包含头文件的详细信息。

CpHeaderFile

作为字符串的附加路径C++文件头的完整路径和名称。

类名称

C++头文件中类作为字符串的名称。

这个创建LCD附加组件示例库显示了这些属性的典型命名:

属性(Access=protected,Constant=true)LibraryName='示例LCD/LCDAddon'DependentLibraries={}库头文件=‘liquidcystal/liquidcystal.h’CppHeaderFile=fullfile(arduinoio.FilePath(mfilename(“完整路径”)),“src”,‘LCD.h’)类名称=“液晶显示器”终止

如果您的附加组件中有一个C++头文件图书馆馆长文件,确保类名称与头文件中定义的任何类的名称都不相同。在本例中,液晶显示器与C++中定义的类不同液晶.

如果您的附加组件需要I2C金宝app那就支持吧

从属库={“i2c”};

建造师

外接程序的构造函数必须以两种方式初始化外接程序对象:

  • 将加载项对象设置为Arduino的父对象®对象

  • 定义附加模块使用的硬件管脚集

以下是构造函数的最低形式:

方法作用obj=AddonName(parentObj)obj.Parent=parentObj;终止终止

通常,加载项构造函数向父Arduino对象注册加载项资源。同样,也可以执行检查以确保加载项不会产生资源使用冲突。中的构造函数创建LCD附加组件示例显示了如何检查并获取资源,以防止两个LCD附加组件同时存在:

%InputPins是用户输入,包含连接LCD和arduino的引脚作用obj=LCDAddon(parentObj,varargin)如果(nargin~=7)matlabshared.hwsdk.internal.localizedError('MATLAB:narginchk:notEnoughInputs');终止尝试p=inputParser;addParameter(p,“RegisterSelectPin”,[]);addParameter(p,“使能PIN”, []); addParameter(p,“数据管脚”, []); parse(p,varargin{1:end});接住e(e);终止obj.Parent=parentObj;obj.RegisterSelectPin=p.Results.RegisterSelectPin;obj.EnablePin=p.Results.EnablePin;obj.DataPins=p.Results.DataPins;inputPins=[cellstr(obj.RegisterSelectPin)cellstr(obj.EnablePin)obj.DataPins=inputPins;count=getResourceCount(obj.Parent,obj.ResourceOwner);%因为这个例子只允许实现一个LCD%屏蔽,如果资源计数大于0,则出错如果计数>0错误('您只能有一个LCD屏蔽');终止递增ResourceCount(obj.Parent,obj.ResourceOwner);createLCD(obj,inputPins);终止

析构函数

默认情况下,您不需要为外接程序编写析构函数matlabshared.addon.LibraryBase类被隐式调用。从父ARDINO对象使用硬件资源或在C++头中分配内存的附加组件必须调用附加析构函数来释放这些资源。

警告

不释放析构函数中的资源可能会在创建外接程序的新实例期间导致内存泄漏和失败。

外接程序类的析构函数必须:

  • 重写的delete方法matlabshared.addon.LibraryBase

  • 在C++中执行命令命令处理程序方法取消分配库使用的任何内存资源。

  • 不引发错误或异常。要防止在析构函数期间引发错误或异常,请将内容包装在试一试陈述

中的析构函数创建LCD附加组件示例显示了如何安全地检查和释放资源:

方法(访问=受保护)作用删除(obj)尝试parentObj=obj.Parent;%清除已配置到LCD屏蔽的引脚inputPins=[cellstr(obj.RegisterSelectPin)cellstr(obj.EnablePin)obj.DataPins];对于iLoop=inputPins configurePinResource(父对象,iLoop{:},obj.ResourceOwner,“未设置”);终止%减少LCD的资源计数decrementResourceCount(parentObj,obj.ResourceOwner);cmdID=obj.LCD_DELETE;inputs=[];sendCommand(obj,obj.LibraryName,cmdID,inputs);接住%不要在destroy上抛出错误。%这可能是由于构造不完整造成的。终止终止终止

资源所有权

您的加载项可以选择指定某些唯一且无法共享的硬件资源创建LCD附加组件只能有一个实例,因为一次只能将一个LCD屏蔽连接到Arduino设备。

笔记

明确定义外接程序的硬件资源所有权可防止运行时发生资源获取和使用冲突。

您可以通过外接程序类中的以下属性集指定资源所有权:

属性(Access=private)ResourceOwner='ExampleCld/LCDAddon';结束

另见

|