You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Arduino读取6路高低电平代码报错问题求助

解决Arduino代码中的类型不匹配与语法错误

你这段代码里有几个关键的语法和类型问题,正是它们导致了那些编译警告,我来帮你逐个拆解修复:

1. 指针数组误用导致的类型不匹配

你声明了int *PinsReadOut[6],这是一个存储整数指针的数组,但你实际需要的是存储每个引脚读取到的电平(HIGH/LOW,本质是整数)的普通整数数组。这就是为什么会出现“pointer and integer”和“int to int*”的转换错误——你把整数和指针混在一起用了。

把它改成普通整数数组:

int PinsReadOut[6] = {0,0,0,0,0,0};

2. 未声明变量类型

CntlLP = -1;这里没有显式声明CntlLP的类型,虽然编译器可能会默认处理,但显式声明能避免潜在问题:

int CntlLP = -1;

3. For循环语法错误

所有for循环的格式都错了,正确格式是for(初始化; 条件; 增量),你用了逗号分隔,而且条件写成了ii > 6(应该是ii < 6,因为数组索引从0到5):
比如setup里的循环修正后:

for (int ii = 0; ii < 6; ii++) {
  pinMode(InPins[ii], INPUT);
}

ReadPins函数里的循环同理,而且你之前把所有读取结果都赋值给了PinsReadOut[0],应该对应每个索引ii

for (int ii = 0; ii < 6; ii++) {
  PinsReadOut[ii] = digitalRead(InPins[ii]);
}

4. Switch语句缺少大括号

你的switch结构没有用大括号包裹case块,这会导致语法错误,正确写法是给switch加上外层大括号:

void loop(){
  switch(CntlLP) { // 新增左大括号
    case -1:
      // ... 代码 ...
      break;
    case 1:
      // ... 代码 ...
      break;
    case 2:
      // ... 代码 ...
      break;
  } // 新增右大括号
}

5. 函数调用参数错误

调用ReadPins(PinsReadOut[6]);的时候,PinsReadOut[6]是数组的第7个元素(越界了,数组只有0-5索引),而且ReadPins需要的是整个数组,直接传数组名即可:

ReadPins(PinsReadOut);

6. If语句括号错误

你的if条件括号位置不对,逻辑与&&需要被包含在if的括号里,同时建议用HIGH代替1,更符合Arduino代码规范:

if ((PinsReadOut[0] == HIGH) && (PinsReadOut[1] == HIGH)) {
  Serial.println("Received 1 & 2");
}

修正后的完整代码

const int InPins[6] = {3,4,5,6,7,8};
int PinsReadOut[6] = {0,0,0,0,0,0};
int CntlLP = -1;

void setup() {
  Serial.begin(115200);
  for (int ii = 0; ii < 6; ii++) {
    pinMode(InPins[ii], INPUT);
  }
}

void loop(){
  switch(CntlLP) {
    case -1:
      Serial.println("Waiting for Command");
      while (Serial.available() == 0){}
      CntlLP = Serial.parseInt();
      break;
    case 1:
      ReadPins(PinsReadOut);
      CntlLP = -1;
      break;
    case 2:
      if ((PinsReadOut[0] == HIGH) && (PinsReadOut[1] == HIGH)) {
        Serial.println("Received 1 & 2");
      }
      if ((PinsReadOut[2] == HIGH) && (PinsReadOut[3] == HIGH)) {
        Serial.println("Received 3 & 4");
      }
      if ((PinsReadOut[4] == HIGH) && (PinsReadOut[5] == HIGH)) {
        Serial.println("Received 5 & 6");
      }
      CntlLP = -1;
      break;
  }
}

void ReadPins(int PinsReadOut[6]) {
  for (int ii = 0; ii < 6; ii++) {
    PinsReadOut[ii] = digitalRead(InPins[ii]);
  }
}

额外小提示

  • HIGH/LOW代替1/0能让代码更易读,也贴合Arduino的API设计
  • 数组索引从0开始,一定要注意不要越界访问(比如PinsReadOut[6]是非法的)
  • 所有语法结构(for、switch、if)的括号要正确配对,这是新手很容易踩的坑

内容的提问来源于stack exchange,提问作者Hojo.Timberwolf

火山引擎 最新活动