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
相关产品推荐
相关产品推荐

