如果您使用过Python数据类型,则可以看到C/C数据类型相对单一。 Arduino实际上是c,除了基础数据类型之外,还添加了String类。 通过了解标准库和类的头文件,可以减少不必要的、重复的、琐碎的和容易出错的手动代码。 也可以参照Arduino以外的GCC和嵌入式c语言执行。
IoT相关数据类型
byte,无符号char
查尔斯
int,int and unsigned int
浮动
字符串,class of char array
结构
IoT需要解决的主要是收集、传输、判断、控制。 传输线路上的数据以二进制数据为主。
在c语言设计中,二进制数据采用unsigned char[],使用方便。 二进制处理采用结构件可以很好地解决固定长度的无符号化char [ ]。 但是,动态长度传输协议的结构常常需要包含额外的缓冲指针。
在c语言中,字符串由char[]或字符数组实现。 但是,无论是初始化、变换还是处理,代码都是微不足道的。 因此,ANSI标准的c语言标准库提供了许多面向字符和字符串的函数。 OOP语言(如Java/C )也定义了String类。 请注意,它们是类(class ),不是数据类型(type )。
由于IoT引入了许多Web协议,所以大多数Web协议(如HTTP/FTP/Telnet )都是基于字符串的。 因此,代码往往需要在这两个协议之间转换。 因此,无符号char和char是最基本的数据类型。
无符号字符和字符可以通过强制类型转换来实现。 但是,unsigned char[]、char[]、String三者之间存在一定的差异,主要是因为char[]/String定义的字符串终结符必须用NULL,即0来实现。 在某些情况下,两种数据类型的长度可能不匹配,或者缺少空结束符,导致程序不正确。
字符串类
相应的String类定义位于Arduino的WString.h/WString.cpp中。
inlinevoidstring:3360init{
buffer=空;
容量=0;
len=0;
}
WString.cpp引用了名为stdlib_noiso.h的头文件。 也就是说,低层仍然调用libc来实现一些功能。 构造函数可以调用在stdlib.h中定义的函数,如utoa ()、itoa ()或ltoa ()。
类型转换
虽然c语言是理工科大学的必修课,但是在MCU水平上使用c语言是在工作中。 从Keil的C51语言开始,由于资源受到限制,实际工程中很少使用标准库。 一些较小的常见函数旨在避免通过不同模块的缓冲区复用(overlap )占用RAM空间。 目前,STM32/ESP8266的RAM比以前的8051 256B多很多,使用标准库和类库实现标准化开发可以大大加快开发。
当然,您不需要记住所有库或类库,而是可以在使用中搜索操作的常规函数,然后在标准库或类库中查找对等项。
字串到char array
String to byte array
String to int
字符串到浮动
各种库
根据c编译器环境的不同,有相似的(ANSI C libc ),但有微妙不同的库(glibc )。 你需要自己搜索。
stdlib.h,libc的一部分,其中包含一些str转移到其他类型的函数定义。
ctypes.h,libc的一部分,其中包含字符char的函数定义。
string.h,libc的一部分,包含许多字符串操作的函数定义,如复制、搜索和比较。
WString.h,Arduino定制的string类依赖于stdlib.h/string.h中的函数。
Wcharater.h,Arduino中定义的判断、转换等字符类型操作。 依赖于ctype.h的转换函数。
#包含
//string to double or float
双作用自动(常数char * s );
浮动字符(常数字符* s );
//字符串至integer
int atoi (常数char * s ); //=(int ) strtol(s ) s,NULL,10 );
long atol (常数char * s ); //=strtol(s,NULL,10 );
//double or float to string
char * ecvt (双精度,int chars,int *decpt,int *sgn );
char * ecvtf (浮动,int chars,int *decpt,in
t *sgn);char *fcvt(double val, int decimals, int *decpt, int *sgn);
char *fcvtf(float val, int decimals, int *decpt, int *sgn);
// format double or float as string
char *gcvt(double val, int precision, char* buf);
char *gcvtf(float val, int precision, char* buf);
// double or float to string
char *ecvtbuf(double val, int chars, int *decpt, int *sgn, char *buf);
char *ecvtfbuf(float val, int chars, int *decpt, int *sgn, char *buf);
// integer or unsigned int to string
char *itoa(int value, char *str, int base);
char *utoa(unsigned value, char *str, int base);
// string to double or float
double strtod(const char *restrict str, char **restrict tail);
float strtof(const char *restrict str, char **restrict tail);
// string to long or unsigned long
long strtol(const char *restrict s, char **restrict ptr, int base);
unsigned long strtoul(const char *restrict s, char **restrict ptr, int base);
// binary search
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
#include
int isalnum(int c); // is alphanumberic
int isalpha(int c); // is alphabetic
int isascii(int c); // is ASCII char
int isblank(int c); //
int iscntrl(int c);
int isdigit(int c);
int islower(int c);
int isprint(int c); // is printable
int ispunct(int c); // punctuation
int isspace(int c); // is space
int isupper(int c);
int isxdigit(int c); // is hexdecimal digit
int toascii(int c); // force to ascii, by clearing MSB
int tolower(int c);
int toupper(int c);
#include
int bcmp(const void *s1, const void *s2, size_t n); // = memcmp
int bcopy(const void *in, void *out, size_t n); // = memmove
void bzero(void *b, size_t length);
char *index(const char *string, int c); // = strchr
void *memccpy(void *restrict out, const void *restrict in, int endchar, size_t n);
void *memchr(const void *src, int c, size_t length);
int memcmp(const void *s1, const void *s2, size_t n);
void *memcpy(void *restrict out, const void *restrict in, size_t n);
char *memmem(const void *s1, size_t l1, const void *s2, size_t l2);
void *memmove(void *dst, void *src, size_t length);
void *memrchr(const void *src, int c, size_t length);
void *memset(void *dst, int c, size_t length);
void *rawmemchr(const void *src, int c);
void *rindex(const char * string, int c);
char *strpcpy(char *restrict dst, const char *restrict src);
char *strncpy(char *restrict dst, const char *restrict src, size_t length);
int strcasecmp(const char *a, const char *b);
char *strcasestr(const char *s, const char *find);
char *strcat(char *restrict dst, const char *restrict src);
char *strchr(const char *string, int c);
char *strchrnul(const char *string, int c);
int strcmp(const char *a, const char *b);
char *strcpy(char *dst, char *src);
size_t strlen(const char *str);
char *strlwr(char *a);
int strncasecmp(const char *a, const char *b, size_t length);
char *strncat(char *restrict dst, const char *restrict src, size_t length);
int strncmp(const char *a, const char *b, size_t length);
char *strncpy(char *restrict dst, const char *restrict src, size_t length);
size_t strlen(const char *str, size_t length);
char *strpbrk(const char *s1, const char *s1);
char *strrchr(const char *string, int c);
char *strstr(const char *s1, const char *s2);
char *strtok(char *restrict source, const char *restrict delimiters);
仔细阅读Arduino的WString/WCharater的头文件,其底层依然是依赖于标准库libc。
其他操作
Python编写IoT应用时,有些特殊的操作,是没有C语言对应物的,都需要自己去编写。比如split()切割字符串等。
Web URLs