记Arduino中的一些坑

长期不定时更新。

1.Multiple Defination问题

问题表现: 编译失败,提示函数多重定义却又不给出首次定义地点。

错误提示:

1
2
3
Error Compiling
Control.cpp:53: multiple definition of `TrueControl(double, double, double)'
Control.cpp.o:Control.cpp:53: first defined here

错误原因: 猜测编译器会忽略后缀为.cpp文件中的#ifndef?总之还是老老实实写一个.h和一个.cpp准没错。

解决办法:

  • 将出错文件名后缀改为.h即可。(<-不规范)
  • 将函数定义单独放到.h文件中并使用#ifndef ... #define... #endif(<-规范,未测试)

2.Uploading问题

问题表现: 成功编译,但上传失败。

错误提示:

1
2
3
4
5
6
Problem Uploading to board
avrdude: stk500_recv(): programmer is not responding

-- or

Clock not synchronize

错误原因: 常见于Arduino mini等没有直接USB接口的设备。原因为设备没有引出时钟线导致时钟不同步。

解决办法: 上传的一瞬间按下Reset按键即可,也可以按住在上传的一瞬间松开。

3.Double Include问题

问题表现: 不定。

常见错误提示:

1
2
3
4
5
'XXX' was not declared in this scope

-- or

'XXX' does not name a type

错误原因: 你以为Include了,实际上并没有。

解决办法: 将所有需要的头文件在.ino文件头再次#include一次。当然不要忘记在头文件里加入#ifndef

解释&吐槽: 这个问题简直坑死爹了好吗!翻了好久才在Arduino论坛上找到。老外的解释是:

Arduino的编译器会将当前文件夹下用得到的文件拷贝到一个临时目录中进行编译(这也是为什么Arduino会要求将文件移到文件夹中),而编译器只会将.ino文件中包含的文件视作需要编译的文件(绕口令)。所以会无视包含中的包含。

也就是说,如果你有一个这样的包含关系:

1
2
3
4
5
| Arduino.ino
| library.h
| sublibrary.h
| math.h
|lib.h

而只在Arduino.h中包含了library.h,lib.h那么在编译的时候编译器将不会拷贝sublibrary.hmath.h从而导致编译失败。

待续。

四轴飞行器完全指南0x01 - Arduino、姿态解算和滤波

说来这个“好想做个四轴飞行器玩啊”的想法不知不觉就已经一个年头了呢,谁能想到当年这么随便的一个脑洞如今变成了学校的科研项目OTZ 既然拿了人家的经费,也就没有不把它做出来的道理,于是就这样愉快地把过程记录下来吧!

#目录


那么,开始制作吧!

Read More