首页
社区
课程
招聘
[原创]Arduino编程语法
2016-9-10 22:25 8136

[原创]Arduino编程语法

2016-9-10 22:25
8136
Arduino编程语法

返回上一层

记得几年前我开始学Arduino的时候,发现Arduino编程语法,很多书籍和教程都是不讲的。为什么呢?大家看完这篇贴子也就明白了。

如果你要学习写Arduino程序,不知道它的语法怎么能行呢?
那么,今天我们就来谈谈Arduino的语法,其实我认为语法最重要的东西应该来讲不是很多。基本的了解了,其他查一下资料应该是没有问题的。
大概有主要有两个部分,一个是程序结构,另一个是循环语句,最后多了一点宏和函数

一、程序结构
首先,来说说最基本的程序结构:

现在,我们给程序增加点代码:


1.int ledpin=13;//定义数字接口13
2.void setup()
3.{
4.  Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.  pinMode(ledpin,OUTPUT);//设置数字13 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义。
6.}
7.void loop()
8.{
9.    digitalWrite(ledpin,HIGH);//点亮数字13 口LED。
10.}


再把程序改改,我想让LED熄灭
1.int ledpin=13;//定义数字接口13
2.void setup()
3.{
4.  Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.  pinMode(ledpin,OUTPUT);//设置数字13 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义。
6.}
7.void loop()
8.{
9.    digitalWrite(ledpin,LOW);//熄灭数字13 口LED。
10.}

看起来是不是很简单?
Arduino是不是比C语言简单多了。

二、控制语句
不用多说,当然是if else for while switch case等,这些关键字,只要略懂编程应该是没有问题的。
1、先来用一下if

1.int val;//定义变量val
2.void setup()
3.{
4.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.}
6.void loop()
7.{
8.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
9.if(val == 'r')//判断接收到的指令或字符是否是“r”。
10.{
11.Serial.println("Hello World!");//显示“Hello World!”字符串
12.}
13.}

2、再来用一下if else

1.int val;//定义变量val
2.void setup()
3.{
4.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.}
6.void loop()
7.{
8.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
9.if(val == 'r')//判断接收到的指令或字符是否是“r”。
10.{
11.Serial.println("Hello World!");//显示字符串
12.}
13.else
14.{
15.Serial.println("Hello boy");//显示字符串
16.}
17.}

For循环

1.int val;//定义变量val
2.void setup()
3.{
4.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.}
6.void loop()
7.{
8.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
9.if(val == 'r')//判断接收到的指令或字符是否是“r”。
10.{
11.for (int i=0; i <=5; i++)
12.{
13.Serial.println("Hello World!");//显示“Hello World!”字符串
14.delay(10);
15.}
16.}
17.}

接下来switch case

1.int val;//定义变量val
2.void setup()
3.{
4.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.}
6.void loop()
7.{
8.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
9.switch (val)
10.{
11.case '1':
12.Serial.println("Hello 1");//显示字符串
13.break;
14.case '2':
15.Serial.println("Hello 2");//显示字符串
16.break;
17.case '3':
18.Serial.println("Hello 3");//显示字符串
19.break;
20.default:
21.break;
22.}
23.}

最后一个是while循环

1.int val;//定义变量val
2.void setup()
3.{
4.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
5.}
6.void loop()
7.{
8.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
9.while(val=='1')
10.{
11.Serial.println("Hello 1");//显示字符串
12.delay(1000);
13.}
14.
15.}

三、宏和函数

在宏和函数上,我还是非常喜欢的。这样代码写得多的时候,就很方便了。
下面是一个求最小值的宏(宏的名字,我一般会大写)
1.#define MIN(a, b) ((a)<(b)?(a):(b))



1.#define MIN(a, b) ((a)<(b)?(a):(b))
2.int val;
3.void setup()
4.{
5.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
6.}
7.void loop()
8.{
9.val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
10.while(val=='1')
11.{
12.Serial.println(MIN(1, 3));//显示较小值
13.delay(1000);
14.}
15.
16.}

再来一个求区间的宏
1.#define CONSTRAIN(amt, low, high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))


1.#define CONSTRAIN(amt, low, high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
2.int val;
3.int nRet;
4.void setup()
5.{
6.Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
7.}
8.void loop()
9.{
10.val = Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
11.delay(2000);
12.nRet = CONSTRAIN(val, '1', '10');
13.Serial.println(nRet);//显示较小值
14.
15.}

------------------------------------------------------------------


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 3
打赏
分享
最新回复 (13)
雪    币: 6782
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2016-9-11 17:25
2
0
多谢mozha的辛勤付出,嵌入式和单片机绝大部分都采用C/c++语言。
雪    币: 237
活跃值: (217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzcc 2016-9-11 20:17
3
0
嗯,这个貌似挺火,有人已经做成了中文版
上传的附件:
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
malokch 2 2016-9-12 01:48
4
0
arduino的语法就是c++的语法,编译器是gcc-avr。*.ino文件里的loop setup是托管的代码,类似qt,在编译之前会有一次预处理。最终都是转成c++源文件到临时目录,然后用gcc编译。说起来这两天倒霉~~ 买到一块漏焊1117的leonardo~~然后也有一块uno过大电流烧了16u2~~然后今晚又是市电不稳定烧了电烙铁~~~倒霉到欲哭无泪~~
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小小海浪 2016-9-12 08:33
5
0
mark ,谢谢
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
mozha 2 2016-9-12 11:26
6
0
对此,我表示同情,我学单片机的时候,也很惨的,烧坏东西也是很多。
在《Arduino开发实战指南(AVR篇)》中

这个问题,我也想了很久。
我用VC6写程序的时候,最喜欢用C,但是C++的类的确用起来很方便,不过,我写的代码全部还是按C语言的规范来的,但是C++也是很麻烦(很多东西都要自己写)。再后来,装上VA插件就好多了。不过,这样还是不满足我的要求,然后又开始写一堆宏(把很多常用的都弄成中文的(#define 整数 int),VS2013支持,VC6不支持中文)...
最后,我写了个记事本,把我的代码(比VA增加树控件可以像MSDN一样查询,有点像E语言)替换成C++,形成了我自己的编程语言了(我还给它取了一个名字)。
我提这件事,只是想说明一下,Arduino给我们用的时候,做了很多我们看不到的事。
C/C++为什么这么牛?因为它是标准。只要编译器敢说,支持C/C++,那么你按标准来写代码是一定能编译、执行成功的。
所以,Arduino即做了C/C++支持,也绝对不会说,支持C/C++(因为标准里面的东西太多了)。现在提编译器这个比较少了,主流的编译器也就这么几款。
更何况,Arduino做的事,只是为了开发方便。
上传的附件:
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
malokch 2 2016-9-12 18:47
7
0
说起来的话,我是几乎没怎么用过vc(vs),但是对gcc比较了解。arduino用的编译器是gcc4.8(arduino ide1.7),gcc的地位我就不提了。我想说的是,arduino不是说做了c++支持,而根本就是支持c++。因为除了线程模型,几乎都没有阉割。
```
./avr-gcc -v
Using built-in specs.
COLLECT_GCC=./avr-gcc
COLLECT_LTO_WRAPPER=/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/../libexec/gcc/avr/4.8.1/lto-wrapper
Target: avr
Configured with: ../gcc-4.8.1/configure --enable-fixed-point --enable-languages=c,c++ --prefix=/Users/jenkins/jenkins/workspace/toolchain-avr-3.4.5-mac32/objdir --enable-long-long --disable-nls --disable-checking --disable-libssp --disable-libada --disable-shared --with-avrlibc=yes --with-dwarf2 --disable-doc --target=avr
Thread model: single
gcc version 4.8.1 (GCC)
```
对于c++我一直都觉得这是一门浪费程序员精力的语言,一直都是能不用就不用,宁愿用c写一大堆的结构体和malloc free~~.至于微软的c++只做过一点mfc的小程序,也没啥好感。

早年我也是从windows上做开发的,但是微软系的东西都太封闭了,不利于学习,深深地伤害了我,后来就全面转*nix了。尽管现在无所谓什么操作系统了,但是还是不想回到windows。现在无论是做电子设计还是软件开发都在osx上做。查文档man一下,或者扔到dash里,便捷快活。
雪    币: 51
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
ONDragon 2016-9-13 18:01
8
0
这能不能做那个BadUsb啊?
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
mozha 2 2016-9-13 21:00
9
0
你如果感兴趣的话可以百度看看:
Teensy USB HID渗透测试(一)-Arduino的安装和介绍
http://www.tuicool.com/articles/QBf67r
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-14 12:25
10
0
55555版主。我也要申请加入硬件小组T_T。我也想要带头衔

我要发关于树莓派的。
雪    币: 16054
活跃值: (1215)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2016-9-14 13:04
11
0
我还有多少分?
雪    币: 540
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chuxuezhe 2016-9-16 21:02
12
0
mark,多谢楼主
雪    币: 6782
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2016-9-16 23:16
13
0
可以先通过小组报名的方式,面试合格的话就可以加入。
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-17 00:05
14
0
55555看样子光有一腔热情还不够。等我学好了再来申请。
游客
登录 | 注册 方可回帖
返回