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

一、发现的错误清单

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

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

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

  • 边界条件和异常情况

相关推荐
小弥儿7 小时前
GitHub今日热榜 | 2026-09-15:AI 智能体与本地生成工具领跑
学习·开源
老当益壮梁奶奶7 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
Horn Still Sounds7 小时前
ARM嵌入式基础|内核、寄存器、架构、存储、汇编移位全面梳理
arm开发·单片机·嵌入式硬件·硬件架构
susplus7 小时前
【初识ARM】ARM相关基础概念
学习·arm
星栖与芯8 小时前
LiteOS-M 切换汇编逐行图解(2):指令·异常机制·全景表
stm32·单片机·嵌入式硬件·harmonyos·鸿蒙系统
XiHongShi20168 小时前
键盘大小写指示器(代替键盘灯)
学习·计算机
小叶肥辉8 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
斯维赤9 小时前
AI Agent学习之路 | Prompt Engineering(提示词工程)的三板斧核心技巧
人工智能·学习·prompt
从零开始的嵌入式之旅9 小时前
day44
arm开发·经验分享·笔记·嵌入式硬件
硬禾科技11 小时前
连接世界的工程哲学
嵌入式硬件·测试工具·自动化·硬件工程