一、问题

        ESP32串口缓存长度默认是256。假设是在loop()函数中进行读取,数据长度大于256。遇到以下两种情况。

        第一种情况:如果读取Serial.read()速度够快,接收完第一次的缓存数据后,会重新执行loop()函数,再次读取,则256后面的数据会将前面的速度覆盖,无法读取完整数据;

        一开始测试的时候,是直接收发的,所以他能完整读取并发送大于256长度的数据。但测试收完所有数据再发送时,便出现了数据丢失。

        第二种情况:如果接收Serial.read()前有延时时间缓存(可以让ESP32一次性接收完所有数据),则串口缓存溢出,256后面的数据丢失。

arduino esp32 设备id arduino添加esp32_学习

如上图,使用接收储存再发送代码。发送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可能是隐藏文件夹,显示隐藏详细百度)

arduino esp32 设备id arduino添加esp32_经验分享_02

将256修改成512或其他自己想要的数据长度。保存即可。

arduino esp32 设备id arduino添加esp32_学习_03

        另外还需要注意的是,缓存长期不是任意的,不要超过1024。缓冲区实际上就是在的RAM上开辟临时存储空间,因此缓冲区的设定大小不能超过本身的RAM大小;又因为我们还要在RAM上,进行其他数据的存储,所以并不能将所有RAM空间都分配作串口缓冲区。如果项目开发中,有增加串口缓冲区大小的必要,需根据项目情况酌情修改缓冲区大小。