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

这个函数是上面情况之后都没有匹配到之后的一个默认初始化函数

我们看见陌生的函数就去搜索

这是函数的定义

实现,如果读这个就有点走远了。我们以后在去读

如果是波特率不对

最后会输出这个语句

(0)

相关推荐