一、问题
ESP32串口缓存长度默认是256。假设是在loop()函数中进行读取,数据长度大于256。遇到以下两种情况。
第一种情况:如果读取Serial.read()速度够快,接收完第一次的缓存数据后,会重新执行loop()函数,再次读取,则256后面的数据会将前面的速度覆盖,无法读取完整数据;
一开始测试的时候,是直接收发的,所以他能完整读取并发送大于256长度的数据。但测试收完所有数据再发送时,便出现了数据丢失。
第二种情况:如果接收Serial.read()前有延时时间缓存(可以让ESP32一次性接收完所有数据),则串口缓存溢出,256后面的数据丢失。
如上图,使用接收储存再发送代码。发送514个bytes,返回256个bytes。256后面的数据丢失。
二、解决
方法一:
#define SERIAL_RX_BUFFER_SIZE 1024 //修改串口发送缓冲区大小为2048
#define SERIAL_TX_BUFFER_SIZE 1024 //修改串口接收缓冲区大小为2048
查阅资料,有网友分享添加上述指令。(经过实验,无效)。
或在hardwareSerial.h或HardwareSerial.cpp中修改(或许对某些人有用)
我在我的头文件中找不到相关的语句。
方法二:
另外一位网友的解决办法。打开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
修改下面参数:
#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
*但我的soc目录下没有soc——caps.h文件,查阅了近似的文件也没有类似的内容。
方法三:
受前面的启发。
找到HardwareSerial.cpp文件
C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32
(AppDate可能是隐藏文件夹,显示隐藏详细百度)
将256修改成512或其他自己想要的数据长度。保存即可。
另外还需要注意的是,缓存长期不是任意的,不要超过1024。缓冲区实际上就是在的RAM上开辟临时存储空间,因此缓冲区的设定大小不能超过本身的RAM大小;又因为我们还要在RAM上,进行其他数据的存储,所以并不能将所有RAM空间都分配作串口缓冲区。如果项目开发中,有增加串口缓冲区大小的必要,需根据项目情况酌情修改缓冲区大小。