使用过Python的数据类型后,会发现C/C++的数据类型比较单一。Arduino实际上是C++,除了基础数据类型,增加了String类。通过了解标准库和类的头文件,可以减少不必要的、重复的、琐碎的、易错的手工代码。除了Arduino,其他的GCC和嵌入式C语言中也可以参照执行。
IoT相关数据类型
byte, unsigned char
char
int, int and unsigned int
float
String,class of char array
struct
IoT需要解决的主要是采集、传输、判断、控制。传输通道上数据以二进制数据为主。
C语言设计中,二进制数据采用unsigned char[],使用简单。二进制处理采用struct结构体可以很好地解决固定长度的unsigned char[]。但是动态长度的传输协议的结构体往往需要包含额外的缓冲区指针。
C语言中,字符串采用char[],即字符数组来实现。但是无论是初始化、转换、处理起来,代码都很琐碎。所以ANSI标准的C语言标准库中提供了大量的面向字符以及字符串的函数。在Java/C++等OOP语言中,也都定义String类。注意,这些是类(class),而非数据类型(type)。
由于IoT引入了许多Web协议,而大多数Web协议如HTTP/FTP/Telnet都基于字符串。所以许多情况下,代码需要在这两种协议之间进行转换。所以unsigned char和char是最基础的数据类型。
unsigned char和char可以通过强制类型转换来实现。但是unsigned char[],char[],String三者之间却有着一定的差异,主要因为char[]/String定义的字符串结束符必须使用NULL,即\0来实现。在某些特殊情况下会因为两种数据类型长度不一致,或者缺乏NULL结束符导致程序跑飞。
String类
在Arduino的WString.h/WString.cpp中可以找到对应的String类定义。
inline void String::init(void) {
buffer = NULL;
capacity = 0;
len = 0;
}
WString.cpp引用了stdlib_noiso.h这个头文件,也就是底层依然调用了