如何将Arduino的ino文件分解成多个.h和.cpp工程文件
如何将Arduino的ino文件分解成多个.h和.cpp工程文件
当用Arduino做复杂工程项目时,程序难免会变得很大。这时候要修改个别参数或函数的时候会变得麻烦,简而言之,项目程序管理难度增高了,程序代码维护会变得困难。这时候,就产生了将一个ino文件分解成多个功能相对独立的源文件,这样就便于针对性的管理代码了。
1. 需要做的准备
不是所有的代码都方便分解成多个cpp文件进行管理的,特别是编程时想到哪编到哪的,代码会异常的凌乱。这意味着,里面的函数关系,逻辑嵌套,变量使用等都是极度凌乱的。这样的代码很难分解开来。因此,如果着手做的是一个相对大的项目,一开始便要有整体规划代码的意识。
- 一是以功能需求对应各个子函数,尽量一个函数只完成一个功能,避免功能上的嵌套;
- 二是变量定义要清晰。
在对整体的代码有了比较清晰的规划后,便可以着手分解代码了。
2.功能函数代码的分解
首先,你需要在原来工程文件夹下新建一个头文件,如 config.h,然后将Arduino的硬件接口定义放在这里面。然后,按照功能划分,分别建立各个功能的cpp文件,如 motion.cpp 文件中放置定义了各种运动的函数。然后将各个函数的声明写到 config.h 中。(原来一个ino文件时,软件会自动加函数声明,但现在需要自己加了)如:void trun_left(int, int); 。其他各种功能也是如此。但个函数都划分成多个cpp文件后,就要来处理全局变量的问题了。
3.全局变量的声明
因为在一个地方定义的变量很可能在其他地方使用,因此,全局变量就很关键了。原涞单个ino文件时,只要在 setup() ,上面定义的变量都默认是全局变量,但现在不行了,需要自己在声明。操作方式如下:
- 在任一cpp中定义你需要的变量,建议定义在最关键的地方。如在motion.cpp中定义了int speed=255; ,而这个变量在其他cpp文件中也要使用到,所以第二步如下:
- 在config.h 文件中对这个变量进行声明,extern int speed; 这可以跟函数声明一样理解,在这里声明后,在其他地方就可以使用了。
- 不要想当然的在 config.h 中先定义在声明,这样编译不会出错,但在链接时会出错,显示出现重复定义。(别问我问什么,我这么干失败了)
通过在cpp中定义变量,在头文件中声明该变量的方式便可实现全局变量的使用了。
4. 必要的步骤
在完成上面的步骤后,你还需要除了ino文件外的各个文件里都包含 #include"Arduino.h",否则程序里的HIGH,LOW,OUTPUT,pinMode之类的将无法识别。此外,你的各个cpp文件应该加上头文件 #include“config.h”,不用<>,而用双引号的原因是尖括号引用的是标准库,而这里是自定义的头文件等。最后,你也要在ino文件中包含头文件 #include"config.h"。 ino文件以及头文件中都无需包含cpp文件。
5. 程序的管理
经过上述步骤后,你的程序将由一个包含了setup(),loop()函数的ino文件,一个头文件config.h, 以及许多实现各种功能的cpp文件。 ino文件就是你的主程序了,你想要实现的主干逻辑写在这里面。它通过调用各个cpp里函数来实现你的功能。头文件则包含了你所使用的Arduino的各个接口定义,所有函数的声明,以及全局变量的声明。 而cpp文件则是按照功能类别,将许多子函数集中在一起的源文件。
OVER~
如何将Arduino的ino文件分解成多个.h和.cpp工程文件相关推荐
- 把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库
前言 在用Qt做开发时,为了方便快速,一般都使用Qt设计师界面类来做界面相关的布局,这个类在当前工程中是没有.cpp或.h文件的,但主类又有引入了这个头文件,点开转到定义或声明时,是打不开的,如下图: ...
- xml文件转换成图片_怎样能把PDF文件转换成图片?
我们的日常生活工作中时常碰到pdf与Excel.Word.ppt和jpg等文件格式的转换,有时候由于工作的需要,要把PDF文件转换成图片.并且现在网上的很多素材都是PDF文件格式的,如果我们想要里面的 ...
- 亲测好用的caj文件转换成带目录的文字版PDF文件工具
参考GitHub上caj2pdf/caj2pdf: Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF.佛 ...
- java 文件转十六进制_JAVA将文件转成十六进制字符串和十六进制字符串生成文件的方法...
以下代码以APK文件为例,其他格式的文件方法一样,代码如下: package com.evideostb.billsystem.module.update; import java.io.*; /** ...
- 怎么把php的文件链接成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 生成静态文件除了2楼所说的ob缓存方法之外,还有一种方法就是通过使用模板替换技术实现(正则表达式) header("content-type:t ...
- 【PDF转换图片】如何把pdf文件转换成图片?如何把批量pdf文件转换成图片?如何把多目录批量pdf文件转换成图片?如何pdf文件转换成图片不失真不损失清晰度?今天教方法
在工作中常常需要将PDF转换为图片,好多免费但是图片有水印和功能不全的问题. 还有市面上很多软件知识完成了部分的工作,比如只能单个文件转PDF,那么遇到多文件的就只能挨个转么? 还有转换的格式支持的非 ...
- python excel文件转换成字符串_python利用pandas将excel文件转换为txt文件的方法
python将数据换为txt的方法有很多,可以用xlrd库实现.本人比较懒,不想按太多用的少的插件,利用已有库pandas将excel文件转换为txt文件. 直接上代码: ''' function:将 ...
- 计算机文件换成PDF,如何打开或转换PPDF文件
我们中的文件扩展名为1,别名为0 您可以找到以下问题的答案: .ppdf PPDF文件是Microsoft RMS保护的PDF. 权限管理服务(RMS)是Windows Server附带的用于信息权限 ...
- java字节流——把两个视频文件合并成一个,输出为一个新文件
下面把D盘的两个视频文件合并为一个,并输出为D:\new.mp4 package com.oracle.core;import java.io.File; import java.io.FileInp ...
最新文章
- Docker_Swarm集群系统
- 11月2日科技联播:销量不及预期苹果市值跌破万亿美元;腾讯表示封杀抖音因微信规则...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
- html 标签 中 的Lang 有什么用
- 在 C# 中 (x == X) 何时成立?
- 论文研读:Automatic Temporal Segment Detection and Affect Recognition From Face and Body Display
- php扩展 zval_copy_ctor,zend api扩展的php对象的autoload工具
- JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
- python3.0与2.0,python3.0与python2.0有哪些不同
- 安装linux前分区,安装Linux系统前的准备之磁盘分区
- vps没有mysql怎么用商店_如何在本地搞一个小程序的服务器之我没有vps我也很绝望呀...
- aws rds监控慢sql_AWS RDS SQL Server –监视数据库实例
- Swing 显示良好JPanel保存为图片
- Apache Curator入门实战
- 洛谷P5300 与或和(全1子矩阵/单调栈)
- FindBugs-IDEA图标说明
- 四阶段法-交通分布预测方法-算法复现
- Django(一)简单的个人博客搭建实战
- 灵感分享|10个优秀网站设计实例赏析及原型分享
- 如何解决IT公司代码混乱的问题
热门文章
- steam账号连接服务器遇到问题,无法预料的服务器浏览器反应 - Steam Support
- 百度为何力推直达号?为了移动商业化
- SQL SERVE 2008远程连接 提示sqlserver远程主机强迫关闭了一个现有连接
- c语言程序设计精髓 第13周练兵题
- threw exception [Circular view path [index]: would dispatch back to the current handler URL [/index]
- 基于模拟退火优化算法的的并行车间机器优化调度附Matlab代码
- 数据结构-C语言代码 day6-栈及其应用
- 个人面经整理深信服测开
- CNN神经网络猫狗分类经典案例
- C语⾔核⼼基础知识之printf