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




