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

Arduino C程序时间计算异常求助

问题分析与修正方案

你的代码存在两个核心问题导致时间计算错误:

1. 整数溢出

Arduino的int类型默认是16位,最大值仅为32767秒(约9小时)。当赛事总时长(尤其是骑行这类长时间项目)超过这个值时,会触发整数溢出,导致计算结果变成负数或错误的小数值。

你声明的ToSecs数组用于存储各项目及总时间的秒数,必须改用long类型(32位,最大值约24天)来避免溢出。

2. 未输出总时间结果

代码中已经计算了总时间ToSecs[3],但输出循环仅遍历前3项(游泳、骑行、跑步),没有展示总时间的转换结果。


修正后的代码

void setup() {
  Serial.begin(9600);
  Serial.println(".");
  Serial.println("Please input your time values as follows: seconds, minutes, hours, for the swim, the bike, and the run.");
  long SecsMinsHoursSBR[9];
  const int NumberOfEvents = 3;

  for (int i = 0; i < 9; i++)
  {
    SecsMinsHoursSBR[i] = ReadLine();
  }

  // 改为long类型,避免溢出
  long ToSecs[4];
  ToSecs[0] = (SecsMinsHoursSBR[2]*3600) + (SecsMinsHoursSBR[1]*60) + SecsMinsHoursSBR[0];
  ToSecs[1] = (SecsMinsHoursSBR[5]*3600) + (SecsMinsHoursSBR[4]*60) + SecsMinsHoursSBR[3];
  ToSecs[2] = (SecsMinsHoursSBR[8]*3600) + (SecsMinsHoursSBR[7]*60) + SecsMinsHoursSBR[6];
  ToSecs[3] = ToSecs[0] + ToSecs[1] + ToSecs[2];
  String Race[4] = {"Swim", "Bike", "Run", "Total"};

  // 遍历4次,包含总时间输出
  for (int i = 0; i < 4; i++)
  {
    Serial.println(Race[i] + " Total:");
    Serial.print("Hour:");
    Serial.println(ToSecs[i] / 3600);
    Serial.print("Minutes:");
    Serial.println((ToSecs[i] % 3600) / 60);
    Serial.print("Seconds:");
    Serial.println((ToSecs[i] % 3600) % 60); 
    Serial.println(); // 加空行分隔,提升可读性
  }
}

// 改为返回long类型,逻辑更严谨
long ReadLine(){
  Serial.println("Please input your value:");
  while (!Serial.available()){
    ;
  }
  long x = Serial.parseInt();
  Serial.println(x);
  return x;
}

void loop() {
  
}

额外优化建议

  • 可以在输入时增加针对性提示(比如"Input Swim seconds:"),避免用户混淆输入顺序。
  • 对输入的秒、分数值做合法性检查(比如秒和分不能超过59),防止无效输入导致错误计算。

内容的提问来源于stack exchange,提问作者willnorris0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:24:53