【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

2023-05-16

Esp32 Arduino 串口中断函数 缓冲区修改

  • 一、前景描述
    • 1、遇到的问题
    • 2、开发环境
  • 二、解决问题
    • 1、示例代码
    • 2、代码缺陷
    • 2、解决办法
  • 三、最后的话

一、前景描述

最近需要用Esp32上传数据,有一块数据采集板,由串口通信,控制指令12+2字节(控制字+校验位),返回的数据量为,250、500、1000、2000字节

1、遇到的问题

一开始写这个功能时用的While扫描串口来实现的,发现效率太低,随后开始用中断,原来并没有用过,所以参考ESP-IDF手册,单几经尝试全部都失败了。并且原来的MQTT框架都是用Arduino开发的,所以为了更好的兼容,还是选择从Arduino中解决问题。

2、开发环境

我用的是Arduino 2.0.5新版本

二、解决问题

开始参考这篇文章 Arduino ESP32 ESP8266 Arduino编译环境串口中断回调设置
其中就介绍了SerialEvent()函数onReceive()函数
我看这篇文章评论区说找不到onReceive()函数,我同样遇到了此问题,所以我下载了最新版的Arduino,其中就可以找到此函数。

1、示例代码

大概就这些,下面就是实际解决问题了。先上代码 debug.ino.

#include "HardwareSerial.h"        //调用串口库
#define UART_FULL_THRESH_DEFAULT 2048         //修改缓冲区大小,这个是HardwareSerial.h文件中说的修改方法,我试了,并没有发挥作用
#define CJ_RxPin 26                //设置RX管脚
#define CJ_TxPin 27                //设置TX管脚
HardwareSerial Serial_CJ(1);       //定向串口1
void setup() {
	Serial.begin(115200);           //设置初始化串口0
	Serial_CJ.begin(115200,SERIAL_8N1,CJ_RxPin,CJ_TxPin);  //初始化串口1,初始化参数可以去HardwareSerial.h文件中查看
	Serial_CJ.onReceive(Callback);    //定义串口中断函数
}
void loop(){
	delay(1000);             //延时
}

void Collect_Callback(){               
  String Collect_Data = "";                     //定义一个String类型的变量
  while(Serial_CJ.available()){                 //用While判断缓冲区是否有内容
    Collect_Data += char(Serial_CJ.read());     //取出缓冲区内容
  } 
  Serial.print(Collect_Data);                     //输出取出的内容
  Collect_Data = "";                              //清空内容
 }

2、代码缺陷

上面的代码有一个问题,就是串口中断函数接收数据会分块
文档里是这么说的

// onReceive将设置一个回调函数,每当发生UART中断(UART_INTR_RXFIFO_FULL或UART_INTR_RXFIFO_TOUT)时都会调用这个函数
	// UART_INTR_RXFIFO_FULL中断在收到UART_FULL_THRESH_DEFAULT字节(IDF中默认定义为120字节)时触发
	// UART_INTR_RXFIFO_TOUT中断在没有接收到UART_TOUT_THRESH_DEFAULT符号时触发(IDF中默认定义为10个符号)
	// onlyOnTimeout参数将定义onReceive的行为方式:
	// Default: true -只有在RX超时时才会调用回调。
	//整个字节流将准备好在回调函数上立即被读取。
	//此选项可能会导致Rx溢出,具体取决于Rx缓冲区大小和流中接收的字节数
	// false -当FIFO达到120个字节并且RX超时时,将调用回调。
	//每次回调时,incommig字节流将被“分割”成120字节的块。
	//此选项避免了任何形式的Rx溢出,但将UART数据包重组工作留给了应用程序。
    void onReceive(OnReceiveCb function, bool onlyOnTimeout = false);

2、解决办法

打开Arduino的目录,找到以下文件夹,打开soc_caps.h文件

C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.7\tools\sdk\esp32\include\soc\esp32\include\soc

在此文件的266行可以修改串口的参数

/*-------------------------- UART CAPS ---------------------------------------*/
// ESP32 have 3 UART.
#define SOC_UART_NUM                (3)
#define SOC_UART_SUPPORT_REF_TICK   (1)         /*!< Support REF_TICK as the clock source */
#define SOC_UART_FIFO_LEN           (2048)       /*!< The UART hardware FIFO length     UART硬件FIFO长度*/
#define SOC_UART_BITRATE_MAX        (5000000)   /*!< Max bit rate supported by UART */

修改了以后问题可解决

三、最后的话

本人小白,就这中断弄了好久,我觉得我的问题已经解决了,所以发出来记录一下,如果有问题可以及时纠正我,感激不尽,有问题也可以评论,我看到就会并且知道就会回复。
本人工科生第一次写文章,有些语法和措辞不妥,请多担待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改 的相关文章

随机推荐

  • STM32F103C8T6串口通信

    STMF103C8T6串口通信 串口相关的固件函数 xff1a mainusart cusart h 串口作为 MCU 的重要外部接口 xff0c 同时也是软件开发重要的调试手段 xff0c 其重要性不言而喻 关于STM32F103C8T6
  • 单片机(中断系统-串口通信)

    1 RETI 中断操作指令 这条指令的功能和RET指令相似 xff0c 2条指令的不同之处是 xff1a 本指令清除了中断响应时 xff0c 被置1的MCS 51内部不可寻址的 优先级生效 触发器清零 中断程序完成后 xff0c 一定要执行
  • ESP32 for arduino 的3个hardware serial

    在arduino IDE的开发环境中 xff0c 如果使用的开发板不是arduino的开发平台 xff0c 而是ESP32模组的开发板 xff0c 那么在实际开发中由于ESP32的支持库与arduino不同 xff0c 会使得我们在使用一些
  • 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    1 首先 xff0c 我们先了解一下大疆开发板A型的资料 xff0c 官方有提供 官网 xff1a RoboMaster 机甲大师赛 芯片型号STM32F427IIH6 2 了解M3508直流无刷电机的资料 xff0c 官网有提供 3 于是
  • [note] C++ STL初步(二) 迭代器、算法和映射

    STL算法 迭代器和映射总结 迭代器 迭代器的提出 算法函数独立于数据结构无疑是一种很好的思路 xff0c 它高度体现了OOP的核心思想 但很快 xff0c 我们就会发现因各数据结构的访问形式不同 xff0c 困难显而易见 比如 xff1a
  • python 用 xlwings 处理 Excel 中的重复数据

    xlwings 简介 xlwings 是一个 Python 库 简化了 Python 和 Excel 通信 xlwings 让Excel跑得飞快 本文写作背景 amp 需求 amp 方案 因前几个月帮在医院工作的朋友现学现卖用VBA写了段程
  • STM32学习(5)外部中断实验

    STM32 的每个 IO 都可以作为外部中断的中断输入口 xff0c 这点也是 STM32 的强大之处 STM32F103 的中断控制器支持 19 个外部中断 事件请求 每个中断设有状态位 xff0c 每个中断 事件都有独立的触发和屏蔽设置
  • STM32学习(6) 定时器中断实验

    基本定时器功能简介 1 计数器16bit xff0c 只能向上计数 xff0c 只有TIM6和TIM7 2 没有外部的GPIO xff0c 是内部资源 xff0c 只能用来定时 3 时钟来自PCLK1 xff0c 为72M xff0c 可实
  • STM32学习(7)PWM 输出实验

    脉冲宽度调制 PWM xff0c 是英文 Pulse Width Modulation 的缩写 xff0c 简称脉宽调制 xff0c 是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 简单一点 xff0c 就是对脉冲宽度的
  • STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32软件复位有两种方式 xff08 1 xff09 方式一 xff1a NVIC SystemReset 函数用来复位STM32 注意1 xff1a 从SYSRESETREQ 被置为有效 xff0c 到复位发生器执行复位命令 xff0
  • 一秒钟打印一个100S内的随机数

    1 2 gt Des 一秒钟打印一个100S内的随机数 5 gt Created Time 2021年04月19日 星期一 09时35分27秒 6 7 8 include lt stdio h gt 9 include lt stdlib
  • STM32启动文件学习

    2021 08 09 STM32启动文件学习 启动文件作用 xff1a 初始化堆栈指针SP初始化PC指针初始化中断向量表配置系统时钟调用C库 main函数进入到主程序 启动文件使用的ARM汇编指令 xff1a EQU xff1a 等于 AR
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • python基础知识之开发规范(一)

    1 脚本结构 1 1 头注释 对代码没有用 xff0c 是提供给系统或者解释器使用的 usr bin env 定义 指定路径下的Python解释器 xff0c 已经很少使用 1 2 导入 导入Python的一些功能函数到脚本中 Python
  • vivo真机调试的坑 & adb无线调试

    坑1 xff1a 安装失败 解决方案 xff1a 在工程的gradle properties中加上 android injected testOnly 61 false 坑2 xff1a 总是要输入密码才能安装 解决方案 xff1a 1 开
  • JavaScript --Node,js

    引用系统模块 const http 61 require http 创建 web 服务器 const serve 61 http createServer 当客户端 发送请求的时候 server on require req res 61
  • Cmake 2 静态链接

    代码地址cmake examples 01 basic C static library at master ttroy50 cmake examples GitHub 文件路径这样 cmake文件这样 1 生成静态链接库 2 填充包括目录
  • Cmake 3 动态链接库

    代码地址 cmake examples 01 basic D shared library at master ttroy50 cmake examples GitHub 文件结构 1 添加动态链接库 和静态链接一样 这个add libra
  • PelcoD_协议指令分析

    通过协议收发控制第三方云台转动 一般的云台指令协议格式例如 xff1a span class token comment 发送带正负号的垂直角度 span span class token keyword float span vert a
  • 【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

    Esp32 Arduino 串口中断函数 缓冲区修改 一 前景描述1 遇到的问题2 开发环境 二 解决问题1 示例代码2 代码缺陷2 解决办法 三 最后的话 一 前景描述 最近需要用Esp32上传数据 xff0c 有一块数据采集板 xff0