Arduino红外遥控器char[int]数组下标无效编译错误如何修复?
Arduino红外遥控器编译错误修复方案
已确认的错误点
- 字符比较误用双引号:C/C++语法中,
char类型单个字符需要用单引号包裹,你代码中key == "#"、array_choice == "A"等写法都是将char和字符串常量比较,属于语法错误,全部改为单引号即可,比如key == '#'、array_choice == 'A'。 - 数组指针类型定义错误:
int selected_array = A;的写法错误,数组名是指针类型,不能赋值给普通int变量,需要定义为指针类型:int* selected_array = A;;另外B数组对应的赋值写了双等号int selected_array == B;,属于把比较运算当成赋值,直接改为单等号即可。 - 按键返回值未做类型转换:
keypad.getKey()返回的是字符类型,比如按下数字0返回的是ASCII字符'0'(对应数值48),不是整数0,直接判断index_of_signal == 0永远不会成立,需要转换为整数:int signal_idx = index_of_signal - '0';。 - 按键读取无等待逻辑:你在发送完两个RC5信号后直接调用
keypad.getKey(),此时用户还没有完成按键操作,getKey会直接返回空值,后续逻辑都不会执行,需要加等待按键的逻辑:while( !(array_choice = keypad.getKey()) );阻塞等待用户按下数组选择键,索引选择同理。 - 重复初始化串口:
setup函数中两次调用Serial.begin(9600),属于冗余代码,删除一行即可。
替代实现方案
不需要写大量重复的A/B/C/D判断逻辑,直接用指针数组管理四个存储数组,代码可以精简80%:
- 定义指针数组关联四个存储数组:
int* stored_arrays[] = {A, B, C, D}; - 按下A/B/C/D后直接对应数组索引0/1/2/3,比如按A对应
stored_arrays[0],按B对应stored_arrays[1],不需要每个数组写一套重复的索引判断逻辑。
修复后的核心代码片段
#include <Keypad.h> #include <IRremote.h> const int ROW_NUM = 4; const int COLUMN_NUM = 4; int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; IRsend irsend; // 四个存储红外信号的数组 int A[10] = {0}; int B[10] = {0}; int C[10] = {0}; int D[10] = {0}; // 指针数组统一管理四个存储数组 int* stored_arrays[] = {A, B, C, D}; char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte pin_rows[ROW_NUM] = {2, 3, 4, 5}; byte pin_column[COLUMN_NUM] = {6, 7, 8, 9}; Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); irrecv.enableIRIn(); } void loop(){ char key = keypad.getKey(); if (key == '#'){ irsend.sendRC5(0x0, 8); delay(200); irsend.sendRC5(0x1, 8); delay(200); // 等待用户选择数组 char array_choice; while( !(array_choice = keypad.getKey()) ); int array_idx = -1; if(array_choice == 'A') array_idx = 0; else if(array_choice == 'B') array_idx = 1; else if(array_choice == 'C') array_idx = 2; else if(array_choice == 'D') array_idx = 3; if(array_idx == -1) return; // 按的不是A/B/C/D直接退出 // 等待用户选择信号索引 char index_char; while( !(index_char = keypad.getKey()) ); if(index_char < '0' || index_char > '9') return; // 按的不是数字直接退出 int signal_idx = index_char - '0'; // 发射对应信号 irsend.sendRC5(stored_arrays[array_idx][signal_idx], 8); delay(200); } if (key == '*') { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); } } }
编译错误排查技巧
如果Arduino IDE没有显示具体错误位置,按以下操作排查:
- 打开IDE的详细编译输出:
文件 -> 首选项 -> 编译过程中显示详细输出,勾选后重新编译,就能看到具体的报错行号和错误原因。 - 分段注释代码排查:先注释掉loop函数内所有逻辑,只保留空loop函数,编译没问题后逐步放开注释,直到触发报错,即可定位到错误代码段。
内容的提问来源于stack exchange,提问作者Megatoh
相关产品推荐
相关产品推荐

