一、前景描述
最近需要用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
三、最后的话
本人小白,就这中断弄了好久,我觉得我的问题已经解决了,所以发出来记录一下,如果有问题可以及时纠正我,感激不尽,有问题也可以评论,我看到就会并且知道就会回复。
本人工科生第一次写文章,有些语法和措辞不妥,请多担待。文章来源地址https://www.toymoban.com/news/detail-598680.html
到了这里,关于【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!