ESP32 串口使用笔记

仅记录一下对ESP32函数库里

uart_enable_pattern_det_intr  和 uart_enable_pattern_det_baud_intr的理解。

因为网上很多学习资料要么过时要么互相抄不深究,导致错了也不知道而误导人。

首先,按照官方的说法 uart_enable_pattern_det_intr  已经不推荐使用了。

应该使用 uart_enable_pattern_det_baud_intr。

二者的区别是在超时设定上的时间单位不一样。

uart_enable_pattern_det_intr 的时间单位为硬件的APB时钟,ESP32是 (80Mhz)。

uart_enable_pattern_det_baud_intr的时间单位为用户配置的波特率周期。后面理解参数后会知道这样其实更好用。

esp_err_t uart_enable_pattern_det_baud_intr(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int chr_tout, int post_idle, int pre_idle)

uart_num  串口号

pattern_chr  关键字符,可以是单个字符也可以是字符串比如 “+++”,下面也以它为例

chr_num  关键字的重复次数

chr_tout 

关键字间隔时间,如果小于则不被认为是关键字。如果时间设置较大,比如大于一个字节时间则串口数据"+2+3+"也会被认为是关键字。这个时间设置成单字节周期就行,串口的话一个8位字节时间最少是8+2个周期,取10即可。有个别平台的是11个周期,停止位后多一个空闲周期。所以涉及到ESP32和单片机通讯的情况,一定要检查单片机的串口特性。

post_idle 

关键字触发后的有效时间,如果小于则不认为是最后一个关键字。如果有++++,则认为有4个+,不是关键字,如果时间设置较大,那+++后设置时间内务必不能再出现+,否则会认为是4个++++导致不触发中断,即该时间也等效于+++出现后中断触发延时的时间,因为它要等超时后才能确认关键字是否满足要求。防止乱码干扰,这个可以取稍微大一点,,n*10,n取决你打算留多少字节时间的量。

pre_idle

关键字触发前的间隔时间,如果小于则不认为是第一个关键字。这可以保证消息里如果出现了关键字符不会错误的触发中断。因为消息里的字节都是紧挨着发送的。这个时间也要设置的大一点。也是n*10个周期,n取决于 。如果是简单系统,串口数据都是一口气完整发送完的。但像ESP32或者更复杂的安卓系统,不排除串口发送被打断一下的情况。

老函数的时间参数取值范围是24位,新的是16位。

老的函数是用硬件时间计时,需要你自己计算。新的函数用串口周期计时,方便用户。从函数原型看,新函数和老的基本一样,函数内部取了波特率和周期帮你算了而已。

关键字这个功能,其实更稳妥的做法应该是用头字+尾字+转移符这样的方式。但这个功能软件实现要比单片机寄存器配置实现容易些。寄存器配置就只能是简单对比,然后在时间上想办法以实现判断和排它。

所以这里关于超时的设置逻辑都是按照如何实现同样功能的角度去思考来的。毕竟我英语太烂,看了英文的注释也不确定是不是100%理解对了。

具体理解的对不对,还需要测试过才能最终确定。不过我大概率是没这个精力去做的,先把工作上的目的达到,之后看心情了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32S2的串口收发上位机可以通过使用ESP32串口操作库来实现。首先,你需要导入`HardwareSerial`库,并创建一个`HardwareSerial`对象来代表你要使用串口。例如,你可以使用以下代码来创建一个串口对象并设置波特率: ```cpp #include <HardwareSerial.h> HardwareSerial Serial2(2); // 创建一个代表串口2的对象 void setup() { Serial.begin(115200); // 开启调试串口 Serial2.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN); // 开启ESP32S2的串口2,设置波特率和引脚 } void loop() { // 通过串口2发送数据 Serial2.println("Hello from ESP32S2!"); // 从串口2接收数据 if (Serial2.available()) { String receivedData = Serial2.readString(); Serial.println("Received data: " + receivedData); } delay(1000); } ``` 在上述代码中,我们使用`Serial2`对象来操作ESP32S2的串口2。你可以通过调用`Serial2.println()`来发送数据,通过`Serial2.available()`和`Serial2.readString()`来接收数据。请注意,你需要将`RX_PIN`和`TX_PIN`替换为实际使用的引脚。 这样,你就可以在ESP32S2上使用串口与上位机进行数据的收发了。 #### 引用[.reference_title] - *1* [(ESP32学习11)串口使用(发送和接收)](https://blog.csdn.net/ailta/article/details/106562044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ESP32学习笔记](https://blog.csdn.net/u011771563/article/details/129618750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ESP32 micro-usb 多数据量并简单加密的串口通信](https://blog.csdn.net/qq_62096941/article/details/123965312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值