Arduino 板和 Arduino IDE 非常适合创建可以激活 LED、读取传感器、激活伺服或任何数量的独特物理计算应用程序的小代码片段。此类操作通常开始时很简单——例如,让计时器上的 LED 闪烁——但随着程序的扩展和程序员技能的提高,最终会变得相当复杂。
组织扩展代码的一种出色技术是使用函数,即可以根据需要从程序的其他部分(例如通过主循环)调用的代码片段。对于有经验的程序员来说,这种技术可能已经过时了,但对于那些从其他学科进入 Arduino 的人来说,尽早接受函数范式通常会对你有好处。
声明一个函数
在最基本的形式中,额外函数看起来几乎与您在开始新草图时在第 1 行和第 6 行看到的设置和循环函数一样(图 1)。这些函数需要在另一个函数之外声明,并且具有唯一的名称。事实上,主循环函数的简单复制/过去/修改可用于在您的代码中创建一个新函数。
图 1. 新功能 copypasta。
调用函数,继续
当然,声明一个从不被调用且不做任何事情的函数纯粹是浪费空间,所以让我们让它做一些有趣的事情(图 2)。下面的示例基本上重新格式化了 Arduino Blink 草图以将闪烁放入一个函数中,并添加一个串行输出以让您知道它“延迟闪烁打开和关闭”。
虽然这对简化代码没有任何作用,但如果您想在主循环中的多个点执行相同类型的闪烁/响应操作,请考虑如何简化事情。无需编写 5 行代码,您只需使用 blinkAndTalk(); 调用新函数。
不需要太多用处就能看出这种简化是如何叠加起来的,尤其是在函数更复杂的情况下。这种代码分段还有助于在其他程序中重用代码,因为您可以根据需要在那里复制/粘贴。在 Arduino IDE 中,将函数放在最后很好,但如果您使用不同的环境(例如 PlatformIO),顺序可能很重要。
函数返回值
除了将代码简化为易于重用的块外,函数还可以返回一个值。Arduino.cc 提供了如何执行此操作的示例,将 myMultiplyFunction 称为 k = myMultiplyFunction(i, j);。这里的括号不是空的,而是将变量传递给函数本身,并且 k 由返回结果设置;函数中的行(图 3)。
图 3.来自 Arduino 示例的代码。
另一种传递值的方法是在函数中设置一个全局变量,它可以在主循环或任何你需要结果的地方使用。出于多种原因,包括生成更复杂的代码以及使这些函数更难重用,使用 return 是这里更好的选择。如果您很好奇,下面显示了如何做到这一点的示例:
图 4. 可能,但通常不推荐。
一旦您准备好将几行代码转移到编程上更有趣的应用程序中,请记住函数是您的朋友。他们在最初设置时会花一些心思,但随着事情变得更加复杂,他们可以支付巨额红利。
我最近写了一段代码,其中一小部分如下所示,接近 300 行。然而,主循环在括号内只有 4 行,主要是为了调用一些单独的函数。老实说,我应该将其进一步分解为功能块,从而可能会减小程序的大小并为自己省去一些麻烦。规划在这里有很长的路要走。
图 5. 对于主循环中的代码行(注释省略)
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !