一、发现的错误清单
🔴 严重错误(功能完全失效)
- 运算符混淆错误(第139行)
// ❌ 错误
dev_to_dir_dist = sqrt((dir_x-dev_x0)^2 + (dir_y-dev_y0)^2);
// ✅ 正确
dev_to_dir_dist = sqrt((dir_x-dev_x0)*(dir_x-dev_x0) + (dir_y-dev_y0)*(dir_y-dev_y0));
错误原因:将数学中的平方符号^2直接写成了C语言的^,但C语言中^是异或运算符,不是幂运算!
影响:距离计算完全错误,导致运动轨迹计算失败。
- 函数选择错误(第140-141行)
// ❌ 错误
cos1 = abs(dir_x-dev_x0)/dev_to_dir_dist;
sin1 = abs(dir_y-dev_y0)/dev_to_dir_dist;
// ✅ 正确
cos1 = fabs((float)(dir_x-dev_x0))/dev_to_dir_dist;
sin1 = fabs((float)(dir_y-dev_y0))/dev_to_dir_dist;
错误原因:abs()用于整数绝对值,fabs()用于浮点数绝对值。
影响:三角函数计算精度损失,运动方向可能出现偏差。
- 串口命令解析不够健壮
// ❌ 原始代码
else if(strcmp(uart_buf, "?") == 0)
else if(strcmp(uart_buf, "#") == 0)
// ✅ 改进后
else if(strncmp(uart_buf, "?", 1) == 0) // 只比较首字符
else if(strncmp(uart_buf, "#", 1) == 0)
原因:串口接收可能包含换行符、回车符等多余字符,导致strcmp匹配失败。
二、经验总结
✅ 编程基础知识
- C语言运算符必须牢记
-
^ 是异或,不是幂运算
-
平方应该用 x*x 或 pow(x, 2)
-
不要把数学公式直接翻译成代码
- 函数选择要匹配数据类型
-
abs() → 整数绝对值
-
fabs() → 浮点数绝对值
-
labs() → 长整型绝对值
- 类型转换要显式
-
整数运算结果赋值给浮点数前要先转换:(float)x
-
避免隐式转换带来的精度问题
✅ 逻辑设计原则
- 条件判断要完整
-
不要写无意义的条件(如ulms > 3000)
-
相关的状态标志要一起检查(如cdget_flag)
- 边界条件要考虑
-
系统刚启动时(ulms < 3000)
-
状态转换时的前置条件
-
测试模式的特殊需求
- 功能要考虑测试需求
-
不能只实现正常流程
-
要考虑测试时如何快速进入各种状态
-
重置功能应该尽量通用
🎯 最重要的3条
- 数学公式翻译成代码时要特别小心
-
不要想当然
-
查文档确认运算符含义
-
测试基本计算是否正确
- 逻辑判断要有意义
-
每个条件都要能说出为什么
-
避免冗余或矛盾的条件
-
状态标志要配套使用
- 考虑实际使用场景
-
不只是功能实现
-
还要考虑测试、调试、维护
-
边界条件和异常情况