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
#define CJ_RxPin 26
#define CJ_TxPin 27
HardwareSerial Serial_CJ(1);
void setup() {
Serial.begin(115200);
Serial_CJ.begin(115200,SERIAL_8N1,CJ_RxPin,CJ_TxPin);
Serial_CJ.onReceive(Callback);
}
void loop(){
delay(1000);
}
void Collect_Callback(){
String Collect_Data = "";
while(Serial_CJ.available()){
Collect_Data += char(Serial_CJ.read());
}
Serial.print(Collect_Data);
Collect_Data = "";
}
2、代码缺陷
上面的代码有一个问题,就是串口中断函数接收数据会分块
文档里是这么说的
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
行可以修改串口的参数
#define SOC_UART_NUM (3)
#define SOC_UART_SUPPORT_REF_TICK (1)
#define SOC_UART_FIFO_LEN (2048)
#define SOC_UART_BITRATE_MAX (5000000)
修改了以后问题可解决
三、最后的话
本人小白,就这中断弄了好久,我觉得我的问题已经解决了,所以发出来记录一下,如果有问题可以及时纠正我,感激不尽,有问题也可以评论,我看到就会并且知道就会回复。
本人工科生第一次写文章,有些语法和措辞不妥,请多担待。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)