如何将TMC2209Stepper实例以指针形式传入Arduino自定义类?
解决方法:将驱动实例传入自定义类
针对你的需求,有两种常用的实现方式,都能让自定义类安全复用外部的TMC2209Stepper实例,同时避免主代码因状态变量臃肿:
方法一:使用指针存储驱动实例
这种方式灵活,允许后续修改指向的实例(如果需要),适配Arduino环境的内存管理习惯:
1. 自定义类实现(MyCustomController.h)
#include <TMCStepper.h> class MyCustomController { private: // 声明指向TMC2209Stepper的指针成员 TMC2209Stepper* _driver; // 封装的私有状态变量 bool _someState = false; bool _someOtherState = true; public: // 构造函数:接收驱动实例的指针 MyCustomController(TMC2209Stepper* driver) : _driver(driver) {} void setSpeed(int speed) { // 空指针检查避免崩溃,通过指针调用驱动方法 if (_driver != nullptr) { _driver->VACTUAL(speed); } } // 可添加更多自定义功能,比如状态切换 void toggleState() { _someState = !_someState; } };
2. 主代码使用方式
#include <TMCStepper.h> // 创建驱动实例 TMC2209Stepper driver(&Serial1, 0.11f, 0b00); #include "MyCustomController.h" // 传入驱动实例的指针(&driver获取地址) MyCustomController customControl(&driver); void setup() { driver.begin(); driver.rms_current(2000); driver.microsteps(32); } void loop() { // 通过自定义类设置速度 customControl.setSpeed(100); // 调用自定义功能示例 // customControl.toggleState(); }
方法二:使用引用存储驱动实例
引用是变量的别名,一旦绑定就无法修改指向,适合确定不会更换驱动实例的场景:
1. 自定义类实现(MyCustomController.h)
#include <TMCStepper.h> class MyCustomController { private: // 声明TMC2209Stepper的引用成员 TMC2209Stepper& _driver; bool _someState = false; bool _someOtherState = true; public: // 引用必须在构造函数初始化列表中完成初始化 MyCustomController(TMC2209Stepper& driver) : _driver(driver) {} void setSpeed(int speed) { // 直接通过引用调用驱动方法 _driver.VACTUAL(speed); } // 自定义状态查询方法 bool getState() { return _someState; } };
2. 主代码使用方式
#include <TMCStepper.h> TMC2209Stepper driver(&Serial1, 0.11f, 0b00); #include "MyCustomController.h" // 直接传入驱动实例(自动转为引用) MyCustomController customControl(driver); void setup() { driver.begin(); driver.rms_current(2000); driver.microsteps(32); } void loop() { customControl.setSpeed(100); }
关键注意点
- 两种方式都避免了复制
TMC2209Stepper实例(复制可能导致硬件资源冲突),仅传递实例的地址或别名 - 指针方式建议添加空指针检查,防止传入无效指针导致程序崩溃
- 引用方式必须在构造函数的初始化列表中完成初始化,不能在函数体内赋值
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

