最新消息:

Arduino语法-数据类型

Arduino 少儿编程 1386浏览 0评论
Arduino语法参考

语法列表

  • void
  • boolean
  • char
  • unsigned char
  • byte
  • int
  • unsigned int
  • word
  • long
  • unsigned long
  • float
  • double
  • string
  • String(c++)
  • array

void类型说明

void只用在函数声明中。它表示该函数将不会被返回任何数据到它被调用的函数中。

例子:

//功能在“setup”和“loop”被执行
//但没有数据被返回到高一级的程序中

void setup()
{
// ...
}
 
void loop()
{
// ...
}

boolean类型说明

布尔

一个布尔变量拥有两个值,true或false。(每个布尔变量占用一个字节的内存。)
例子

int LEDpin = 5;       // LED与引脚5相连
int switchPin = 13;   // 开关的一个引脚连接引脚13,另一个引脚接地。
 
boolean running = false;
 
void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);      // 打开上拉电阻
}
 
void loop()
{
  if (digitalRead(switchPin) == LOW)
  {  // 按下开关 - 使引脚拉向高电势
    delay(100);                        // 通过延迟,以滤去开关抖动产生的杂波
    running = !running;                // 触发running变量
    digitalWrite(LEDpin, running)      //点亮LED
    }
  }

char类型说明

描述

一个数据类型,占用1个字节的内存存储一个字符值。字符都写在单引号,如’A’(多个字符(字符串)使用双引号,如“ABC”)。

字符以编号的形式存储。你可以在ASCII表中看到对应的编码。这意味着字符的ASCII值可以用来作数学计算。(例如’A’+ 1,因为大写A的ASCII值是65,所以结果为66)。如何将字符转换成数字参考serial.println命令。

char数据类型是有符号的类型,这意味着它的编码为-128到127。对于一个无符号一个字节(8位)的数据类型,使用byte数据类型。

例如

  char myChar = 'A';
  char myChar = 65;      // both are equivalent

unsigned char类型说明

无符号字符型

描述

一个无符号数据类型占用1个字节的内存。与byte的数据类型相同。

无符号的char数据类型能编码0到255的数字。

为了保持Arduino的编程风格的一致性,byte数据类型是首选。

例子

unsigned char myChar = 240;

byte类型说明

字节型

描述

一个字节存储8位无符号数,从0到255。
例子

byte b = B10010;  // "B" 是二进制格式(B10010等于十进制18)

int类型说明

整型

简介

整数是基本数据类型,占用2字节。整数的范围为-32,768到32,767( -2^15 ~(2^15)-1)。

整数类型使用2的补码方式存储负数。最高位通常为符号位,表示数的正负。其余位被“取反加1”(此处请参考补码相关资料,不再赘述)。

Arduino为您处理负数计算问题,所以数学计算对您是透明的(术语:实际存在,但不可操作。相当于“黑盒”)。但是,当处理右移位运算符(»)时,可能有未预期的编译过程。
示例

int ledPin = 13;

语法

int var = val;

var - 变量名
val - 赋给变量的值 

提示

当变量数值过大而超过整数类型所能表示的范围时(-32,768到32,767),变量值会“回滚”(详情见示例)。

   int x
   x = -32,768;
   x = x - 1;       // x 现在是 32,767。
 
   x = 32,767;
   x = x + 1;       // x 现在是 -32,768。

unsigned int类型说明

无符号整型

描述

unsigned int(无符号整型)与整型数据同样大小,占据2字节。它只能用于存储正数而不能存储负数,范围0~65,535 (2^16) – 1)。

无符号整型和整型最重要的区别是它们的最高位不同,既符号位。在Arduino整型类型中,如果最高位是1,则此数被认为是负数,剩下的15位为按2的补码计算所得值。

例子

unsigned int ledPin = 13;

语法

unsigned int var = val;

var - 无符号变量名称
val - 给变量所赋予的值 

编程提示

当变量的值超过它能表示的最大值时它会“滚回”最小值,反向也会出现这种现象。

   unsigned int x
       x = 0;
   x = x - 1;       //x现在等于65535--向负数方向滚回
   x = x + 1;       //x现在等于0--滚回

word类型说明

描述

一个存储一个16位无符号数的字符,取值范围从0到65535,与unsigned int相同。

例子

word w = 10000; 

long类型说明

长整型

描述

长整数型变量是扩展的数字存储变量,它可以存储32位(4字节)大小的变量,从-2,147,483,648到2,147,483,647。

例子

long speedOfLight = 186000L; //参见整数常量‘L’的说明

语法

long var = val;

var - 长整型变量名
var - 赋给变量的值 值范围从0到65535,与unsigned int相同。

例子

word w = 10000; 

unsigned long类型说明

无符号长整型

描述

无符号长整型变量扩充了变量容量以存储更大的数据,它能存储32位(4字节)数据。与标准长整型不同无符号长整型无法存储负数,其范围从0到4,294,967,295(2 ^ 32 – 1)。

例子

unsigned long time;
 
void setup()
{
     Serial.begin(9600);
}
 
void loop()
{
  Serial.print("Time: ");
  time = millis();
//程序开始后一直打印时间
  Serial.println(time);
//等待一秒钟,以免发送大量的数据
     delay(1000);
}

语法

unsigned long var = val;

var - 你所定义的变量名
val - 给变量所赋的值 

float类型说明

单精度浮点型

描述

float,浮点型数据,就是有一个小数点的数字。浮点数经常被用来近似的模拟连续值,因为他们比整数更大的精确度。浮点数的取值范围在3.4028235 E+38 ~ -3.4028235E +38。它被存储为32位(4字节)的信息。

float只有6-7位有效数字。这指的是总位数,而不是小数点右边的数字。与其他平台不同的是,在那里你可以使用double型得到更精确的结果(如15位),在Arduino上,double型与float型的大小相同。

浮点数字在有些情况下是不准确的,在数据大小比较时,可能会产生奇怪的结果。例如 6.0 / 3.0 可能不等于 2.0。你应该使两个数字之间的差额的绝对值小于一些小的数字,这样就可以近似的得到这两个数字相等这样的结果。

浮点运算速度远远慢于执行整​​数运算,例如,如果这个循环有一个关键的计时功能,并需要以最快的速度运行,就应该避免浮点运算。程序员经常使用较长的程式把浮点运算转换成整数运算来提高速度。

举例

float myfloat;
float sensorCalbrate = 1.117;

语法

float var = val;

var——您的float型变量名称
val——分配给该变量的值 

示例代码

int x;
int y;
float z;

x = 1;
y = x / 2; // Y为0,因为整数不能容纳分数
z = (float)x / 2.0; // Z为0.5(你必须使用2.0做除数,而不是2)


double类型说明

双清度浮点型

描述

双精度浮点数。占用4个字节。

目前的arduino上的double实现和float相同,精度并未提高。

提示

如果你从其他地方得到的代码中包含了double类变量,最好检查一遍代码以确认其中的变量的精确度能否在arduino上达到。


string类型说明

string(字符串)

描述

文本字符串可以有两种表现形式。你可以使用字符串数据类型(这是0019版本的核心部分),或者你可以做一个字符串,由char类型的数组和空终止字符(”)构成。(求助,待润色-Leo)本节描述了后一种方法。而字符串对象(String object)将让你拥有更多的功能,同时也消耗更多的内存资源。
举例

以下所有字符串都是有效的声明。

  char Str1[15];
  char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
  char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', ''};
  char Str4[ ] = "arduino";
  char Str5[8] = "arduino";
  char Str6[15] = "arduino";

声明字符串的解释

在Str1中 声明一个没有初始化的字符数组
在Str2中 声明一个字符数组(包括一个附加字符),编译器会自动添加所需的空字符
在Str3中 明确加入空字符
在Str4中 用引号分隔初始化的字符串常数,编译器将调整数组的大小,以适应字符串常量和终止空字符
在Str5中 初始化一个包括明确的尺寸和字符串常量的数组
在Str6中 初始化数组,预留额外的空间用于一个较大的字符串

空终止字符

一般来说,字符串的结尾有一个空终止字符(ASCII代码0)。以此让功能函数(例如Serial.pring())知道一个字符串的结束。否则,他们将从内存继续读取后续字节,而这些并不属于所需字符串的一部分。

这意味着,你的字符串比你想要的文字包含更多的个字符空间。这就是为什么Str2和Str5需要八个字符,即使“Arduino”只有七个字符 – 最后一个位置会自动填充空字符。str4将自动调整为八个字符,包括一个额外的空。在Str3的,我们自己已经明确地包含了空字符(写入’ 0′)。

需要注意的是,字符串可能没有一个最后的空字符(例如在Str2中您已定义字符长度为7,而不是8)。这会破坏大部分使用字符串的功能,所以不要故意而为之。如果你注意到一些奇怪的现象(在字符串中操作字符),基本就是这个原因导致的了。
单引号?还是双引号?

定义字符串时使用双引号(例如“ABC”),而定义一个单独的字符时使用单引号(例如’A’)
包装长字符串

你可以像这样打包长字符串:

char myString[] = “This is the first line” ” this is the second line” ” etcetera”;

字符串数组

当你的应用包含大量的文字,如带有液晶显示屏的一个项目,建立一个字符串数组是非常便利的。因为字符串本身就是数组,它实际上是一个两维数组的典型。

在下面的代码,”char”在字符数据类型char后跟了一个星号’‘表示这是一个“指针”数组。所有的数组名实际上是指针,所以这需要一个数组的数组。指针对于C语言初学者而言是非常深奥的部分之一,但我们没有必要了解详细指针,就可以有效地应用它。

样例

char* myStrings[]={
  "This is string 1", "This is string 2", "This is string 3",
  "This is string 4", "This is string 5","This is string 6"};
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  for (int i = 0; i < 6; i++){
    Serial.println(myStrings[i]);
    delay(500);
  }
}

String(c++)类型说明

描述

String类,是0019版的核心的一部分,允许你实现比运用字符数组更复杂的文字操作。你可以连接字符串,增加字符串,寻找和替换子字符串以及其他操作。它比使用一个简单的字符数组需要更多的内存,但它更方便。

仅供参考,字符串数组都用小写的string表示而String类的实例通常用大写的String表示。注意,在“双引号”内指定的字符常量通常被作为字符数组,并非String类实例。
函数

String
charAt()
compareTo()
concat()
endsWith()
equals()
equalsIgnoreCase()
GetBytes()
indexOf()
lastIndexOf
length
replace()
setCharAt()
startsWith()
substring()
toCharArray()
toLowerCase()
toUpperCase()
trim() 

操作符

[](元素访问)
+(串连)
==(比较) 

array类型说明

Arrays (数组)

数组是一种可访问的变量的集合。Arduino的数组是基于C语言的,因此这会变得很复杂,但使用简单的数组是比较简单的。
创建(声明)一个数组

下面的方法都可以用来创建(声明)数组。

  myInts [6];
  myPins [] = {2,4,8,3,6};
  mySensVals [6] = {2,4,-8,3,2};
  char message[6] = "hello";

你声明一个未初始化数组,例如myPins。

在myPins中,我们声明了一个没有明确大小的数组。编译器将会计算元素的大小,并创建一个适当大小的数组。

当然,你也可以初始化数组的大小,例如在mySensVals中。请注意,当声明一个char类型的数组时,你初始化的大小必须大于元素的个数,以容纳所需的空字符。
访问数组

数组是从零开始索引的,也就说,上面所提到的数组初始化,数组第一个元素是为索引0,因此:

mySensVals [0] == 2,mySensVals [1] == 4;

依此类推 。

这也意味着,在包含十个元素的数组中,索引九是最后一个元素。因此,

  int myArray[10] = {9,3,2,4,3,2,7,8,9,11};
  // myArray[9]的数值为11
  // myArray[10],该索引是无效的,它将会是任意的随机信息(内存地址)

出于这个原因,你在访问数组应该小心。若访问的数据超出数组的末尾(即索引数大于你声明的数组的大小- 1),则将从其他内存中读取数据。从这些地方读取的数据,除了产生无效的数据外,没有任何作用。向随机存储器中写入数据绝对是一个坏主意,通常会导致不愉快的结果,如导致系统崩溃或程序故障。要排查这样的错误是也是一件难事。 不同于Basic或JAVA,C语言编译器不会检查你访问的数组是否大于你声明的数组。
指定一个数组的值:

  mySensVals [0] = 10;

从数组中访问一个值:

  X = mySensVals [4];

数组和循环

数组往往在for循环中进行操作,循环计数器可用于访问每个数组元素。例如,将数组中的元素通过串口打印,你可以这样做:

  int i;
  for (i = 0; i < 5; i = i + 1) {
  Serial.println(myPins[i]);
  }

您必须 登录 才能发表评论!