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

一、发现的错误清单

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

  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. 考虑实际使用场景
  • 不只是功能实现

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

  • 边界条件和异常情况

相关推荐
是温不嗜温1 小时前
芯茂微 LP7012 双重过流保护机制拆解:DESAT 单次锁存 vs OCP 连续 5 次锁存有何区别?
嵌入式硬件·开闭原则·电源管理·电源芯片·ac-dc
HPT_Lt1 小时前
ZCC5146 支持100V宽压多功能同步降压控制器,兼容LM5146
嵌入式硬件
智者知已应修善业1 小时前
【51单片机按键控制1分钟正计时倒计时暂停复位】2024-1-2
c++·经验分享·笔记·算法·51单片机
秋漓2 小时前
Nginx学习与应用
运维·学习·nginx
searchforAI2 小时前
长视频和播客怎么变成结构化读书笔记?一套 AI 时代的知识管理方法
人工智能·笔记·gpt·音视频·语音识别
DS小龙哥2 小时前
基于ESP32-S3设计的智能人脸识别门禁系统
stm32·单片机·嵌入式硬件
一棵树73512 小时前
信号与通信
单片机·嵌入式硬件
鸢惜2 小时前
菜鸟教程学习笔记——html(二)
笔记·html5
JNX_SEMI3 小时前
Hi6000C可与H6912直接对标,管脚完全兼容
单片机·嵌入式硬件·物联网·硬件工程