You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:45:49