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

这篇具有很好参考价值的文章主要介绍了【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前景描述

最近需要用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 */

修改了以后问题可解决

三、最后的话

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

到了这里,关于【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Arduino ESP32的串口

    在Arduino的核心中有三个串口,分别是Serial,Serial1,和Serial2. 当然ESP32也可以使用软串口。但硬件串口更稳健(我这样理解)。但Serial1这个串口不能使用,因为端口GPIO6 ~ GPIO11都用到了Flash。那如何使用你的Serial1串口哪?可以通过改变串口1的rxPin和txPin的方法,具体如下。 在

    2024年02月11日
    浏览(37)
  • 【ESP32最全学习笔记(基础篇)——5.ESP32 数字输入和数字输出(Arduino IDE)】

    关于本教程: 1.ESP32简介                                                                 2.ESP32 Arduino 集成开发环境 3.VS 代码和 PlatformIO 4.ESP32 引脚 5.ESP32 输入输出 ☑ 6.ESP32 脉宽调制 7.ESP32 模拟输入 8.ESP32 中断定时器 9 .ESP32 深度睡眠 ESP32 网络

    2024年02月01日
    浏览(98)
  • ESP32+Arduino 第二串口使用(串口通信)

    使用原因:使用GPS的时候需要ESP32从串口接收GPS模块的串口数据 第二串口位置:(标记为TX2与RX2的地方) 代码: 同理,如果想给其他模块输出数据可以用: 最后附上Arduino的在线模拟平台 https://wokwi.com/

    2024年02月13日
    浏览(39)
  • 【ESP32最全学习笔记(基础篇)——7.ESP32 ADC – 使用 Arduino IDE 读取模拟值】

    关于本教程: 1.ESP32简介                                                                 2.ESP32 Arduino 集成开发环境 3.VS 代码和 PlatformIO 4.ESP32 引脚 5.ESP32 输入输出 6.ESP32 脉宽调制 7.ESP32 模拟输入 ☑ 8.ESP32 中断定时器 9 .ESP32 深度睡眠 ESP32 网络

    2023年04月15日
    浏览(49)
  • ESP32 Arduino框架入门(二)外部中断和TouchPad(电容触摸引脚)

    接ESP32 Arduino框架入门(一)介绍和工程创建(8条消息) ESP32 Arduino框架入门(一)介绍和工程创建_长谷深风灯盏的博客-CSDN博客_arduino的esp32软件系统架构        接下来继续介绍ESP32-Wroom-32E的外部引脚、中断、定时器等部分内容         ESP32的外部引脚功能有ADC,GPIO,

    2024年02月10日
    浏览(43)
  • esp32单片机在arduino环境下,串口接收解码

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 当主控芯片发送一串数据,但此数据为一串字符串,需要将此字符串翻译成整型数组,以形成指令,控制串口屏。 例如:esp32单

    2024年02月09日
    浏览(46)
  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串的收发,然后引入中断解决收发过程中while()死等的问题。 根据昨天的字符发送函数,只需要稍作修改即可实现发送函数了,一个字符串的结尾会有一

    2024年02月03日
    浏览(79)
  • 【ESP32Arduino+MPU6050姿态解算】自制无人机学习笔记2 PLatformIO 下载即可使用

    本人之前发表过一篇关于esp32读取mpu6050数据的文章,链接:http://t.csdn.cn/AwzSZ,但其存在一些漏洞,具体表现在输出数据存在不连贯和错误,在mpu6050高速运动时存在较大误差等。仅作为参考。故在此重发作为修正。当前该篇文章中所述的模块,已经过无人机稳定性控制的测试

    2024年02月16日
    浏览(43)
  • STM32学习笔记(五)串口空闲中断+DMA实现不定长收发(stm32c8t6)

    记录一下学习过程 DMA DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个 地址空间复制到另外一个地址空间。 这一过程无需cpu的参与,从而提高cpu使用的效率 DMA相关的参数:1 数据的源地址、2 数据传输的目标地址 、3 传输宽度,4 传输多少字节,5 传

    2024年02月14日
    浏览(47)
  • 【Arduino 时间函数】ESP32怎么实现微秒级延时,适用于ESP8266等

    如果基于 Arduino 开发 ESP32 ,则延时函数可以直接使用 Arduino 提供的时间函数。 Arduino提供四种不同的时间操作函数。 delay() 函数 delayMicroseconds() 函数 一毫秒内有一千微秒,一秒内有一百万微秒。 millis() 函数 此函数用于返回Arduino板开始运行当前程序时的毫秒数。 micros() 函数

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包