【单片机复习笔记】十五届国赛复盘

一、发现的错误清单

🔴 严重错误(功能完全失效)

  1. 运算符混淆错误(第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语言中^是异或运算符,不是幂运算!

影响:距离计算完全错误,导致运动轨迹计算失败。


  1. 函数选择错误(第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()用于浮点数绝对值。

影响:三角函数计算精度损失,运动方向可能出现偏差。


  1. 串口命令解析不够健壮

// ❌ 原始代码

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匹配失败。

二、经验总结

✅ 编程基础知识

  1. C语言运算符必须牢记
  • ^ 是异或,不是幂运算

  • 平方应该用 x*x 或 pow(x, 2)

  • 不要把数学公式直接翻译成代码

  1. 函数选择要匹配数据类型
  • abs() → 整数绝对值

  • fabs() → 浮点数绝对值

  • labs() → 长整型绝对值

  1. 类型转换要显式
  • 整数运算结果赋值给浮点数前要先转换:(float)x

  • 避免隐式转换带来的精度问题


✅ 逻辑设计原则

  1. 条件判断要完整
  • 不要写无意义的条件(如ulms > 3000)

  • 相关的状态标志要一起检查(如cdget_flag)

  1. 边界条件要考虑
  • 系统刚启动时(ulms < 3000)

  • 状态转换时的前置条件

  • 测试模式的特殊需求

  1. 功能要考虑测试需求
  • 不能只实现正常流程

  • 要考虑测试时如何快速进入各种状态

  • 重置功能应该尽量通用

🎯 最重要的3条

  1. 数学公式翻译成代码时要特别小心
  • 不要想当然

  • 查文档确认运算符含义

  • 测试基本计算是否正确

  1. 逻辑判断要有意义
  • 每个条件都要能说出为什么

  • 避免冗余或矛盾的条件

  • 状态标志要配套使用

  1. 考虑实际使用场景
  • 不只是功能实现

  • 还要考虑测试、调试、维护

  • 边界条件和异常情况

相关推荐
xian_wwq4 小时前
【学习笔记】-深度认知系列-第2讲-大模型到底是什么?——拆解“参数、训练、推理”
笔记·学习·深度认知
星游路4 小时前
14单片机:LCD12864
单片机·嵌入式硬件
兴通物联科技4 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
lzhdim5 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
Oll Correct6 小时前
Adobe illustrator 案例九:百宝箱图标绘制
笔记·ui·adobe·illustrator
那年窗外下的雪.6 小时前
AIDC 学习日志|第 15 天|EVPN 多归属故障收敛与撤销机制
网络·学习·php
国科安芯7 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
M78佐菲7 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
我命由我123459 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime
天空'之城10 小时前
单片机基础核心知识点汇总(十七)
单片机·嵌入式硬件