Arduino红外遥控器计算器OLED显示double变量异常问题求助
问题分析与解决方案
1. 大整数/浮点数无显示问题
原因
displayTextOnRight函数大概率没考虑字符长度超出OLED显示区域的情况:100000是6位数字,99999是5位;1000.00含小数点共6位,100.00是5位。如果OLED单行显示宽度不够,超出部分会被直接截断或不渲染。- 另一种可能是
String(double, int)的格式化逻辑处理大数值时出现内存溢出,导致渲染失败。
解决方案
- 限制显示字符长度:格式化字符串前先判断长度,超过OLED单行最大字符数时拆分多行显示:
String numStr = String(100000, 0); if(numStr.length() > 5){ // 假设单行最多显示5位 displayTextOnRight(numStr.substring(0,3)); u8g2.setCursor(0, u8g2.getCursorY() + 10); // 下移行高 displayTextOnRight(numStr.substring(3)); } else { displayTextOnRight(numStr); } - 改用高效格式化方式:避免
String类的内存开销,用snprintf直接格式化到字符数组,减少内存碎片:char buf[16]; snprintf(buf, sizeof(buf), "%d", 100000); // 整数格式化 // 浮点数格式化:snprintf(buf, sizeof(buf), "%.2f", 1000.00); displayTextOnRight(buf);
2. 负数导致设备崩溃问题
原因
- 负数格式化后多了一个负号,字符长度进一步增加,若缓冲区分配过小会引发栈溢出或内存越界。
displayTextOnRight函数可能未处理负号的渲染逻辑,导致u8g2库绘制时出错。
解决方案
- 提前处理负数符号:格式化时单独处理负号,确保缓冲区足够容纳符号+数字:
double num = -123.45; char buf[16]; if(num < 0){ snprintf(buf, sizeof(buf), "-%.2f", -num); // 取绝对值后加负号 } else { snprintf(buf, sizeof(buf), "%.2f", num); } displayTextOnRight(buf); - 检查
displayTextOnRight实现:确认函数内部有没有硬限制字符串长度,比如固定分配6字节缓冲区,负数进来后直接越界写入。
3. 输入数字6后无响应问题
原因
- 红外遥控器的按键解码逻辑可能在处理数字6时进入死循环,或触发内存越界(比如数组下标溢出覆盖程序关键变量)。
- 计算器状态机逻辑可能在输入6后进入异常分支,导致后续按键事件无法被处理。
解决方案
- 添加按键解码调试:在红外解码函数中打印每个按键的扫描码,确认数字6的码值是否被正确识别,有没有和其他功能键冲突:
void decodeIR(){ if(irrecv.decode(&results)){ Serial.println(results.value, HEX); // 打印扫描码到串口 irrecv.resume(); } } - 检查状态变量:输入6后,打印当前输入缓冲区、计算状态等关键变量的值,排查是否出现异常值。
- 排查内存越界:如果用数组存储输入数字,确认数组下标未超出范围——比如输入6后下标溢出,覆盖了红外接收的中断标志位,导致后续按键无法触发。
内容的提问来源于stack exchange,提问作者warriorCavt
相关产品推荐
相关产品推荐

