因为没有设置硬件流控。如果需要避免丢包,请设置硬件流控。
透传功能使用的是 TCP 协议,每包数据是 1460 (取决于协议栈),只要网络良好,buffer 空间没有被消耗完,就可以不停地传输数据。对于透传,串口接收数据间隔超过约 20 ms,就会认为数据接收结束,将已经接受的数据传输到网络。如果网络不好,就可能会丢弃一些数据,因此,为避免这种情况,可以将串口设置为流控模式。
串口流控提供了由于某种原因不能进行通讯时阻塞通讯的一种机制,经常采用硬件流控和软件流控两种方式。
开发串口通讯程序的过程中需要对串行端口进行设置,包括波特率、校验方式、停止位和数据位。
2.ESP8266 有几个 UART?
ESP8266 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;
UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。
除了 XPD_DCDC,GPIO 可以配置上拉。关于 GPIO 的上电 IO 口默认状态为:除了 SDIO 6根线 +GPIO4+GPIO5+GPIO16 上电 IO 默认无上拉,其他的 GPIO 口均有上拉。由于是内部配置上拉,所以如需下拉,需外部加下拉方式或者加一个三级管的反相电路。
注意:GPIO 不能到 5V。GPIO4/5 外接 1M 电阻不能上拉到高电平;需 100K 电阻。
U0TXD 默认上电有系列打印,对此敏感应用可通过 UART 的内部引脚交换功能,在初始化的时候,调用 system_uart_swap 函数,将 U0TXD、U0RXD 分别与 U0RTS (MTDO/GPIO15),U0CTS (MTCK/GPIO13) 交换来屏蔽该上电的系统打印。交换后,硬件上的下载管脚还是使用 U0TXD+U0RXD,通信时需要将 MTDO 对应接到 MCU 的 RXD,MTCK 对应接到 MCU 的 TXD。
如果使用的是 26 MHz 晶振,ESP8266 UARTO 上电后的波特率是 74880,所以上电时会有乱码。
烧录时一般选115200,打印的时候可选74880。
客户可以在 user_main() 里面修改 UART 配置,比如:
void ICACHE_FLASH_ATTR
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
{
// rom use 74880 baut_rate, here reinitialize
UartDev.baut_rate = uart0_br;
uart_config(UART0);
UartDev.baut_rate = uart1_br;
uart_config(UART1);
}
单包数据,TCP 单包 1460 字节,UDP 单包 1472 字节。
为了提供系统稳定性,以应对多冲突的操作环境,ESP8266 集成了 2 级看门狗机制,包括软件看门狗和硬件看门狗。默认 2 个看门狗都是打开的。
经常遇到复位的原因:
硬件看门狗中断时间为 0.8*2048 ms ,即 1638.4 ms ,中断后处理时间为 0.8*8192 ms,即 6553.6 ms 。其中中断处理后时间为硬件看门狗中断发生后,需要进行喂狗操作的时间,如果超过该时间,即会触发硬件看门狗复位。因此,在仅有硬件看门狗的情况下,一个程序段如果运行时间超过 6553.6 ms ,即有可能触发硬件看门狗复位,若超过 8192 ms 则一定会触发复位。软件看门狗建立在 MAC timer 以及系统调度之上,中断时间为 1600 ms,中断后处理时间为 1600 ms。因此,在有软件+硬件看门狗的情况下,一个程序段如果运行时间超过 1600 ms,即有可能会触发软件看门狗复位,若超过 3200 ms 则一定会触发复位。
使用过程中,资源要及时释放!!!char char* char[] 等使用,非常容易造成重启,编译时没问题,运行中就会出现溢出,复位等问题。
当时 SDK 仅支持关闭软件看门狗,支持同时喂软硬件看门狗。可以通过如下方式防止执行时间过长的用户程序导致看门狗复位:
10.我要在程序里面引入 10 秒的延迟,怎么做最好?
看门狗不支持无限循环。如果客户使用循环做延迟或者进入一个事件太长时间,就会触发硬件看门狗重启。推荐使用 callback 和 timer 的 API 做延迟。
如果要轮询事件,推荐使用中断和 timer 的 API 来做。大多数事件都是关联到 callback 上的,所以大多数情况下,轮询都是可以避免的。
可通过定于 MEMLEAK_DEBUG 宏启用 memory leak debug 功能,代码中调用 os_malloc, os_zalloc, os_calloc, os_realloc,os_free 可将调用的文件以及调用的对应行数记录在内存管理链表中,在有需要的地方通过调用 system_print_meminfo() 可打印出 heap 区内存分配情况。
步骤:
1. 修改用户工程目录的 MakeFile,在 CONFIGURATION_DEFINES 后加宏定义:-DMEMLEAK_DEBUG
如:CONFIGURATION_DEFINES = -DMEMLEAK_DEBUG2. 在用户代码,如 user_main.c 中,增加如下代码:(不要直接复制,可以复制后重新修改)
#include "mem.h"
BOOL ICACHE_FLASH_ATTR check_memleak_debug_enable (void)
{
return MEMLEAK_DEBUG_ENABLE;
}
3. 在有可能内存泄露的地方调用 system_print_meminfo() ,建议仅在关键代码位置加入此函数进行 debug。
可以在 (*.S) 文件中找出对应的地址,添加打印以便定位问题。
Fatal exception (28):
epc1=0x4025bfa6, epc2=0x00000000, epc3=0x00000000,
excvaddr=0x0000000f, depc=0x00000000
有时候epc1的值在文件中是找不到的,那就过程中异常了。可以搜索 0x后面的地址。或许有发现。但需要分析!!!
比如使用的是 user1.bin,那么就在 user1.S 中找到 0x4025bfa6 地址,并查明对应的函数。(这个比较困难,很多时候,仅仅根据这个及时找到了函数也很难知道具体什么原因导致的,只能做到大概定位)如果使用的是 flash.bin 和 irom0text.bin,可以在 eagle.S 中查找出错的地址。
有时候会发现大概的位置出错,有您的代码或说明。或许有所发现问题所在。编译成功不代表运行过程没问题!!!曾经遇到过多次,编译没问题运行过程,频繁复位或重启!要么传值,赋值,定义,没释放等问题引起!
ESP8266 有 2 个 timer。一个硬件的 timer,一个软件的 timer。API os_timer 是 DSR 处理,不能产生中断,但是可以产生任务。任务会按照普通等级排队。硬件 timer 能产生中断和任务,中断能触发任务,任务按照普通等级排队。
请参考 SDK 的 API 参考:《ESP8266 Non-OS SDK API 参考》和《ESP8266 RTOS SDK API 参考》(链接为:espressif.com/zh-hans/support/download/documents)。
一般情况,使用 Non-OS SDK 时,硬件中断回调里面不要有声明为ICACHE_FLASH_ATTR 的功能。同时中断回调里不要占用 CPU 太长时间。(这个需要注意,因为我们的绝大部分时候需要用到定时器中断,如果加入的打印信息过多或者注意不要加入ICACHE_FLASH_ATTR 的功能的函数,不然很可能够你吃一壶)
对于 ESP8266_Non-OS_SDK:
添加了“ICACHE_FLASH_ATTR”宏的函数,将存放在 IROM 中,CPU 仅在调用到它们的时候,将它们读到 cache 中运行;没有添加到“ICACHE_FLASH_ATTR”宏的函数,将在一开始上电运行时,就加载到 IRAM 中运行;由于空间有限,我们无法将所有代码都一次性加载到 IRAM 中运行,因此在大部分函数前添加到“ICACHE_FLASH_ATTR”宏,放在 IROM 中。
请注意,不要再中断处理函数中调用带有“ICACHE_FLASH_ATTR”宏的函数,否则可能与 Flash 读写操作冲突。
关于ICACHE_FLASH_ATTR的用法
有人翻译过的:https://www.cnblogs.com/CodeWorkerLiMing/p/11256375.html
对于 ESP8266_RTOS_SDK:
函数默认存放在 IROM 中,无须再添加“ICACHE_FLASH_ATTR”宏。中断处理函数也可以定义在 IROM 中。如果开发者需要将一些频繁调用的函数定义在 IRAM 中,在函数前添加“IRAM_ATTR”宏即可。
如果需要在 IRAM 中执行功能,就不需要加“ICACHE_FLASH_ATTR”的宏,那么该功能就是放在 IRAM 中执行。
关于IROM,IRAM区别参考:ROM、RAM、IROM、IRAM、DRAM、SRAM、Flash
https://blog.csdn.net/qq_20233867/article/details/77755551
它表示代码量太大,IROM 区域存放不下了。举例分析
我们可以在 SDK_v0.9.5 (及之后)的软件版本中,尝试如下步骤,解决这个问题:
1. 使用默认设置,编译生成 eagle.flash.bin 和 eagle.irom0text.bin。
(1) 如果 size of eagle.flash.bin + size of eagle.irom0text.bin >= 236KBytes:
很抱歉,您的代码量太大了,只能换大些的 Flash。(见上图)
(2) 如果 size of eagle.flash.bin + size of eagle.irom0text.bin < 236KBytes:
请继续步骤 2。
2. 在路径 SDK/ld 下修改文件“eagle.app.v6.new.512.app1.ld"。
irom0_0_seg: org = 0x40201010, len = 0x2B000
根据步骤 1 中编译的“eagle.irom0text.bin”大小,改写上述 len 的值。
示例:如果“eagle.irom0text.bin”大小为 179 KB,则可修改配置如下:
irom0_0_seg: org = 0x40201010, len = 0x2D000
3. 重新编译 user1.bin 选择 boot_v.1.2+。
补充说明:ICACHE_FLASH_ATTR
因为 RAM (可以理解为内存)的空间有限,因此做了这两个部分的区分:
ESP8266 没有 main,程序入口为 user_init()
内存必须 4 字节对齐读取,指针做转换时请确保为 4 字节对齐,否则转换失败,不能正常使用。例如,请勿直接指针转换 float temp = *((float*)data);而是使用 os_memcpy (memcpy) 实现。
扇区:1扇区4K,扇区首地址=扇区编号*4*1024
主要差异点如下:
(不带操作系统)Non-OS SDK
Non-OS SDK 主要使用定时器和回调函数的方式实现各个功能事件的嵌套,达到特定条件下触发特定功能函数的目的。Non-OS SDK 使用espconn 接口实现网络操作,用户需要按照 espconn 接口的使用规则进行软件开发。
(带操作系统)RTOS SDK