在去年的时候,我就开过一个专栏,就是试图找出Arduino的构成,就是代码的组织,一个硬件库的打包等。可以后来平台没有给我专辑,我就没有再写了,但是最近又拾起来了,所以想开一个新的专辑。老办法,还是读TT的相关的库,除了官方的,还有第三方的。试图从源码中挖掘语言的含义。
就是这样的,Github下载下来的ESP32 Arduino内核+第三方的一些TT库
然后把官方的库放到我们的内核里面
库的内容
用VSCode打开,正在分析
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
我们今天读一个简单的TT包装程序
库之间有重合
TT库的包装头
这个有点像This指针,指向自己
using string = basic_string<char, char_traits<char>, allocator<char>>;
class WiFiUDP : public UDP
WIFIUDP继承至UDP
class UDP : public Stream
UDP继承至stream
class Stream: public Print
stream继承至print
我悟了,这就是继承吗?
故事的终点在Print
size_t Print::printNumber(unsigned long n, uint8_t base)
{
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
char *str = &buf[sizeof(buf) - 1];
*str = '\0';
// prevent crash if called with base == 1
if (base < 2)
{
base = 10;
}
do
{
unsigned long m = n;
n /= base;
char c = m - base * n;
*--str = c < 10 ? c + '0' : c + 'A' - 10;
} while (n);
return write(str);
}
这里是print的共有方法~
看这个子类的成员,IP地址
class IPAddress : public Printable
IP继承到这里
最终的终点
这是里面的变量类型的包装
看里面这个一对出现的方法,~是关闭这个方法的意思
在这里,其实我以前见过这个还挺疑惑的。。。
定义的普通的类型,先else子句里面的定义
我们这里也可以看下wifi库的继承类
网路的名字和密码
const char *ptr;
定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。
boolean connected;
布尔代数的话也有相应的类型定义
const char *udpAddress = "192.168.10.1";
const int udpPort = 8889;
IP和端口
::的作用都是为了更明确的调用自己的对象或者函数。
你看this->指向对象,指向的是下面的紫变量
当年没有C++编译器,只能通过C++转成C语言才编译。而C++中的class就被翻译C语言的struct,而struct没有成员函数,只能做全局函数。
而全局函数内无法直接调用struct类型变量内的成员,所以必须传一个struct指针,这个指针就是所谓的this指针。
那么this->加上成员名就是调用这个对象的成员了。
ip地址的配置,ip,网关,子网
看打印,调用了这个,串口
ESP32有三个串口,都是硬件的:
分别就是这样
class HardwareSerial : public Stream
// 继承关系。
串口也是这样的继承关系