Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 184956|回复: 68

Arduino编程基础(二)——C\C++语言基础(上)

  [复制链接]
发表于 2017-4-12 20:22 | 显示全部楼层 |阅读模式
本教程节选自《Arduino程序设计基础》

Arduino编程基础(一)——Arduino语言
http://www.arduino.cn/thread-45048-1-1.html
Arduino编程基础(二)——C\C++语言基础(上)
http://www.arduino.cn/thread-45049-1-1.html
Arduino编程基础(二)——C\C++语言基础(下)
http://www.arduino.cn/thread-45050-1-1.html
Arduino编程基础(三)——常用电子元件和扩展模块
http://www.arduino.cn/thread-45117-1-1.html
Arduino编程基础(四)——Arduino扩展板的使用
http://www.arduino.cn/thread-45152-1-1.html

[md]# 基础篇

本章开始,将由浅入深,详细介绍开发Arduino Uno所需的基础知识与开发方法。

## Arduino语言

Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。目前最新的Arduino核心库采用C与C++混合编写而成。

通常所说的Arduino语言其实是一套基于C/C++的嵌入式设备开发框架。其核心库文件提供了各种应用程序编程接口(Application Programming Interface,简称API)以供驱动硬件设备,这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用AVR单片机的Arduino的核心库是对AVR-Libc(基于GCC的AVR支持库)的二次封装。

传统开发方式中,需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。

而在Arduino中,使用了清楚明了的API替代繁杂的寄存器配置过程,如以下代码:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

```
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
```

pinMode(13,OUTPUT)即是设置引脚的模式,这里设定了13脚为输出模式;而digitalWrite(13,HIGH) 是让13脚输出高电平数字信号。

这些封装好的API,使得程序中的语句更容易被理解,不用理会单片机中繁杂的寄存器配置,就能直观地控制Arduino,增强程序的可读性的同时,也提高了开发效率。

## Arduino程序结构

在上一章已经看到第一个Arduino程序Blink,如果使用过C/C++语言,会发现Arduino的程序结构与传统的C/C++结构的不同------Arduino程序中没有main函数。

其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用Setup和loop这个两个函数。

通过 **Arduino IDE菜单\>文件\>示例\>01.Basics\>BareMinimum** 可以看到Arduino程序的基本结构:

```
void setup() {
  // 在这里加入setup代码,它只会运行一次:

}

void loop() {
  // 在这里加入loop代码,它会不断重复运行:

}
```


Arduino程序基本结构由setup() 和loop() 两个函数组成:

```
void setup()
```


Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。

```
void loop()
```

在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。

实际开发中,通常在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作;在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。



## C\\C++语言基础

C\\C++语言是国际上广泛流行的计算机高级语言。绝大多数硬件开发,均使用C/C++语言,Arduino也不例外。使用Arduino,需要有一定的C\\C++基础,由于篇幅有限,本书仅对C\\C++语言基础进行简单的介绍。此后章节中会穿插介绍一些特殊用法及编程技巧。

### 数据类型

在C\\C++语言程序中,对所有的数据都必须指定其数据类型。数据又有常量和变量之分。

需要注意的是,Arduino Uno与AVR做核心的Arduino中的部分数据类型所占用的空间和取值范围有所不同。

#### 变量

在程序中数值可变的量称为变量。其定义方法如下

```
类型 变量名;
```

例如,定义一个整型变量i:

```
int i;
```

可以在定义时为其赋值,也可以定义后,对其赋值,例如:

```
int i;
i=95;
```



```
int i=95;
```

两者是等效的。

#### 常量

在程序运行过程中,其值不能改变的量,称为常量。常量可以是字符,也可以是数字,通常使用语句

```
const 类型 常量名 = 常量值
```

定义常量。

还可以用宏定义来达到相同的目的。语句如下:

```
#define 宏名 值
```

如在Arduino核心库中已定义的常数PI,即是使用

```
#define PI 3.1415926535897932384626433832795
```

定义的。

> **#define宏定义**
>
> 宏定义是C语言提供的一种预处理方式,其允许使用标识符来表示一个字符串,编译器在开始编译前,会将代码中标识符全部替换成对应的字符串,以达到对程序预先处理的目的。合理使用宏定义,可以简化代码编写,避免输入及语法错误,提高程序可读性。

#### 整型

整型即整数类型。Arduino Uno可使用的整型数据取值范围如下

|     类型      |                           取值范围                           |     说明     |
| :-----------: | :----------------------------------------------------------: | :----------: |
|      int      | –32,768 ~ 32,767<br>( -2<sup>15</sup> ~ 2<sup>15</sup> - 1) |     整型     |
| unsigned int  |         0  ~ 65,535<br/>( 0 ~ 2<sup>16</sup> - 1)          |  无符号整型  |
|     long      | –2,147,483,648  ~ 2,147,483,647<br/>( -2<sup>31</sup> ~ 2<sup>31</sup> - 1) |    长整型    |
| unsigned long |      0 ~ 4,294,967,295<br/>( 0 ~ 2<sup>32</sup> - 1)       | 无符号长整型 |
|     short     | –32,768 ~ 32,767<br/>( -2<sup>15</sup> ~ 2<sup>15</sup> - 1) |    短整型    |


在Arduino Due、Zero中,int及unsigned int占用4字节(32位)。

#### 浮点型

浮点数也就是常说的实数。在Arduino中有**float**和**double**两种浮点类型,在Arduino Uno中,float类型占用4个字节(32位)内存空间,double类型占用8个字节(64位)内存空间;在Arduino Due、Zero中,double类型占用8字节(64位)内存空间。

浮点型数据的运算速度较慢且有一定误差,因此,通常会把浮点型转换为整型再进行相关运算。如9.8cm,通常会换算为98mm再计算。

#### 字符型

字符型,即**char**类型,也是一种整形,占用一个字节内存空间,常用于存储字符变量。存储字符时,字符需要用单引号引用,如

```
char col='C';
```

字符都是以整数形式储存在char类型变量中的,数值与字符的对应关系,请参照附录中ASCII码表。

#### 布尔型

布尔型变量,即boolean。它的值只有两个:false(假)和true(真)。boolean会占用1个字节的内存空间。

### 运算符与表达式

#### 运算符

C\\C++语言中有多种类型的运算符,常见运算符见表2-2:

| **运算符类型** | **运算符** |  **说明**  |
| :------------: | :--------: | :--------: |
|   算术运算符   |     =      |    赋值    |
|                |     +      |     加     |
|                |     -      |     减     |
|                |     *      |     乘     |
|                |     /      |     除     |
|                |     %      |    取模    |
|   比较运算符   |     ==     |    等于    |
|                |     !=     |   不等于   |
|                |     <      |    小于    |
|                |     >      |    大于    |
|                |     <=     | 小于或等于 |
|                |     >=     | 大于或等于 |
|   逻辑运算符   |     &&     | 逻辑与运算 |
|                |    \|\|    | 逻辑或运算 |
|                |     !      | 逻辑非运算 |
|    复合运算    |     ++     |    自加    |
|                |     --     |    自减    |
|                |     +=     |   复合加   |
|                |     -=     |   复合减   |



#### 表达式

通过运算符将运算对象连接起来的式子称之为表达式。如5+3、a-b、1\<9等。

### 数组

数组是由一组相同数据类型的数据构成的集合。数组概念的引入,使得在处理多个相同类型的数据时,程序更加清晰和简洁。

其定义方式如下:

```
数据类型 数组名称 [数组元素个数];
```

如,定义一个有5个int型元素的数组:

```
int a[5];
```

如果要访问一个数组中的某一元素,需要使用

```
数组名称[下标]
```

需要注意的是数组下标是从0开始编号的。如,将数组a中的第1个元素赋值为1:

```
a[0]=1;
```

可以使用以上方法对数组赋值,也可以在数组定义时,对数组进行赋值。如:

```
int a[5]={1,2,3,4,5};
```



```
int a[5];
a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
```

是等效的。

### 字符串

字符串的定义方式有两种,一种是以字符型数组方式定义,另一种是使用String类型定义。

```
char 字符串名称  [字符个数];
```

使用字符型数组的方式定义,使用方法和数组一致,有多少个字符便占用多少个字节的存储空间。

大多数情况下,可以使用String类型来定义字符串,该类型中提供一些操作字符串的成员函数,使得字符串使用起来更为灵活。

```
String 字符串名称;
```



```
String abc;
```

即可定义一个名为abc的字符串。可以在定义时为其赋值,或在定义后为其赋值,如

```
String abc;
abc = "Arduino Uno";
```



```
String abc = "Arduino Uno";
```

是等效的。

相较于数组形式的定义方法,使用String类型定义字符串会占用更多的存储空间。

### 注释

/*与*/之间的内容,及 // 之后的内容均为程序注释,使用它可以更好的管理代码。注释不会被编译到程序中,不影响程序的运行。
为程序添加注释的方法有两种:
单行注释:

```
// 注释内容
```

多行注释:

```
/*
注释内容1
注释内容2
......
*/
```[/md]
发表于 2017-5-19 11:54 | 显示全部楼层
很精致教程
 楼主| 发表于 2022-7-25 17:28 | 显示全部楼层
@NIA 发表于 2022-7-25 16:31
通过数组定义一个字符串,和用string定义同一个字符串。那个占用空间大?为什么? ...

string占用更大,因为char[]只是存储数据,而string是一个字符串对象,包含了更多可用操作
发表于 2017-4-26 11:04 | 显示全部楼层
初學者入門
发表于 2017-5-23 16:57 | 显示全部楼层
温故而知新!
发表于 2017-7-4 15:04 | 显示全部楼层
感谢大佬的教程
发表于 2017-7-8 06:49 | 显示全部楼层
貌似<>也表示不等于
发表于 2017-7-28 08:53 | 显示全部楼层
很好,很用心
发表于 2017-8-18 09:16 | 显示全部楼层
简单明了,适合初学者
发表于 2017-10-14 18:43 | 显示全部楼层
真是通熟易懂  啊谢谢咯哦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2023-1-27 11:56 , Processed in 0.068296 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表