Dji TT扩展件与TT使用USB端串口通讯.上
我觉得这个+应该是=
不然这个句子我一直读不通
好,我们具体的发送方式拿到了
来搜索
发送命令的C++版本,这个是最重要的
串口的定义,是用了这个两个引脚来控制和接受飞机回传的信息
特别的,在一个demo里面我们也看到一些不一样的东西
比如固定的波特率,8N1和后面的引脚
值得一说的是,这个begin()的函数是ESP32特有的函数
我们接着打开大疆提供的Arduino,我们记下这个开发板子的型号
来搜索,看到是两个地方
一个是封装好的,一个是没有封装的
我们在资源管理器里面在看一下这个具体的板子 的定义在哪里
板子的配置,有一些上传的速度,CPU的频率,Flash的频率和模式等
以及要不要打印详细的log。其实这个文件有点像一个设置的文件
这里是定义了开发板的名字和上传时候要用的工具
最后两个有点有趣是硬件串口的功能,在这里被打开了
mcu的类型+core类型+pin类型+具体的名字
flash只有4MB,可能是为了成本的原因吧。其实还是有点小
我们继续看我们的串口,在这个lib的文件里面有着如下的定义
所有的头文件都哟=有这个lib文件
这个lib文件的一开始就宏定义了,内部要用的串口和I2C的接口
在这个文件里面还有两个定义,以及I2C的资源锁
分别是锁和关锁,代码是RTOS相关的
里面出现了计数信号量,总之是要使用I2C的
之后还有一个Drone的类,建立了一些对象
在Lib的CPP里面,就只有4行代码
我将另外两行复制过来,就是完整了。
此时就算把Lib看完了,最有价值的就是对串口号的宏定义
我们接搜索一下这个串口定义,发现只定义过一次
上面也说了,这个串口的函数不是普通的串口函数是esp32的
我们接下来去具体的定义位置来寻找答案
我这个位置处找到的源码
这个是我找到的函数原型。有完整的函数签名
以及可以看到,串口其实是继承自Stream
这个硬件串口给了一个int的参数
使用HardwareSerial库需要先声明一个对象。
HardwareSerial类在声明对象时接收一个输入参数(0、1、2),分别代表
Serial、Serial1、Serial2;
声明对象后就可以按一般串口的方法使用了,方法说明如下:
void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
使能串口,参数如下:
baud:串口波特率,该值写0则会进入自动侦测波特率程序;
config:串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位;
rxPin:接收管脚针脚号;
txPin:发送管脚针脚号;
invert:翻转逻辑电平,串口默认高电平为1、低电平为0;
timeout_ms:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;
void end();
失能串口,释放资源;
void updateBaudRate(unsigned long baud);
重新设置波特率;
int available(void);
返回接收缓存可读取字节数;
int availableForWrite(void);
ESP32默认有128字节的硬件TX FIFO,该方法返回TX FIFO空闲字节数;
int peek(void);
返回接收缓存中第一个字节数据,但并不从中删除它;
int read(void);
返回接收缓存中第一个字节数据,读取过的数据将从接收缓存中清除;
void flush(void);
等待串口收发完毕;
size_t write(uint8_t);
写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上;
该方法有很多重载,可以用来发送字符串、长整型、整形;
如果TX FIFO已满,则该方法将阻塞;
size_t write(const uint8_t *buffer, size_t size);
写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞;
uint32_t baudRate();
返回当前串口波特率;
size_t setRxBufferSize(size_t);
设置接收缓存大小(默认为256字节);
ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中;
void setDebugOutput(bool);
设置该串口打印Debug信息(默认为0,失能后也会置为0);这个方法是用来设置从哪个串口打印的,需要在Arduino IDE>工具中启用Debug才会真正打印信息;(这里有一点点问题,这个库里如果没有别的串口用于打印调试信息,则Serial,即uart0一定会被用于打印调试信息,并且至少会打印Error信息)
我们这里找一个demo,看这个串口程序是如何工作的
发现是对串口进行了重新的引脚映射
23为RX
18为TX
和函数原型中的顺序是对应的,证明我们的大方向没有错
接下来我们要看他的实现
他有很多的板子,我们该看那一个
还记得最一开始的boards的文件吗,我们找到这几行
DEV的所有板子都在这里了
这个地方是因为有三个dev的板子,我都将一部分截图出来观察异同
我们关注的18和23的引脚都是默认的这个功能
我们再看一个东西,就是引脚究竟是定义成看什么样子
全局:
const,只读的全局变量,其值不可修改.
static,规定此全局变量只在当前模块(文件)中可见.
static const,既是只读的,又是只在当前模块中可见的.
我们继续看,再实现内部是默认了两组串口
9,10、、、、16,17在pin的头文件内部是没有被定义的
ESP32片上功能模组所发出的信号可映射到任何 GPIO管脚,使用Arduino core for the ESP32
中自带的HardwareSerial
库就可以将串口RX映射到几乎所有IO口上,TX映射到GPIO0~31上。
在硬串口库里面会看到这三个具体的串口名字
先校验是不是0,1,2里面的三个串口
串口0
串口1
串口2
这个函数是上面情况之后都没有匹配到之后的一个默认初始化函数
我们看见陌生的函数就去搜索
这是函数的定义
实现,如果读这个就有点走远了。我们以后在去读
如果是波特率不对
最后会输出这个语句