Arduino编程采用C语言编程的语法,由于arduino是基于avr单片机的,因此也做了一些修改,并且对函数进行了大量的扩充,使得arduino的端口和外设使用更加方便。
一、变量OR常量
1、变量:就是一些数据的代号而已,但是关于变量名其实各种语言都有要求,其中C语言的变量名明确规定:可以包括字母大写、小写都可以,下划线和数字,数字不能排第一个(规定);这里有个坑,就是windows下用应用,有的区分大小写,有的不区分;其他的补充就是除了循环变量,尽量让变量名做到顾名知意,也就是高手说的,代码的自解释性。
2、为什么要变量:为了更好的应用和表示数据,如果我们知道一个同学的身高是1.65m,但是随着时间的流逝,可能该同学毕业时,身高已经是1.92m了,如果直接用数据表示,就不如用变量来表示下,使用起来就是很方便。
3、变量的要素:左值和右值,这两个要素都和变量的类型有关,不同的类型需要的存储空间大小不同(左值),能存储的最值也不同(右值),C语言中通过指针将左值和右值完美结合,解析指针获取右值,指针本身表示左值;其实,仔细想来,变量也是将左值和右值实现了结合,取地址获取变量的左值,变量本质获取变量的右值;因此无论是指针还是变量都是C编程中的重要元素。
4、变量的作用域:
在函数外声明的变量就是全局变量;在函数中声明的变量就是局部变量,在代码块中的变量叫块变量。
5、变量的修饰符:
static:静态变量,常用来创建对某个函数可见的变量,但与一般局部变量不同的是,局部变量在每次调用时,都会创建和销毁,而静态变量在函数调用后已经保留原来的值。静态变量只在函数第一次调用时被创建和初始化。
volatile:易失变量或内存型变量,和static变量相反,这种变量容易被外界改变,每次使用需要从RAM中读取变量值方为上策;
const:常量关键字,简单说就是值不能变化的量;其实常量更多的是一种协定,程序在运行过程中一般都会根据契约精神不会让常量变化,但不是说常量一定不能变化,如果有程序员不讲武德,也是可以改变常量的值的。其实和常量类型的有一种宏定义,从表面看来都是不能变化的量,但是主要是常量是编译期间在程序的栈空间中,而宏定义则是在预编译期间完成替换,基本不占用编译时间。宏定义更多用来定义函数,定义变量和常量差不多。
arduino中几个常量:逻辑层:true和false,其中false为0,不为0就是true
硬件层:管脚输出电压定义HIGH和LOW,就是表面含义
管脚功能定义INPUT和OUTPUT,表示输入和输出
二、数据类型
1、boolean类型
布尔类型,表示一个变量只能有两种取值,true or false,每个boolean变量占一个字节的内存
2、char类型
字符类型,可以表示ADCII码中的编码,也可以表示数值,在-128~127,赋值的时候可以使用字符,也可以使用数值
3、unsigned char类型
无符号字符类型占用1个字节,与byte类型相同,表示范围2~255
4、byte类型
字节型,表示一个字节存储8位无符号数,范围为0~255
5、int类型
表示整数的基本类型,占用2字节,整数范围为:-32768~32767,即-2^15~2^15-1
整型使用2的补码方式存储负数,最高位位符号位,表示数的正负,其余位取反加1:具体如下:
为了简化问题,现在假如有byte型数据表示-20,写的过程为:先将最高位写为1;剩下的位数表示20, 1001 | 0100,再将除最高位的求反为: 1110 | 1011, 将结果加1为: 1110 | 1100
读的过程为:先读取最高位为1,表明是负数,将剩下的位数求反:1001 | 0011,结果为-19,将结果减去1,实际值就是-20
6、unsigned int类型
无符号整型与整型的唯一区别就是不能存储负数,当变量的值超过类型所能表示的最大值值,结果就会走向另一个极端,变的非常小,反之也一样。
7、word类型
unsigned int完全相同
8、long类型
是扩展的数字存储变量,可存储32位大小的变流量,从-2^31~2^31-1
9、unsigned long类型
作为long型的无符号类型,不能储存负值,数据存储范围从0~2^32
10、float类型
可以拥有小数点的数据。
常常用来模拟连续值,比整型具有更大的精确度;
取值范围-3.4028235E+38~3.4028235E+38;
被存储位32位的信息;
只有6~7位有效数字;
尽量不要用浮点类型的数据比较大小,必须这么做,可以设置一个误差范围,小于就可以判定相等更合适
浮点类型的数据计算速度远慢于整型计算,尽量避免浮点运算,可以先将数据表示位整型,到最后结果时再转换位浮点类型
11、double类型
arduino上的double类型和float类型完全一致
12、string类型
两种表现形式:字符串数据类型,做一个字符串,由char类型的字符数组加空终止符( )构成,定义字符串时有多种方式:
1、只声明:char Str1[15] //该字符串中只能存储14个字符,不要忘了终止符( ),以下一样
2、潜定义:char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //定义为8,考虑到存储7个字符,需加终止符
3、明定义:char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', ‘ '}; //定义为8,存储7个字符,明确加上了终止符
4、推定义:char Str4[] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //定义为空,考虑到存储7个字符,加终止符,可推出为8
5、char Str5[8] = "arduino"; //和定义2效果完全一样
6、char Str6[] = "arduino"; //和定义4效果完全一样
7、char Str7[15] = "arduino"; //这种定义为后来存储更多字符预留空间,前边存储了arduino7个字符,中间7个用空白占位,最后一个用 结束
8、char Str8[] = "arduino""is""good!"; //将很长的字符串按类别打包,使用更方便
说明:
1)、空终结符的ASCII码为0,通过该值明确表示函数可以到此结束了,是个约定,后面即便有数据也不再读取了,字符串的结尾会自动填充,也必须填充空字符串;
2)、字符必须用单引号包括,字符串必须用双引号包括,如果用字符数组定义时,用字符分解而以;
3)、过长的字符串,可以分成较短的字符串,可以称之为字符串分开打包;如上边定义8所示;
4)、字符串数组,当需要大量的字符时,常常用字符串表示,比如墨水屏显示中等;如:
char *myStrings[] = {"This is one!",
"This is two!",
"This is thr!",
This is fou!";
};
void setup(){
Serial.begin(9600);
}
void loop(){
for(int i = 0; i < 6; i++){
Serial.println(myStrings[i]);
delay(500);
}
}
代码解析,定义中使用字符 指针类型的数组,其实就是数组中的数组,等价与2维数组,也可以等于指针的指针;
loop中的应用是,就是根据定义,第一打印第一个字符串,由于myStrings[i]是个字符指针,执向每个字符串的首字符地址,打印过程知道碰到 才结束,0.5s后增加i的值,从而指向下一个字符串,打印等,以此类推,完成了所有字符串的打印。
13、String object类型
操作罗字符串的简单操作,连接、增加、寻找和替换字符串,官方参考手册具体为:
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
Operators
14、Arrays类型
数组类型和其他的差不多,数组三要素类型、名称、大小,通过下表访问数组元素;
15、void类型
主要用在函数类型和指针
16、sizeof()
类型大小的获取操作符
三、类型转换
最终形态和声明的类型不一致时,可以通过类型转换完成数据的匹配,主要包括暗转换和明转换,暗转换主要发生在数据类型变小时,可以由编译器自动完成转换;明转换需要有用户明确提出转换才能转换。主要包括char、byte、int、word、long、float类型间转换,语法就是再类型后加上(),括号中添加需要转的变量即可,例如:
int var1 = 65;
char var2 = char(var1); //类型强制转化
char var1 = 65;
int var2 = var1; //类型暗转换