Arduino编程中如何实现两个变量同步递增与递减?
Arduino实现双变量同步反向变化方案
编译报错的核心原因
Arduino遵循C++语法规则,for循环的结构是固定的,仅支持3个语法段,段与段之间用2个分号分隔,格式为:for(初始化表达式; 循环判断条件; 每轮循环后更新表达式)
你之前写的代码用3个分号拆分出了4个语法段,编译器无法识别非法结构,就会抛出缺少分号的错误。同时你把pos2的初始化、判断逻辑放到了错误的语法段,本身逻辑也不成立。
可直接运行的正确写法
要实现两个变量同步变化,只需要把两个变量的相关操作,对应放到for循环的三个语法段里即可,同一段内的多个操作用逗号分隔:
// 需提前定义pos1、pos2变量,例:int pos1, pos2; // 实现效果:pos1从0递增到70,pos2同步从70递减到0 for (pos1 = 0, pos2 = 70; pos1 <= 70; pos1++, pos2--) { // 循环内部写需要同步执行的业务逻辑,比如舵机驱动、电平输出、串口打印等 // 每轮循环两个变量各变化1次,完全同步: // 第1轮:pos1=0, pos2=70 // 第2轮:pos1=1, pos2=69 // ... // 最终轮:pos1=70, pos2=0 }
如果你需要反过来让pos1从70递减、pos2从0递增,只需要交换初始化值、把增减符号反过来、调整判断条件即可,逻辑完全一致。
更易读的替代写法
如果记不住for循环多变量的写法,用while循环实现逻辑更直白,运行效果和上面的for循环完全一致:
pos1 = 0; pos2 = 70; while (pos1 <= 70) { // 此处写需要同步执行的业务逻辑 // 单轮逻辑执行完成后,同步更新两个变量 pos1++; pos2--; }
之前几种错误写法的问题
- 独立双for循环:C++代码是按顺序逐行执行的,第一个for循环会跑完所有71次迭代,才会开始执行第二个for循环的代码,不可能实现同步效果
- 嵌套for循环:外层循环每执行1次,内层循环就会完整跑完自己的全部迭代,实际效果是pos1每加1,pos2就从70到0跑完整轮,和一步一同步的需求完全不符
实用提示:如果用这段代码驱动舵机、LED渐变这类硬件操作,记得在循环内加适当延时,比如
delay(15),否则整个变化过程会在数毫秒内跑完,硬件来不及响应,看不到渐变效果。
内容的提问来源于stack exchange,提问作者Jimmy Johnson
相关产品推荐
相关产品推荐

