前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dji TT扩展件与TT使用USB端串口通讯.上

Dji TT扩展件与TT使用USB端串口通讯.上

作者头像
云深无际
发布2021-04-14 11:04:53
1.1K0
发布2021-04-14 11:04:53
举报
文章被收录于专栏:云深之无迹

我觉得这个+应该是=

不然这个句子我一直读不通

好,我们具体的发送方式拿到了

来搜索

发送命令的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),分别代表

代码语言:javascript
复制
Serial、Serial1、Serial2;

声明对象后就可以按一般串口的方法使用了,方法说明如下:

代码语言:javascript
复制
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:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;

代码语言:javascript
复制
void end();

失能串口,释放资源;

代码语言:javascript
复制
void updateBaudRate(unsigned long baud);

重新设置波特率;

代码语言:javascript
复制
int available(void);

返回接收缓存可读取字节数;

代码语言:javascript
复制
int availableForWrite(void);

ESP32默认有128字节的硬件TX FIFO,该方法返回TX FIFO空闲字节数;

代码语言:javascript
复制
int peek(void);

返回接收缓存中第一个字节数据,但并不从中删除它;

代码语言:javascript
复制
int read(void);

返回接收缓存中第一个字节数据,读取过的数据将从接收缓存中清除;

代码语言:javascript
复制
void flush(void);

等待串口收发完毕;

代码语言:javascript
复制
size_t write(uint8_t);

写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上;

该方法有很多重载,可以用来发送字符串、长整型、整形;

如果TX FIFO已满,则该方法将阻塞;

代码语言:javascript
复制
size_t write(const uint8_t *buffer, size_t size);

写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞;

代码语言:javascript
复制
uint32_t baudRate();

返回当前串口波特率;

代码语言:javascript
复制
size_t setRxBufferSize(size_t);

设置接收缓存大小(默认为256字节);

ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中;

代码语言:javascript
复制
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

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

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

这是函数的定义

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

如果是波特率不对

最后会输出这个语句

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档