0.使用软件

1.0.5版本安信可ide:AiThinkerIDE_V0.5_Setup.exe

导入一个文件:对着project explore 空白处点右键:import→c/c++→ Existing Code as Makefile Project→next→  Cygwin GCC→ browse→选择文件夹→finish

编译:save → clean project→build project

2.flash_download_tools_v3.6.3

3,安信可调试助手AiThinker Serial Tool V1.2.3.exe

4.tcp网络助手

1.对应10_DHT11

1.文件烧录

需要烧录四个文件

D:\esp8266\doc\10_DHT11\bin

bin下的文件名 解释
blank.bin 系统参数
eagle.flash.bin 系统程序
eagle.irom0text.bin 用户程序
esp_init_data_default_v08.bin 射频参数

1.ESPFlashDownloadTool_v3.6.3.exe

下载地址

4-2. Non-FOTA 的下载地址(单位:KB)

BIN

各个 Flash 容量对应的下载地址

512

1024

2048

4096

 8192

 16*1024

blank.bin

0x7B000

0xFB000

0x1FB000

0x3FB000

0x7FB000

0xFFB000

esp_init_data_default.bin

0x7C000

0xFC000

0x1FC000

0x3FC000

0x7FC000

0xFFC000

blank.bin

0x7E000

0xFE000

0x1FE000

0x3FE000

0x7FE000

0xFFE000

eagle.flash.bin

0x00000

eagle.irom0text.bin

0x10000

⼀般烧录,请使⽤⼯具 ESP Flash Download Tool,建议按照烧录地址从低到⾼按顺序排列烧录。

如需烧录 8 MB 或者 16 MB 的⼤容量 Flash,请使⽤⼯具 esptool。

 

选择spidownlaod

 

Download 适⽤于 SPI Flash 的下载。

HSPIDownload 适⽤于 HSPI Flash 的下载。

RFConfig 射频初始化设置。
MutiDownload 适⽤于多个⺟板的下载。

注意:

用户程序eagle.irom0text.bin不一定是0x10000,需要看D:\esp8266\doc\10_DHT11\ld\eagle.app.v6.ld文件的

MEMORY
{
  dport0_0_seg :                        org = 0x3FF00000, len = 0x10
  dram0_0_seg :                         org = 0x3FFE8000, len = 0x14000
  iram1_0_seg :                         org = 0x40100000, len = 0x8000
  irom0_0_seg :                         org = 0x402
10000, len = 0x5C000
}

表 6-1. SPIDownload 配置说明

配置项

配置说明

SPI FLASH CONFIG

CrystalFreq

根据实际选⽤的晶振型号选择晶振频率。

CombineBin

将勾选的 BIN ⽂件合成⼀个 target.bin,下载地址为 0x0000

Default

SPI Flash 的配置恢复到默认值。

SPI SPEED

选择 SPI Flash 的读写速度,最⼤值为 80 MHz

SPI MODE

根据实际使⽤的 Flash 选择对应的模式。如果 Flash 采⽤ Dual SPI,选择 DIO DOUT;如果 Flash 采⽤ Quad SPI,选择 QIO QOUT。 ⚠ 注意: 若⽤户使⽤ ISSI Flash,请参考“附录-配置 ISSI & MXIC Flash QIO 模式”。

FLASH SIZE

根据实际编译的配置对应选择的 Flash ⼤⼩。

说明: 16Mbit-C1 1024+1024 的情况;32Mbit-C1 1024+1024 的情况。

SpiAutoSet

不建议勾选 SpiAutoSet,推荐⽤户根据实际情况对 Flash 进⾏⼿动配置。 ⽤户如果了勾选 SpiAutoSet,下载⼯具将会按照默认的 Flash map 下载,16 Mbit 32 Mbit Flash map 会被设置为 512 Kbyte + 512 Kbyte

DoNotChgBin

⽤户可勾选 DoNotChgBinFlash 的运⾏频率,⽅式和布局会以⽤户编译时的 配置选项为准。 如果不勾选该选项,Flash 的运⾏频率,⽅式和布局会以下载⼯具最终的配置 为准。

Download Panel

START

点击 START 开始下载。当下载结束后,左边绿⾊状态显示 完成。

STOP

点击 STOP 停⽌下载。

MAC Address

下载成功后,系统会显示 ESP8266 STA ESP8266 AP MAC 地址。

COM PORT

选择 ESP8266 实际连⼊的 COM 端⼝。

BAUDRATE

BAUDRATE 选择下载的波特率,默认为 115200

 

2.对应1_UART

编译上传后,

打开AiThinker Serial Tool V1.2.3.exe,

【system_get_sdk_version】 //返回SDK版本号
【 Ivoid os_ printf(const char*s)】 //格式化输出,打印字符串工
注意:
默认从UART0打印 //一般常用的就是UART_0
·波特率默认值==74880(晶振26MHz:74880)  //ESP-12F模组的晶振==26MHz
·数据格式:数据位=8、停止位=1、无校验位、无数据流控制

选择打开串口→点esp8266的rest复位

 

可以把自定义端口设置9600,默认的74880

系统接口位于: /ESP8266_NONOS_SDK/include/user_interface. h.
os_XX系列接口位于: /ESP8266NONOS_sdk/include/osapi.h

Hello World

---------------------------------
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

3.对应4_delay

delay_ms(1000);                // 延时1秒

"D:\esp8266\doc\4_delay\app\user\user_main.c"

/*
 * ESPRESSIF MIT License
 *
 * Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
 *
 * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
 * it is free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
 * to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */

//////////////////////////////////////////////////////
//													//
// 工程:	《delay》								//
//													//
// 平台:	【技新电子】物联网开发板 ESP8266 V1.0	//
//													//
// 功能:	串口每秒发送一句"Hello"问候				//
//													//
// 版本:	V1.0									//
//													//
//////////////////////////////////////////////////////


// 头文件引用
//==============================================================================
#include "user_config.h"		// 用户配置
#include "driver/uart.h"  		// 串口

//#include "at_custom.h"
#include "c_types.h"			// 变量类型
#include "eagle_soc.h"			// GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
//#include "ets_sys.h"			// 回调函数
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系统接口、system_param_xxx接口、WIFI等
//==============================================================================

// 宏定义
//==============================================================================
#define		ProjectName		"delay"		//工程名宏定义
//==============================================================================


// 毫秒延时函数(不要延时太久)
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
	{ os_delay_us(1000);}
}
//===========================================

// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	while(1)
	{
		system_soft_wdt_feed();		// 喂狗

		os_printf("\r\nHello\r\n");	// Hello

		delay_ms(1000);				// 延时1秒
	}
}
//==============================================================================


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR user_rf_pre_init(void){}

4.对应5_GPIO_Output

"D:\esp8266\doc\5_GPIO_Output\app\user\user_main.c"

void ICACHE_FLASH_ATTR user_init(void)
{
	u8 F_LED = 0 ;		// LED状态标志位

	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	// 管脚功能选择(注意:参数1【PIN_NAME】管脚名、参数2【FUNC】管脚功能)
	//--------------------------------------------------------------------------
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	// 将相应管脚设为输出模式,并输出对应电平(参数1【gpio_no】、参数2:输出电平)
	//--------------------------------------------------------------------------
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);			// IO4 = 1(高电平)


	// 注意:【PIN_NAME】、【FUNC】、【gpio_no】不要混淆
	//…………………………………………………………………………………………………
	//·【PIN_NAME】		管脚名称		"PERIPHS_IO_MUX_" + "管脚名"

	//·【FUNC】			管脚功能		功能序号 - 1

	//·【gpio_no】			IO端口序号		GPIO_ID_PIN(IO端口序号)
	//…………………………………………………………………………………………………


	while(1)
	{
		system_soft_wdt_feed();					// 喂狗,防止复位

		F_LED = !F_LED;							// LED状态值翻转

		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);	// 设置LED(IO4)输出值

		delay_ms(500);							// 延时500Ms
	}
}

结果:板子灯隔几秒亮一次

5.对应6_GPIO_Input

"D:\esp8266\doc\6_GPIO_Input\app\user\user_main.c"

void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	// 初始化LED(注意【PIN_NAME】、【FUNC】、【gpio_no】不要混淆)
	//-------------------------------------------------------------------------
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO_4设为IO口
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// GPIO_4 = 1

	// 初始化按键(BOOT == GPIO0)
	//----------------------------------------------------------------------------------
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,	FUNC_GPIO0);	// GPIO_0设为IO口
	GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));						// GPIO_0失能输出(默认)
	PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);					// GPIO_0失能内部上拉(默认)
//	PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);					// GPIO_0使能内部上拉


	while(1)
	{
		system_soft_wdt_feed();								// 喂狗,防止复位

		if( GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 0 )			// 读取GPIO_0电平
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);				// LED亮
		else
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);				// LED灭
	}
}

结果:按boot亮,松开不亮

6.对应7_GPIO_EXTI

"D:\esp8266\doc\7_GPIO_EXTI\app\user\user_main.c"

// GPIO中断函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】
//=============================================================================
void GPIO_INTERRUPT(void)
{
	u32	S_GPIO_INT;		// 所有IO口的中断状态
	u32 F_GPIO_0_INT;	// GPIO_0的中断状态

	// 读取GPIO中断状态
	//---------------------------------------------------
	S_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);

	// 清除中断状态位(如果不清除状态位,则会持续进入中断)
	//----------------------------------------------------
	GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, S_GPIO_INT);


	F_GPIO_0_INT = S_GPIO_INT & (0x01<<0);	// 获取GPIO_0中断状态

	// 判断是否是KEY中断(未做消抖)
	//------------------------------------------------------------
	if(F_GPIO_0_INT)	// GPIO_0的下降沿中断
	{
		F_LED = !F_LED;

		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);	// LED状态翻转
	}
}
//=============================================================================


// user_init:entry of user application, init user function here
//==========================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	// 初始化LED(注意【PIN_NAME】、【FUNC】、【gpio_no】不要混淆)
	//-------------------------------------------------------------------------
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO_4设为IO口
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// GPIO_4 = 1


	// 初始化按键(BOOT == GPIO0)
	//-----------------------------------------------------------------------------
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,	FUNC_GPIO0);	// GPIO_0作为GPIO口
	GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));						// GPIO_0失能输出(默认)
//	PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);					// GPIO_0失能上拉(默认)
//	PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);					// GPIO_0使能上拉


	// GPIO_0中断设置
	//----------------------------------------------------------------------------------
	ETS_GPIO_INTR_DISABLE();										// 关闭GPIO中断功能
	ETS_GPIO_INTR_ATTACH((ets_isr_t)GPIO_INTERRUPT,NULL);			// 注册中断回调函数
	gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE);	// GPIO_0下降沿中断
	ETS_GPIO_INTR_ENABLE();											// 打开GPIO中断功能

	//…………………………………………………………
    // GPIO_PIN_INTR_DISABLE = 0,	// 不触发中断
    // GPIO_PIN_INTR_POSEDGE = 1,	// 上升沿中断
    // GPIO_PIN_INTR_NEGEDGE = 2,	// 下降沿中断
    // GPIO_PIN_INTR_ANYEDGE = 3,	// 双边沿中断
    // GPIO_PIN_INTR_LOLEVEL = 4,	// 低电平中断
    // GPIO_PIN_INTR_HILEVEL = 5	// 高电平中断
	//…………………………………………………………
}

结果:按boot亮,再按一次灭

7.对应8_OS_Timer(软件定时器)

"D:\esp8266\doc\8_OS_Timer\app\user\user_main.c"

// 注:OS_Timer_1必须定义为全局变量,因为ESP8266的内核还要使用
//--------------------------------------------------------------------
os_timer_t OS_Timer_1;	// ①:定义软件定时器(os_timer_t型结构体)

// 软件定时的回调函数
//======================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)		// ②:定义回调函数
{
	F_LED = !F_LED;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);		// LED状态翻转


	os_printf("\r\n----OS_Timer_1_cb----\r\n");	// 进入回调函数标志
}
//======================================================================


// 软件定时器初始化(ms毫秒)
//================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
	// 关闭定时器
	// 参数一:要关闭的定时器
	//--------------------------------------------------------
	os_timer_disarm(&OS_Timer_1);	// ③:关闭软件定时器


	// 设置定时器
	// 参数一:要设置的定时器;参数二:回调函数(需类型转换);参数三:回调函数的参数
	//【注:os_timer_setfn必须在软件定时器未使能的情况下调用】
	//------------------------------------------------------------------------------------------
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// ④:设置回调函数


	// 使能(启动)ms定时器
	// 参数一:要使能的定时器;参数二:定时时间(单位:ms);参数三:1=重复/0=只一次
	//------------------------------------------------------------------------------------------
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // ⑤:设置定时器参数并使能定时器
	//-------------------------------------------------------------------
	// 【如未调用system_timer_reinit,可支持范围:[5ms ~ 6,870,947ms]】
	// 【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】
	//-------------------------------------------------------------------
}
//================================================================================================

// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================

// user_init:entry of user application, init user function here
//=================================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	LED_Init_JX();					// LED初始化


	// 初始化软件定时器
	//--------------------------------------------
	OS_Timer_1_Init_JX(500,1);		// 500ms(重复)



//	while(1) system_soft_wdt_feed();	// 死循环,测试用

	os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}

打开安可信串口监视器

串口COM6
波特率115200
数据位8
校验位None
停止位none
流控None

----OS_Timer_1_cb----

----OS_Timer_1_cb----

----OS_Timer_1_cb----

----OS_Timer_1_cb----

----OS_Timer_1_cb----

----OS_Timer_1_cb----

以下软件定时器接口位于esp8266_ NONOS_SDKincludeosapi.h。请注意,以下接口使用的定时器由软件实现,定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下 os_timer系列的接口并不能保证定时器精确执行。如果需要精确的定时,例如,周期性操作某GPI,请使用硬中断定时器,具体可参考 hw_timer.c,硬件定时器的执行函数在中断里被执行。

8.对应9_HW_Timer(硬件定时器)

1.首先把hw_timer.c app\driver文件夹下

"D:\esp8266\doc\9_HW_Timer\app\driver\hw_timer.c"

2."D:\esp8266\doc\9_HW_Timer\app\user\user_main.c"


// 硬件定时器中断回调函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】
//=================================================================================================
void HW_Timer_INT(void)		// ②:硬件定时器中断回调函数
{
	F_LED = !F_LED;
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED);		// LED状态翻转

	os_printf("\r\n--- HW_Timer_INT ---\r\n");	// 进入硬件定时器中断回调函数标志
}
//=================================================================================================


// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================

// user_init:entry of user application, init user function here
//=================================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	LED_Init_JX();		// LED初始化


    // 硬件定时器初始化【FRC1_SOURCE==0、NMI_SOURCE=1】
    //--------------------------------------------------------------------------------------------
	hw_timer_init(0, 1);				// ①:初始化硬件定时器【参数1:中断源】【参数2:是否重复】
	hw_timer_set_func(HW_Timer_INT);	// ③:注册硬件定时器中断回调函数
	hw_timer_arm(500000);				// ④:设置定时器参数(单位us,参数必须<=1,677,721)
}
//=================================================================================================

串口调试助手

     Project:    HW_Timer
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

--- HW_Timer_INT ---

--- HW_Timer_INT ---

--- HW_Timer_INT ---

--- HW_Timer_INT ---

--- HW_Timer_INT ---

--- HW_Timer_INT ---

注意:

  • 如果使用NM中断源,且为自动填装的定时器,调用 hw_timer_arm时参数val必须大100
  • 如果使用NM中断源,那么该定时器将为最高优先级,可打断其他ISR
  • 如果使用FR1中断源,那么该定时器无法打断其他ISR
  • hw_timer.c的接口不能跟PWM驱动接口函数同时使用,因为二者共用了同一个硬件定时器。
  • 硬件中断定时器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR宏

9.对应10_DHT11

"D:\esp8266\doc\10_DHT11\app\user\user_main.c"

// 定时的回调函数
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	if(DHT11_Read_Data_Complete() == 0)		// 读取DHT11温湿度值
	{
		//-------------------------------------------------
		// DHT11_Data_Array[0] == 湿度_整数_部分
		// DHT11_Data_Array[1] == 湿度_小数_部分
		// DHT11_Data_Array[2] == 温度_整数_部分
		// DHT11_Data_Array[3] == 温度_小数_部分
		// DHT11_Data_Array[4] == 校验字节
		// DHT11_Data_Array[5] == 【1:温度>=0】【0:温度<0】
		//-------------------------------------------------


		// 温度超过30℃,LED亮
		//----------------------------------------------------
		if(DHT11_Data_Array[5]==1 && DHT11_Data_Array[2]>=30)
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);		// LED亮
		else
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);		// LED灭


		// 串口输出温湿度
		//---------------------------------------------------------------------------------
		if(DHT11_Data_Array[5] == 1)			// 温度 >= 0℃
		{
			os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
			os_printf("\r\n温度 == %d.%d ℃\r\n", DHT11_Data_Array[2],DHT11_Data_Array[3]);
		}
		else // if(DHT11_Data_Array[5] == 0)	// 温度 < 0℃
		{
			os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
			os_printf("\r\n温度 == -%d.%d ℃\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
		}

		// OLED显示温湿度
		//---------------------------------------------------------------------------------
		DHT11_NUM_Char();	// DHT11数据值转成字符串

		OLED_ShowString(0,2,DHT11_Data_Char[0]);	// DHT11_Data_Char[0] == 【湿度字符串】
		OLED_ShowString(0,6,DHT11_Data_Char[1]);	// DHT11_Data_Char[1] == 【温度字符串】
	}
}
//==========================================================================================

// 软件定时器初始化(ms毫秒)
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{

	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}

"D:\esp8266\doc\10_DHT11\app\driver\dht11.c"


#include "driver/dht11.h"		// DHT11头文件


// 全局变量
//==================================================================================
// DHT11_Data_Array[0] == 湿度_整数_部分
// DHT11_Data_Array[1] == 湿度_小数_部分
// DHT11_Data_Array[2] == 温度_整数_部分
// DHT11_Data_Array[3] == 温度_小数_部分
// DHT11_Data_Array[4] == 校验字节
// DHT11_Data_Array[5] == 【1:温度>=0℃】【0:温度<0℃】
//-----------------------------------------------------
u8 DHT11_Data_Array[6] = {0};	// DHT11数据数组

u8 DHT11_Data_Char[2][10]={0};	// DHT11数据字符串【行:湿/温度】【列:数据字符串】
// DHT11_Data_Char[0] == 【湿度字符串】
// DHT11_Data_Char[1] == 【温度字符串】
//==================================================================================


// 毫秒延时函数
//=================================================
void ICACHE_FLASH_ATTR Dht11_delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}
//=================================================


// GPIO_5(DHT11信号线)设为输出模式,并输出参数对应的电平
//===========================================================================
void ICACHE_FLASH_ATTR DHT11_Signal_Output(u8 Value_Vol)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,	FUNC_GPIO5);	// GPIO5设为IO口
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),Value_Vol);				// IO5设为输出=X
}
//===========================================================================


// GPIO_5(DHT11信号线)设为输入模式
//===========================================================================
void ICACHE_FLASH_ATTR DHT11_Signal_Input(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,	FUNC_GPIO5);	// GPIO5设为IO口
	GPIO_DIS_OUTPUT(GPIO_ID_PIN(5));		// GPIO5失能输出(输入)
}
//===========================================================================


// DHT11:输出起始信号->接收响应信号
//-----------------------------------------------------
// 返回值:		0		成功
//				1		失败:规定时间内未接收到响应信号
//				2		失败:响应信号的低电平时长超时
//===========================================================================
u8 ICACHE_FLASH_ATTR DHT11_Start_Signal_JX(void)
{
	u8 C_delay_time = 0;	// 延时计时

	// IO5抬高
	//--------------------------------------------------------
	DHT11_Signal_Output(1);	// DHT11信号线(IO5) == 输出高
	Dht11_delay_ms(1);

	// IO5拉低(25ms):起始信号
	//---------------------------------------------
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);	// IO5 = 0
	Dht11_delay_ms(25);

	// IO5抬高【注:起始信号结束后的约13us,DHT11开始输出信号】
	//---------------------------------------------------------
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);	// IO5 = 1
	os_delay_us(5);		// 延时5us


	// 接收响应信号
	//……………………………………………………………………………………
	// IO5设为输入:接收DHT11数据
	//-------------------------------------------------
	DHT11_Signal_Input();	// DHT11信号线(IO5) = 输入

	// 等待响应信号的低电平【最迟等50us】
	//-------------------------------------------------------------
	while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<50 )
	{
		os_delay_us(1);		// 1us计时
		C_delay_time++;
	}

	// 响应信号超时未收到
	//--------------------------------------------------
	if(C_delay_time >= 50)
		return 1;	// 失败:规定时间内未接收到响应信号


	C_delay_time = 0 ;		// 低电平计时开始

	// 响应信息的低电平时长计时【最多170us】
	//-------------------------------------------------------------
	while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<170 )
	{
		os_delay_us(1);
		C_delay_time++;	// 低电平时长
	}

	// 响应信号的低电平时长超时
	//------------------------------------------------
	if(C_delay_time >= 170)
		return 2;	// 失败:响应信号的低电平时长超时

	// 响应信号的低电平成功接收
	//--------------------------
	else
		return 0;	// 成功
}
//===========================================================================


// 读取DHT11一位数据
//--------------------------------
// 返回值:		0		数据=="0"
//				1		数据=="1"
//======================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Bit(void)
{
	u8 C_delay_time = 0;	// 延时计时

	// 等待响应信息的低电平【最迟等150us】
	//-------------------------------------------------------------
	while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<150 )
	{
		os_delay_us(1);		// 1us计时
		C_delay_time++;
	}

	C_delay_time = 0 ;		// 低电平计时开始

	// 数据位的低电平时长计时【最多200us】
	//-------------------------------------------------------------
	while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<120 )
	{
		os_delay_us(1);
		C_delay_time++;	// 低电平时长
	}

	// 数据位的低电平结束后,是数据位的高电平
	// 数据"0"的高电平时长 == [23~27us]
	// 数据"1"的高电平时长 == [68~74us]
	//------------------------------------------------
	os_delay_us(45);	// 跳过数据"0"的高电平部分

	// 延时45us后,检测信号线电平
	// 如果此时信号线电平==1 => 数据=="1"
	// 如果此时信号线电平==0 => 数据=="0"
	//-------------------------------------
	return GPIO_INPUT_GET(GPIO_ID_PIN(5));
}
//======================================================================

// 读取DHT11一个字节
//======================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Byte(void)
{
	u8 C_Bit = 0;	// 位计数

	u8 T_DHT11_Byte_Data = 0;	// DHT11字节数据

	for(; C_Bit<8; C_Bit++)		// 读取DHT11一个字节
	{
		T_DHT11_Byte_Data <<= 1;

		T_DHT11_Byte_Data |= DHT11_Read_Bit();	// 一位一位的读取
	}

	return T_DHT11_Byte_Data;	// 返回读取字节
}
//======================================================================



// 完整的读取DHT11数据
//-----------------------------------------------
// 返回值:		0		DHT11数据读取成功
//				1		结束信号的低电平时长超时
//				2		启动DHT11传输_失败
//				3		校验错误
//==============================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Data_Complete(void)
{
	u8 C_delay_time = 0;	// 延时计时

	// 启动DHT11传输_成功
	//------------------------------------------------------------------------
	if(DHT11_Start_Signal_JX() == 0)	// DHT11:输出起始信号->接收响应信号
	{
		DHT11_Data_Array[0] = DHT11_Read_Byte();	// 湿度_整数_部分
		DHT11_Data_Array[1] = DHT11_Read_Byte();	// 湿度_小数_部分
		DHT11_Data_Array[2] = DHT11_Read_Byte();	// 温度_整数_部分
		DHT11_Data_Array[3] = DHT11_Read_Byte();	// 温度_小数_部分
		DHT11_Data_Array[4] = DHT11_Read_Byte();	// 校验字节


		// 如果此时是最后一位数据的高电平,则等待它结束
		//-----------------------------------------------------------
		while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<100)
		{
			os_delay_us(1);		// 1us计时
			C_delay_time++;
		}

		C_delay_time = 0 ;		// 低电平计时开始


		// 结束信号的低电平时长计时
		//-----------------------------------------------------------
		while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<100)
		{
			os_delay_us(1);		// 1us计时
			C_delay_time++;
		}

		//-----------------------------------------------------------
		if(C_delay_time >= 100)
			return 1;		// 返回1,表示:结束信号的低电平时长超时


		// 数据校验
		//-----------------------------------------------
		if(	DHT11_Data_Array[4] ==
			DHT11_Data_Array[0] + DHT11_Data_Array[1] +
			DHT11_Data_Array[2] + DHT11_Data_Array[3] )
		{

			// 读取DHT11数据结束,ESP8266接管DHT11信号线
			//-----------------------------------------------------------
			//os_delay_us(10);
			//DHT11_Signal_Output(1);	// DHT11信号线输出高(ESP8266驱动)


			// 判断温度是否为 0℃以上
			//----------------------------------------------
			if((DHT11_Data_Array[3]&0x80) == 0)
			{
				DHT11_Data_Array[5] = 1;		// >=0℃
			}
			else
			{
				DHT11_Data_Array[5] = 0;		// <0℃

				DHT11_Data_Array[3] &= 0x7F;	// 更正温度小数部分
			}


			return 0;	// 返回0,表示:温湿度读取成功
		}

		else return 3;		// 返回3,表示:校验错误
	}

	//-----------------------------------------------------
	else return 2;		// 返回2,表示:启动DHT11传输,失败
}
//==============================================================================


// DHT11数据值转成字符串
//======================================================================
void ICACHE_FLASH_ATTR DHT11_NUM_Char(void)
{
	u8 C_char = 0;		// 字符计数

	// 湿度数据字符串
	//…………………………………………………………………………………………
	if(DHT11_Data_Array[0]/100)			// 湿度整数的百位
		DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[0]/100 + 48;

	if((DHT11_Data_Array[0]%100)/10)	// 湿度整数的十位
		DHT11_Data_Char[0][C_char++] = (DHT11_Data_Array[0]%100)/10 + 48;

	// 湿度整数的个位
	//---------------------------------------------------------
	DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[0]%10 + 48;

	DHT11_Data_Char[0][C_char++] = '.';		// 小数点

	// 湿度整数的小数
	//---------------------------------------------------------
	DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[1]%10 + 48;

	DHT11_Data_Char[0][C_char++] = ' ';		// ' '
	DHT11_Data_Char[0][C_char++] = '%';		// '%'
	DHT11_Data_Char[0][C_char++] = 'R';		// 'R'
	DHT11_Data_Char[0][C_char++] = 'H';		// 'H'
	DHT11_Data_Char[0][C_char] 	 =  0 ;		// 添0
	//…………………………………………………………………………………………

	C_char = 0;		// 重置

	// 温度数据字符串
	//…………………………………………………………………………………………
	if(DHT11_Data_Array[5]==0)			// 温度 < 0℃
		DHT11_Data_Char[1][C_char++] = '-';

	if(DHT11_Data_Array[2]/100)			// 湿度整数的百位
		DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[2]/100 + 48;

	if((DHT11_Data_Array[2]%100)/10)	// 湿度整数的十位
		DHT11_Data_Char[1][C_char++] = (DHT11_Data_Array[2]%100)/10 + 48;

	// 湿度整数的个位
	//---------------------------------------------------------
	DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[2]%10 + 48;

	DHT11_Data_Char[1][C_char++] = '.';		// 小数点

	// 湿度整数的小数
	//---------------------------------------------------------
	DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[3]%10 + 48;

	DHT11_Data_Char[1][C_char++] = ' ';		// ' '
	DHT11_Data_Char[1][C_char++] = 'C';		// 'C'
	DHT11_Data_Char[1][C_char]   =  0 ;		// 添0
	//…………………………………………………………………………………………
}
//======================================================================

串口监视器

湿度 == 63.0 %R H

温度 == 11.4 ℃

10.对应11_Task

// 任务执行函数(形参:类型必须为【os_event_t *】)		// 第③步:创建任务函数
//======================================================================================
void Func_Task_1(os_event_t * Task_message)	// Task_message = Pointer_Task_1
{
	// Task_message->sig=消息类型、Task_message->par=消息参数	// 第⑥步:编写任务函数(根据消息类型/消息参数实现相应功能)
	//--------------------------------------------------------------------------------

	os_printf("消息类型=%d,消息参数=%c\r\n",Task_message->sig, Task_message->par);

}
//======================================================================================


// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	u8 C_Task = 0 ;			// 调用任务计数
	u8 Message_Type = 1;	// 消息类型
	u8 Message_Para = 'A';	// 消息参数


	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	// 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数)	// 第②步:为任务分配内存
	//-------------------------------------------------------------------------------
	Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);

	// 创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度)	// 第④步:创建任务
	//-----------------------------------------------------------------------------------------
	system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);


	// 调用4次任务
	//--------------------------------
	for(C_Task=1; C_Task<=4; C_Task++)
	{
		system_soft_wdt_feed();	// 喂狗,防止复位

		delay_ms(1000);			// 延时1秒
		os_printf("\r\n安排任务:Task == %d\r\n",C_Task);

		// 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
		// 注意:参数3必须为无符号整数,否则需要强制类型转换
		//---------------------------------------------------------------
		system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++);	// 第⑤步:给系统安排任务
	}

	os_printf("\r\n------------------ user_init OVER ----------------\r\n\r\n");
}
//==============================================================================

串口调试

=================================================
     Project:    Task
     SDK version:    2.2.0(f28eaf2)
=================================================

安排任务:Task == 1

安排任务:Task == 2

安排任务:Task == 3

安排任务:Task == 4

------------------ user_init OVER ----------------

mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
消息类型=1,消息参数=A
消息类型=2,消息参数=B

·用户最多设置3个任务,优先级:2>1>0
·调用任务时需给出任务参数(参数1=任务等级/参数2=消息类型/参数3=消息参数)
·不论系统是否还有未完成的任务,用户都可以继续安排任务(任务可叠加),当系统空闲时会依次执行任务函数。
注:任务虽然可以叠加,但是叠加次数不能超过设定值(消息队列深度)。超过设定值(消息队列深度)的任务将被丢弃。

11.对应12_Flash

"D:\esp8266\doc\12_Flash\app\user\user_main.c"

void ICACHE_FLASH_ATTR user_init(void)
{
	u8 C_loop = 0;

	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");


	// 向【0x77 000】地址起,写入16个数据(每个数据占4字节)
	//…………………………………………………………………………………………………
	spi_flash_erase_sector(0x77);	// 擦除0x77扇区		参数==【扇区编号】

	// 向Flash写数据(参数1=【字节地址】、参数2=写入数据的指针、参数3=数据长度)
	//------------------------------------------------------------------------
	spi_flash_write(0x77*4096, (uint32 *)A_W_Data, sizeof(A_W_Data));

	os_printf("\r\n---------- Write Flash Data OVER ----------\r\n");
	//…………………………………………………………………………………………………


	// 从【0x77 000】地址起,读出16个数据(每个数据占4字节)
	//---------------------------------------------------------------------
	spi_flash_read(0x77*4096, (uint32 *)A_R_Data, sizeof(A_W_Data));


	// 串口打印读出的数据
	//-----------------------------------------------------
	for(C_loop=0; C_loop<16; C_loop++)
	{
		os_printf("Read Data = %d \r\n",A_R_Data[C_loop]);

		delay_ms(10);
	}

	os_printf("\r\n\r\n------------ user_init OVER ------------\r\n\r\n");
}

串口调试

=================================================
     Project:    Flash
     SDK version:    2.2.0(f28eaf2)
=================================================

---------- Write Flash Data OVER ----------
Read Data = 1 
Read Data = 2 
Read Data = 3 
Read Data = 4 
Read Data = 5 
Read Data = 6 
Read Data = 7 
Read Data = 8 
Read Data = 9 
Read Data = 10 
Read Data = 11 
Read Data = 12 
Read Data = 13 
Read Data = 14 
Read Data = 15 
Read Data = 16 


------------ user_init OVER ------------

mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

注意:

  • 读/写 Flash的地址,不能和系统程序区冲突。可以放在【0x70 000】地址后
  • Flash读写,必须【4字节】对齐
  • 向 Flash某扇区写数据前,须先将此扇区擦除。 Flash擦除函数的参数==【扇区编号】【字节地址】
  • 读/写 Flash数据函数的参数=【字节地址】!【扇区编号】 

12.对应13_AP_Mode

// 头文件引用
//==================================================================================
#include "user_config.h"		// 用户配置
#include "driver/uart.h"  		// 串口
#include "driver/oled.h"  		// OLED

//#include "at_custom.h"
#include "c_types.h"			// 变量类型
#include "eagle_soc.h"			// GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h"			// 回调函数
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系统接口、system_param_xxx接口、WIFI、RateContro
//==================================================================================


// 宏定义
//==================================================================================
#define		ProjectName			"AP_Mode"			// 工程名宏定义

#define		ESP8266_AP_SSID		"ESP8266_yang"		// 创建的WIFI名
#define		ESP8266_AP_PASS		"y123456789"			// 创建的WIFI密码
//==================================================================================


// 全局变量
//==================================================================================
os_timer_t OS_Timer_1;		// 软件定时器
//==================================================================================


// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}
//===========================================


// 初始化ESP8266_AP模式
//============================================================================================
void ICACHE_FLASH_ATTR ESP8266_AP_Init_JX()
{
	struct softap_config AP_Config;				// AP参数结构体

	wifi_set_opmode(0x02);						// 设置为AP模式,并保存到Flash

	// 结构体赋值(注意:【服务集标识符/密码】须设为字符串形式)
	//--------------------------------------------------------------------------------------
	os_memset(&AP_Config, 0, sizeof(struct softap_config));	// AP参数结构体 = 0
	os_strcpy(AP_Config.ssid,ESP8266_AP_SSID);		// 设置SSID(将字符串复制到ssid数组)
	os_strcpy(AP_Config.password,ESP8266_AP_PASS);	// 设置密码(将字符串复制到password数组)
	AP_Config.ssid_len=os_strlen(ESP8266_AP_SSID);	// 设置ssid长度(和SSID的长度一致)
	AP_Config.channel=1;                      		// 通道号1~13
	AP_Config.authmode=AUTH_WPA2_PSK;           	// 设置加密模式
	AP_Config.ssid_hidden=0;                  		// 不隐藏SSID
	AP_Config.max_connection=4;               		// 最大连接数
	AP_Config.beacon_interval=100;            		// 信标间隔时槽100~60000 ms

	wifi_softap_set_config(&AP_Config);				// 设置soft-AP,并保存到Flash
}
//============================================================================================


// 定时的回调函数
//=====================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;	// IP信息结构体

	u8  ESP8266_IP[4];		// 点分十进制形式保存IP


	// 查询并打印ESP8266的工作模式
	//---------------------------------------------------------------------
	switch(wifi_get_opmode())	// 输出工作模式
	{
		case 0x01:	os_printf("\nESP8266_Mode = Station\n");		break;
		case 0x02:	os_printf("\nESP8266_Mode = SoftAP\n");			break;
		case 0x03:	os_printf("\nESP8266_Mode = Station+SoftAP\n");	break;
	}


	// 获取ESP8266_AP模式下的IP地址
	//【AP模式下,如果开启DHCP(默认),并且未设置IP相关参数,ESP8266的IP地址=192.168.4.1】
	//-----------------------------------------------------------------------------------
	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 参数2:IP信息结构体指针

	// ESP8266_AP_IP.ip.addr==32位二进制IP地址,将它转换为点分十进制的形式
	//------------------------------------------------------------------------------------------
	ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;			// 点分十进制IP的第一个数 <==> addr低八位
	ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;		// 点分十进制IP的第二个数 <==> addr次低八位
	ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;		// 点分十进制IP的第三个数 <==> addr次高八位
	ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;		// 点分十进制IP的第四个数 <==> addr高八位

	// 打印ESP8266的IP地址
	//-----------------------------------------------------------------------------------------------
	os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
	OLED_ShowIP(24,2,ESP8266_IP);			// 显示ESP8266的IP地址


	// 查询并打印接入此WIFI的设备数量
	//-----------------------------------------------------------------------------------------
	os_printf("Number of devices connected to this WIFI = %d\n",wifi_softap_get_station_num());
}
//=====================================================================================================


// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{

	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}
//=====================================================================================


// user_init:entry of user application, init user function here
//==================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");
    //	ESP8266_AP_SSID
	os_printf("\t ESP8266_AP_SSID:\t%s", ESP8266_AP_SSID);
    //	ESP8266_AP_PASS
	os_printf("\t ESP8266_AP_PASS:\t%s", ESP8266_AP_PASS);

	// OLED初始化
	//---------------------
	OLED_Init();							// |
	OLED_ShowString(0,0,"ESP8266 = AP");	// |
	OLED_ShowString(0,2,"IP:");				// |
	//---------------------


	ESP8266_AP_Init_JX();			// 设置ESP8266_AP模式相关参数

    OS_Timer_1_Init_JX(1000,1);		// 1秒软件定时
  

//	while(1) system_soft_wdt_feed();	// 死循环,测试用

    os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
//==================================================================================

手机可以收到wifi连接wifi输入密码 

=================================================
     Project:    AP_Mode
     SDK version:    2.2.0(f28eaf2)     ESP8266_AP_SSID:    ESP8266_yang     ESP8266_AP_PASS:    y123456789
=================================================

-------------------- user_init OVER --------------------
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

ESP8266_Mode = SoftAP
ESP8266_IP = 192.168.4.1
Number of devices connected to this WIFI = 0

13.对应14_AP_UDP_Server

"D:\esp8266\doc\14_AP_UDP_Server\app\user\user_main.c"

// 头文件引用
//==================================================================================
#include "user_config.h"		// 用户配置
#include "driver/uart.h"  		// 串口
#include "driver/oled.h"  		// OLED

//#include "at_custom.h"
#include "c_types.h"			// 变量类型
#include "eagle_soc.h"			// GPIO函数、宏定义
#include "ip_addr.h"			// 被"espconn.h"使用。在"espconn.h"开头#include"ip_addr.h"或#include"ip_addr.h"放在"espconn.h"之前
#include "espconn.h"			// TCP/UDP接口
//#include "espnow.h"
#include "ets_sys.h"			// 回调函数
//#include "gpio.h"
#include "mem.h"				// 内存申请等函数
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系统接口、system_param_xxx接口、WIFI、RateContro
//==================================================================================

// 宏定义
//==================================================================================
#define		ProjectName			"AP_UDP_Server"		// 工程名宏定义

#define		ESP8266_AP_SSID		"ESP8266_JX"		// 创建的WIFI名
#define		ESP8266_AP_PASS		"y123456789"			// 创建的WIFI密码

#define		LED_ON				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0)		// LED亮
#define		LED_OFF				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1)		// LED灭
//==================================================================================

// 全局变量
//==================================================================================
os_timer_t OS_Timer_1;		// 软件定时器

//struct espconn ST_NetCon;	// 注:必须定义为全局变量,内核将会使用此变量(内存)
//==================================================================================


// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}
//===========================================


// 初始化ESP8266_AP模式
//============================================================================================
void ICACHE_FLASH_ATTR ESP8266_AP_Init_JX()
{
	struct softap_config AP_Config;				// AP参数结构体

	wifi_set_opmode(0x02);						// 设置为AP模式,并保存到Flash

	// 结构体赋值(注意:【服务集标识符/密码】须设为字符串形式)
	//--------------------------------------------------------------------------------------
	os_memset(&AP_Config, 0, sizeof(struct softap_config));	// AP参数结构体 = 0
	os_strcpy(AP_Config.ssid,ESP8266_AP_SSID);		// 设置SSID(将字符串复制到ssid数组)
	os_strcpy(AP_Config.password,ESP8266_AP_PASS);	// 设置密码(将字符串复制到password数组)
	AP_Config.ssid_len=os_strlen(ESP8266_AP_SSID);	// 设置ssid长度(和SSID的长度一致)
	AP_Config.channel=1;                      		// 通道号1~13
	AP_Config.authmode=AUTH_WPA2_PSK;           	// 设置加密模式
	AP_Config.ssid_hidden=0;                  		// 不隐藏SSID
	AP_Config.max_connection=4;               		// 最大连接数
	AP_Config.beacon_interval=100;            		// 信标间隔时槽100~60000 ms

	wifi_softap_set_config(&AP_Config);				// 设置soft-AP,并保存到Flash
}
//============================================================================================


// 成功发送网络数据的回调函数
//==========================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb_JX(void *arg)
{
	os_printf("\nESP8266_WIFI_Send_OK\n");
}
//==========================================================


// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
//=========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
{
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针

	remot_info * P_port_info = NULL;	// 远端连接信息结构体指针

	// 根据数据设置LED的亮/灭
	//-------------------------------------------------------------------------------
	if(pdata[0] == 'k' || pdata[0] == 'K')	LED_ON;			// 首字母为'k'/'K',灯亮
	else if(pdata[0] == 'g' || pdata[0] == 'G')	LED_OFF;	// 首字母为'g'/'G',灯灭
	os_printf("\nESP8266_Receive_Data = %s\n",pdata);		// 串口打印接收到的数据


	// 获取远端信息【UDP通信是无连接的,向远端主机回应时需获取对方的IP/端口信息】
	//------------------------------------------------------------------------------------
	if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK)	// 获取远端信息
	{
		T_arg->proto.udp->remote_port  = P_port_info->remote_port;		// 获取对方端口号
		T_arg->proto.udp->remote_ip[0] = P_port_info->remote_ip[0];		// 获取对方IP地址
		T_arg->proto.udp->remote_ip[1] = P_port_info->remote_ip[1];
		T_arg->proto.udp->remote_ip[2] = P_port_info->remote_ip[2];
		T_arg->proto.udp->remote_ip[3] = P_port_info->remote_ip[3];
		//os_memcpy(T_arg->proto.udp->remote_ip,P_port_info->remote_ip,4);	// 内存拷贝
	}

	//--------------------------------------------------------------------
	OLED_ShowIP(24,6,T_arg->proto.udp->remote_ip);	// 显示远端主机IP地址
	//--------------------------------------------------------------------

	espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK"));	// 向对方发送应答
}
//=========================================================================================================


// ①:定义espconn型结构体(网络连接结构体)
//------------------------------------------------------------------------------
struct espconn ST_NetCon;	// 注:必须定义为全局变量,内核将会使用此变量(内存)

//esp_udp ST_UDP;	// UDP通信结构体

// 初始化网络连接(UDP通信)
//=================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
	// ②:结构体赋值
	//…………………………………………………………………………………………………
	ST_NetCon.type = ESPCONN_UDP;		// 通信协议:UDP

	// ST_NetCon.proto.udp只是一个指针,不是真正的esp_udp型结构体变量
	//-------------------------------------------------------------------------
	ST_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));	// 申请内存
	//ST_NetCon.proto.udp = &ST_UDP;

	// 此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
	//--------------------------------------------------------------------------
	//ST_NetCon.proto.udp->local_port  = espconn_port();	// 获取8266可用端口
	ST_NetCon.proto.udp->local_port  = 8266 ;		// 设置本地端口
	//ST_NetCon.proto.udp->remote_port = 8888;		// 设置目标端口
	//ST_NetCon.proto.udp->remote_ip[0] = 192;		// 设置目标IP地址
	//ST_NetCon.proto.udp->remote_ip[1] = 168;
	//ST_NetCon.proto.udp->remote_ip[2] = 4;
	//ST_NetCon.proto.udp->remote_ip[3] = 2;
	//…………………………………………………………………………………………………

	// ③:注册/定义回调函数
	//-------------------------------------------------------------------------------------------
	espconn_regist_sentcb(&ST_NetCon,ESP8266_WIFI_Send_Cb_JX);	// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb(&ST_NetCon,ESP8266_WIFI_Recv_Cb_JX);	// 注册网络数据接收成功的回调函数


	// ④:调用UDP初始化API
	//----------------------------------------------
	espconn_create(&ST_NetCon);	// 初始化UDP通信
}
//=================================================================================================


// 定时的回调函数(查询ESP8266的IP地址,并初始化网络连接)
//=============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;	// IP信息结构体

	u8  ESP8266_IP[4];		// 点分十进制形式保存IP


	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 查询AP模式下ESP8266的IP地址

	if(ST_ESP8266_IP.ip.addr != 0)				// ESP8266成功获取到IP地址
	{
		ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// 点分十进制IP的第一个数 <==> addr低八位
		ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// 点分十进制IP的第二个数 <==> addr次低八位
		ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// 点分十进制IP的第三个数 <==> addr次高八位
		ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// 点分十进制IP的第四个数 <==> addr高八位

		// 打印并显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------
		os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------


		os_timer_disarm(&OS_Timer_1);	// 关闭定时器

		ESP8266_NetCon_Init_JX();		// 初始化网络连接(UDP通信)
	}
}
//=============================================================================================================


// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{

	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}
//=====================================================================================


// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================


// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	// OLED显示初始化
	//--------------------------------------------------------
	OLED_Init();							// OLED初始化
	OLED_ShowString(0,0,"ESP8266 = AP");	// ESP8266模式
	OLED_ShowString(0,2,"IP:");				// ESP8266_IP地址
	OLED_ShowString(0,4,"Remote  = STA");	// 远端主机模式
	OLED_ShowString(0,6,"IP:");				// 远端主机IP地址
	//--------------------------------------------------------

	LED_Init_JX();		// LED初始化


	ESP8266_AP_Init_JX();			// 初始化ESP8266_AP模式

	OS_Timer_1_Init_JX(1000,1);		// 1秒软件定时
}

=================================================
     Project:    AP_UDP_Server
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: a4:4b:d5:dd:95:cc join, AID = 1 

打开网tcp调试助手,新建UDP参数如下所示

发送udp后串口调试显示如下


ESP8266_Receive_Data = Test222

ESP8266_WIFI_Send_OK
 

oled模块显示ip192.168.31.4.2

发送k字符led亮

ESP8266_Receive_Data = k

ESP8266_WIFI_Send_OK

发送g字符led灭

ESP8266_Receive_Data = g

ESP8266_WIFI_Send_OK

14.对应15_AP_UDP_Client

"D:\esp8266\doc\15_AP_UDP_Client\app\user\user_main.c"

// 定义espconn型结构体
//-----------------------------------------------
//struct espconn ST_NetCon;	// 网络连接结构体

// 初始化网络连接(UDP通信)
//=============================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
	// 结构体赋值
	//--------------------------------------------------------------------------
	ST_NetCon.type = ESPCONN_UDP;				// 设置通信协议为UDP

	ST_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));	// 开辟内存


	// 此处需要设置目标IP/端口(ESP8266作为Client,需要预先知道Server的IP/端口)
	//--------------------------------------------------------------------------
	ST_NetCon.proto.udp->local_port  = 8266 ;	// 设置本地端口
	ST_NetCon.proto.udp->remote_port = 8888;	// 设置目标端口
	ST_NetCon.proto.udp->remote_ip[0] = 192;	// 设置目标IP地址
	ST_NetCon.proto.udp->remote_ip[1] = 168;
	ST_NetCon.proto.udp->remote_ip[2] = 4;
	ST_NetCon.proto.udp->remote_ip[3] = 2;
	//u8 remote_ip[4] = {192,168,4,2};		// 目标IP地址
	//os_memcpy(ST_NetCon.proto.udp->remote_ip,remote_ip,4);	// 拷贝内存


	espconn_regist_sentcb(&ST_NetCon,ESP8266_WIFI_Send_Cb_JX);	// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb(&ST_NetCon,ESP8266_WIFI_Recv_Cb_JX);	// 注册网络数据接收成功的回调函数

	espconn_create(&ST_NetCon);	// 初始化UDP通信


	espconn_send(&ST_NetCon,"Hello,I am ESP8266",os_strlen("Hello,I am ESP8266"));	// 主动向Server发起通信
}
//=============================================================================================================


// 定时的回调函数(查询ESP8266的IP地址,并初始化网络连接)
//==============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;	// IP信息结构体

	u8  ESP8266_IP[4];		// 点分十进制形式保存IP


	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 查询AP模式下ESP8266的IP地址

	if(ST_ESP8266_IP.ip.addr != 0)				// ESP8266成功获取到IP地址
	{
		ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// 点分十进制IP的第一个数 <==> addr低八位
		ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// 点分十进制IP的第二个数 <==> addr次低八位
		ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// 点分十进制IP的第三个数 <==> addr次高八位
		ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// 点分十进制IP的第四个数 <==> addr高八位

		// 显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------
		os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------


		os_timer_disarm(&OS_Timer_1);	// 关闭定时器

		ESP8266_NetCon_Init_JX();		// 初始化网络连接(UDP通信)
	}
}
//==============================================================================================================

// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{

	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}
//=====================================================================================


// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================


// user_init:entry of user application, init user function here
//=============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	// OLED显示初始化
	//--------------------------------------------------------
	OLED_Init();							// OLED初始化
	OLED_ShowString(0,0,"ESP8266 = AP");	// ESP8266模式
	OLED_ShowString(0,2,"IP:");				// ESP8266_IP地址
	OLED_ShowString(0,4,"Remote  = STA");	// 远端主机模式
	OLED_ShowString(0,6,"IP:");				// 远端主机IP地址
	//--------------------------------------------------------


	LED_Init_JX();		// LED初始化


	ESP8266_AP_Init_JX();			// 初始化ESP8266_AP模式

	OS_Timer_1_Init_JX(30000,0);	// 30秒定时(一次)
}

打开网络调试助手,新建udp ip192.168.4.2断开8888,启动

打开串口调试,连接端口

点rest串口调试显示

=================================================
     Project:    AP_UDP_Client
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1
ESP8266_IP = 192.168.4.1

等30秒,网络调试助手显示如下,会自动给网络调试发送一句话 

【2021-01-15 12:02:38:启动成功,192.168.4.2:8888】
【2021-01-15 12:05:31收到数据,192.168.4.1:8266 Len:18】:Hello,I am ESP8266

 

15.对应16_AP_TCP_Server

"D:\esp8266\doc\16_AP_TCP_Server\app\user\user_main.c"


// TCP连接断开成功的回调函数
//================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
	os_printf("\nESP8266_TCP_Disconnect_OK\n");
}
//================================================================


// TCP连接建立成功的回调函数
//====================================================================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
	espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX);			// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX);			// 注册网络数据接收成功的回调函数
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX);	// 注册成功断开TCP连接的回调函数

	os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}
//====================================================================================================================


// TCP连接异常断开时的回调函数
//====================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
	os_printf("\nESP8266_TCP_Break\n");
}
//====================================================================


// 定义espconn型结构体
//-----------------------------------------------
struct espconn ST_NetCon;	// 网络连接结构体

// 初始化网络连接(TCP通信)
//=============================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
	// 结构体赋值
	//--------------------------------------------------------------------------
	ST_NetCon.type = ESPCONN_TCP ;				// 通信协议:TCP

	ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));	// 申请内存

	// 此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
	//--------------------------------------------------------------------------
	ST_NetCon.proto.tcp->local_port = 8266 ;	// 设置本地端口
	//ST_NetCon.proto.tcp->remote_port = 8888;	// 设置目标端口
	//ST_NetCon.proto.tcp->remote_ip[0] = 192;	// 设置目标IP地址
	//ST_NetCon.proto.tcp->remote_ip[1] = 168;
	//ST_NetCon.proto.tcp->remote_ip[2] = 4;
	//ST_NetCon.proto.tcp->remote_ip[3] = 2;


	// 注册连接成功回调函数、异常断开回调函数
	//--------------------------------------------------------------------------------------------------
	espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb_JX);	// 注册TCP连接成功建立的回调函数
	espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb_JX);		// 注册TCP连接异常断开的回调函数


	// 创建TCP_server,建立侦听
	//----------------------------------------------------------
	espconn_accept(&ST_NetCon);	// 创建TCP_server,建立侦听

	// 请在 espconn_accept 之后,连接未建立之前,调用本接口
	// 如果超时时间设置为 0,ESP8266_TCP_server将始终不会断开已经不与它通信的TCP_client,不建议这样使用。
	//---------------------------------------------------------------------------------------------------
	espconn_regist_time(&ST_NetCon, 300, 0); 	//设置超时断开时间。单位=秒,最大值=7200
}
//=============================================================================================================


// 软件定时的回调函数
//=============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;	// IP信息结构体
	u8 ESP8266_IP[4];		// 点分十进制形式保存IP


	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 查询AP模式下ESP8266的IP地址

	if(ST_ESP8266_IP.ip.addr != 0 )				// ESP8266成功获取到IP地址
	{
		ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// 点分十进制IP的第一个数 <==> addr低八位
		ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// 点分十进制IP的第二个数 <==> addr次低八位
		ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// 点分十进制IP的第三个数 <==> addr次高八位
		ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// 点分十进制IP的第四个数 <==> addr高八位

		// 显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------
		os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------


		os_timer_disarm(&OS_Timer_1);	// 关闭定时器

		ESP8266_NetCon_Init_JX();		// 初始化网络连接(TCP通信)
	}
}
//=============================================================================================================

// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{

	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}
//=====================================================================================


// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
//=============================================================================

// user_init:entry of user application, init user function here
//=============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	// OLED显示初始化
	//--------------------------------------------------------
	OLED_Init();							// OLED初始化
	OLED_ShowString(0,0,"ESP8266 = AP");	// ESP8266模式
	OLED_ShowString(0,2,"IP:");				// ESP8266_IP地址
	OLED_ShowString(0,4,"Remote  = STA");	// 远端主机模式
	OLED_ShowString(0,6,"IP:");				// 远端主机IP地址
	//--------------------------------------------------------

	LED_Init_JX();		// LED初始化


	ESP8266_AP_Init_JX();			// 初始化ESP8266_AP模式

	OS_Timer_1_Init_JX(1000,1);		// 1秒定时(重复)
}
//=============================================================================

带网络调试助手

选择新建TCP client→IP:192.168.4.1→端口8266→连接

网络调试

【2021-01-15 12:56:51:已连接】
【2021-01-15 12:58:15收到数据 Len:20】:ESP8266_WIFI_Recv_OK
串口调试

=================================================
     Project:    AP_TCP_Server
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1

--------------- ESP8266_TCP_Connect_OK ---------------

ESP8266_Receive_Data = Test

ESP8266_WIFI_Send_OK

16.对应17_AP_TCP_Client

// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
//=========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
{
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针

	// 根据数据设置LED的亮/灭
	//-------------------------------------------------------------------------------
	if(pdata[0] == 'k' || pdata[0] == 'K')	LED_ON;			// 首字母为'k'/'K',灯亮
	else if(pdata[0] == 'g' || pdata[0] == 'G')	LED_OFF;	// 首字母为'g'/'G',灯灭
	os_printf("\nESP8266_Receive_Data = %s\n",pdata);		// 串口打印接收到的数据


	/*
	// 获取远端信息
	//------------------------------------------------------------------------------------
	remot_info * P_port_info = NULL;	// 定义远端连接信息指针
	if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK)	// 获取远端信息
	{
		T_arg->proto.tcp->remote_port  = P_port_info->remote_port;	// 获取对方端口号
		T_arg->proto.tcp->remote_ip[0] = P_port_info->remote_ip[0];	// 获取对方的IP地址
		T_arg->proto.tcp->remote_ip[1] = P_port_info->remote_ip[1];
		T_arg->proto.tcp->remote_ip[2] = P_port_info->remote_ip[2];
		T_arg->proto.tcp->remote_ip[3] = P_port_info->remote_ip[3];
		//os_memcpy(T_arg->proto.tcp->remote_ip,P_port_info->remote_ip,4);	// 内存拷贝
	}
	*/

	//--------------------------------------------------------------------
	OLED_ShowIP(24,6,T_arg->proto.tcp->remote_ip);	// 显示远端主机IP地址
	//--------------------------------------------------------------------

	//【TCP通信是面向连接的,向远端主机回应时可直接使用T_arg结构体指针指向的IP信息】
	//-----------------------------------------------------------------------------------------------
	espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK"));	// 向对方发送应答
}
//=========================================================================================================


// TCP连接断开成功的回调函数
//================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
	os_printf("\nESP8266_TCP_Disconnect_OK\n");
}
//================================================================


// TCP连接建立成功的回调函数
//====================================================================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
	espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX);			// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX);			// 注册网络数据接收成功的回调函数
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX);	// 注册成功断开TCP连接的回调函数

	espconn_send((struct espconn *)arg,"Hello,I am ESP8266",os_strlen("Hello,I am ESP8266"));	// 向Server发起通信

	os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}
//====================================================================================================================


// TCP连接异常断开时的回调函数
//====================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
	os_printf("\nESP8266_TCP_Break\n");

	espconn_connect(&ST_NetCon);	// 连接TCP-server
}
//====================================================================


// 定义espconn型结构体
//-----------------------------------------------
//struct espconn ST_NetCon;	// 网络连接结构体

// 初始化网络连接(TCP通信)
//========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
	// 结构体赋值
	//--------------------------------------------------------------------------
	ST_NetCon.type = ESPCONN_TCP ;				// 设置为TCP协议

	ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));	// 开辟内存


	// 此处需要设置目标IP/端口(ESP8266作为Client,需要预先知道Server的IP/端口)
	//-------------------------------------------------------------------------
	ST_NetCon.proto.tcp->local_port = 8266 ;	// 设置本地端口
	ST_NetCon.proto.tcp->remote_port = 8888;	// 设置目标端口
	ST_NetCon.proto.tcp->remote_ip[0] = 192;	// 设置目标IP地址
	ST_NetCon.proto.tcp->remote_ip[1] = 168;
	ST_NetCon.proto.tcp->remote_ip[2] = 4;
	ST_NetCon.proto.tcp->remote_ip[3] = 2;
	//u8 remote_ip[4] = {192,168,4,2};		// 目标ip地址
	//os_memcpy(ST_NetCon.proto.udp->remote_ip,remote_ip,4);	// 拷贝内存


	// 注册连接成功回调函数、异常断开回调函数
	//--------------------------------------------------------------------------------------------------
	espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb_JX);	// 注册TCP连接成功建立的回调函数
	espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb_JX);		// 注册TCP连接异常断开的回调函数


	// 连接 TCP server
	//----------------------------------------------------------
	espconn_connect(&ST_NetCon);	// 连接TCP-server
}
//========================================================================================================


// 软件定时的回调函数
//==========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	struct ip_info ST_ESP8266_IP;	// IP信息结构体
	u8 ESP8266_IP[4];		// 点分十进制形式保存IP


	wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP);	// 查询AP模式下ESP8266的IP地址

	if(ST_ESP8266_IP.ip.addr!=0 )				// ESP8266成功获取到IP地址
	{
		ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// 点分十进制IP的第一个数 <==> addr低八位
		ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// 点分十进制IP的第二个数 <==> addr次低八位
		ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// 点分十进制IP的第三个数 <==> addr次高八位
		ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// 点分十进制IP的第四个数 <==> addr高八位

		// 显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------
		os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------


		os_timer_disarm(&OS_Timer_1);	// 关闭定时器

		ESP8266_NetCon_Init_JX();		// 初始化网络连接(TCP通信)
	}
}
//==========================================================================================================

打开串口调试启动,8266rest重置

打开网络调试助手→新建   TCP server →端口8888→连接

等一会

网络调试显示

【2021-01-15 13:11:36:启动成功,端口号:8888】
【2021-01-15 13:12:08:客户端1上线,192.168.4.1:8266】
【2021-01-15 13:12:08收到数据,192.168.4.1:8266 Len:18】:Hello,I am ESP8266

串口通讯显示

Project:    AP_TCP_Client
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1

--------------- ESP8266_TCP_Connect_OK ---------------

ESP8266_WIFI_Send_OK

17.对应18_STA_Mode

// 宏定义
//==================================================================================
#define		ProjectName			"STA_Mode"				// 工程名宏定义

#define		ESP8266_STA_SSID	"yang1234"			// 接入的WIFI名
#define		ESP8266_STA_PASS	"y123456789"		// 接入的WIFI密码

#define		LED_ON				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0)		// LED亮
#define		LED_OFF				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1)		// LED灭
//==================================================================================

// 全局变量
//==================================================================================
os_timer_t OS_Timer_1;		// 软件定时器
//==================================================================================

// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}
//===========================================


// ESP8266_STA初始化
//==============================================================================
void ICACHE_FLASH_ATTR ESP8266_STA_Init_JX()
{
	struct station_config STA_Config;	// STA参数结构体

	struct ip_info ST_ESP8266_IP;		// STA信息结构体

	// 设置ESP8266的工作模式
	//------------------------------------------------------------------------
	wifi_set_opmode(0x01);				// 设置为STA模式,并保存到Flash


	// 设置STA模式下的IP地址【ESP8266默认开启DHCP Client,接入WIFI时会自动分配IP地址】
	//--------------------------------------------------------------------------------
	wifi_station_dhcpc_stop();						// 关闭 DHCP Client
	IP4_ADDR(&ST_ESP8266_IP.ip,192,168,31,145);		// 配置IP地址
	IP4_ADDR(&ST_ESP8266_IP.netmask,255,255,255,0);	// 配置子网掩码
	IP4_ADDR(&ST_ESP8266_IP.gw,192,168,31,1);		// 配置网关地址
	wifi_set_ip_info(STATION_IF,&ST_ESP8266_IP);	// 设置STA模式下的IP地址


	// 结构体赋值,配置STA模式参数
	//-------------------------------------------------------------------------------
	os_memset(&STA_Config, 0, sizeof(struct station_config));	// STA参数结构体 = 0
	os_strcpy(STA_Config.ssid,ESP8266_STA_SSID);				// 设置WIFI名
	os_strcpy(STA_Config.password,ESP8266_STA_PASS);			// 设置WIFI密码

	wifi_station_set_config(&STA_Config);	// 设置STA参数,并保存到Flash


	// 此API不能在user_init初始化中调用
	// 如果user_init中调用wifi_station_set_config(...)的话,内核会自动将ESP8266接入WIFI
	//----------------------------------------------------------------------------------
	// wifi_station_connect();		// ESP8266连接WIFI
}
//=========================================================================================


// 软件定时的回调函数
//========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	u8 C_LED_Flash = 0;				// LED闪烁计次

	u8 S_WIFI_STA_Connect;			// WIFI接入状态标志

	struct ip_info ST_ESP8266_IP;	// ESP8266的IP信息
	u8 ESP8266_IP[4];				// ESP8266的IP地址

	// 查询STA接入WIFI状态
	//-----------------------------------------------------
	S_WIFI_STA_Connect = wifi_station_get_connect_status();
	//---------------------------------------------------
	// Station连接状态表
	// 0 == STATION_IDLE -------------- STATION闲置
	// 1 == STATION_CONNECTING -------- 正在连接WIFI
	// 2 == STATION_WRONG_PASSWORD ---- WIFI密码错误
	// 3 == STATION_NO_AP_FOUND ------- 未发现指定WIFI
	// 4 == STATION_CONNECT_FAIL ------ 连接失败
	// 5 == STATION_GOT_IP ------------ 获得IP,连接成功
	//---------------------------------------------------

	switch(S_WIFI_STA_Connect)
	{
		case 0 : 	os_printf("\nSTATION_IDLE\n");				break;
		case 1 : 	os_printf("\nSTATION_CONNECTING\n");		break;
		case 2 : 	os_printf("\nSTATION_WRONG_PASSWORD\n");	break;
		case 3 : 	os_printf("\nSTATION_NO_AP_FOUND\n");		break;
		case 4 : 	os_printf("\nSTATION_CONNECT_FAIL\n");		break;
		case 5 : 	os_printf("\nSTATION_GOT_IP\n");			break;
	}

	// 成功接入WIFI【STA模式下,如果开启DHCP(默认),则ESO8266的IP地址由WIFI路由器自动分配】
	//----------------------------------------------------------------------------------------
	if( S_WIFI_STA_Connect == STATION_GOT_IP )	// 判断是否获取IP
	{
		// 获取ESP8266_Station模式下的IP地址
		// DHCP-Client默认开启,ESP8266接入WIFI后,由路由器分配IP地址,IP地址不确定
		//--------------------------------------------------------------------------
		wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP);	// 参数2:IP信息结构体指针

		// ESP8266_AP_IP.ip.addr是32位二进制代码,转换为点分十进制形式
		//----------------------------------------------------------------------------
		ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// IP地址高八位 == addr低八位
		ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// IP地址次高八位 == addr次低八位
		ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// IP地址次低八位 == addr次高八位
		ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// IP地址低八位 == addr高八位

		// 显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------
		os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------

		// 接入WIFI成功后,LED快闪3次
		//----------------------------------------------------
		for(; C_LED_Flash<=5; C_LED_Flash++)
		{
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(C_LED_Flash%2));
			delay_ms(100);
		}

		os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	}
}

 串口调试

=================================================
     Project:    STA_Mode
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0

STATION_CONNECTING

STATION_CONNECTING
scandone
state: 0 -> 2 (b0)

STATION_CONNECTING
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cnt 

connected with yang1234, channel 6
ip:192.168.31.145,mask:255.255.255.0,gw:192.168.31.1

STATION_GOT_IP
ESP8266_IP = 192.168.31.145
pm open,type:2 0
 

18.对应19_STA_UDP_Server

 D:\esp8266\doc\19_STA_UDP_Server

网络助手选新建udp

本地→ip:本机ip192.168.31.84→端口:8888

发送→ip:192.168.31.131(开发板ip)→端口8266

发送k灯亮,发送g灯灭

串口调试

=================================================
     Project:    STA_UDP_Server
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cnt 

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131
pm open,type:2 0

ESP8266_Receive_Data = Test

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = k

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = g

ESP8266_WIFI_Send_OK

网络调试

【2021-01-15 15:38:22:启动成功,192.168.31.84:8888】
【2021-01-15 15:38:31收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:38:38收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:38:42收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
 

19.对应20_STA_UDP_Client

"D:\esp8266\doc\20_STA_UDP_Client\app\user\user_main.c"

程序上传后,

1.打开网络助手,建立udp→ip(192.168.31.84)→端口号(8888)→启动

2.打开串口调式连接开发板(会自动给192.168.31.84发送一条消息)

网络调试

【2021-01-15 15:50:05:启动成功,192.168.31.84:8888】
【2021-01-15 15:50:17收到数据,192.168.31.131:8266 Len:18】:Hello,I am ESP8266
【2021-01-15 15:53:11收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:53:14收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
 

串口调试

=================================================
     Project:    STA_UDP_Client
     SDK version:    2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cnt 

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131

ESP8266_WIFI_Send_OK
pm open,type:2 0

ESP8266_Receive_Data = k

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = g

ESP8266_WIFI_Send_OK
 

20.对应21_STA_TCP_Server

"D:\esp8266\doc\21_STA_TCP_Server\app\user\user_main.c"

上传后

打开调试→连上串口→复位8266

打开网络调试→新建tcp client→ip(二四篇66IP192.168.31.131)→端口号(8266)

网络调试内容

【2021-01-15 16:04:07:已连接】
【2021-01-15 16:04:09收到数据 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:04:17收到数据 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:04:21收到数据 Len:20】:ESP8266_WIFI_Recv_OK

串口调试内容

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131

--------------- ESP8266_TCP_Connect_OK ---------------
pm open,type:2 0

ESP8266_Receive_Data = Test

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = k

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = g

ESP8266_WIFI_Send_OK

21.对应22_STA_TCP_Client

"D:\esp8266\doc\22_STA_TCP_Client\app\user\user_main.c"

修改wifi和密码和本机ip地址

上传

打开网络调试新建tcp server→ip(8888本机)

打开串口调试→连接串口→复位→自动发送Hello,I am ESP8266

客户端列表会多个开发板ip(192.168.31.131)和端口号(8266)

选择客户端列表,可以发送消息了

网络调试内容

【2021-01-15 16:19:43:客户端1上线,192.168.31.131:8266】
【2021-01-15 16:19:43收到数据,192.168.31.131:8266 Len:18】:Hello,I am ESP8266
【2021-01-15 16:19:57收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:20:02收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:20:04收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK

串口调试内容

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131

--------------- ESP8266_TCP_Connect_OK ---------------

ESP8266_WIFI_Send_OK
pm open,type:2 0

ESP8266_Receive_Data = Test

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = k

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = g

ESP8266_WIFI_Send_OK

22.对应23_DNS

获取瑞生网ip

上传后

点击串口调试,获取到ip地址

串口调试内容

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1

ESP8266_IP = 192.168.31.131

---- DomainName Analyse Succeed ----

IP_Server = 8.129.233.140

--------------- ESP8266_TCP_Connect_OK ---------------
pm open,type:2 0

ESP8266_TCP_Disconnect_OK

推荐使用域名的方式来访问互联网上的服务器工
①:服务器就是计算机,它有可能坏,有可能报废,有可能移动位置,∴地址可能会改变
②:如果服务器的地址改变了,那么,烧录到芯片中的P地址就是错的,需要重新烧录,大批量时十分麻烦
③域名是不会轻易改变的,只需要知道域名,就能获取服务器的P地址

23.对应24_HTTP

"D:\esp8266\doc\24_HTTP\app\user\user_main.c"

上传后打开串口调试

串口调试内容

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1

ESP8266_IP = 192.168.31.131

---- DomainName Analyse Succeed ----

IP_Server = 8.129.233.140

--------------- ESP8266_TCP_Connect_OK ---------------

ESP8266_WIFI_Send_OK

ESP8266_Receive_Data = HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 15 Jan 2021 08:50:27 GMT
Content-Type: text/html
Content-Length: 162
Connection: close
Location: https://www.rationmcu.com/elecjc/2397.html
Strict-Transport-Security: max-age=31536000

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

24.对应25_SNTP

"D:\esp8266\doc\25_SNTP\app\user\user_main.c"

上传后打开串口调试

调试后信息

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1

----------------------------------------------------
SNTP_TimeStamp = 1610729955

SNTP_InternetTime = Fri Jan 15 16:59:15 2021
--------------------------------------------------------

----------------------------------------------------
SNTP_TimeStamp = 1610729956

SNTP_InternetTime = Fri Jan 15 16:59:16 2021

oled模块自动获取当前网络时间,获取温湿度

25.对应27_JSON_C_FuncLib

"D:\esp8266\doc\27_JSON_C_FuncLib\app\user\user_main.c"

串口调试信息

JSON_Tree_Format:
 { 
  "Shanghai": 
  { 
  "temp": "%s", 
  "humid": "%s" 
  }, 
  "Shenzhen": 
  { 
  "temp": "%s", 
  "humid": %s 
  }, 
  "result": "%s" 
  } 
 
-------------------- 创建JSON树 -------------------
 { 
  "Shanghai": 
  { 
  "temp": "30℃", 
  "humid": "30%RH" 
  }, 
  "Shenzhen": 
  { 
  "temp": "35℃", 
  "humid": 50 
  }, 
  "result": "Shenzhen is too hot!" 
  } 
 
-------------------- 创建JSON树 -------------------

-------------------- 解析JSON树 -------------------
Shanghai:
     temp:30℃
     humid:30%RH
Shenzhen:
     temp:35℃
     humid:50
result:Shenzhen is too hot!

-------------------- 解析JSON树 -------------------
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cnt 

connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
pm open,type:2 0
 

26.对应32_IIC_OLED

"D:\esp8266\doc\32_IIC_OLED\app\user\user_main.c"

void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");



//--------------------------------
	OLED_Init();	// OLED初始化



// OLED显示字符串
//-------------------------------------------------------------------------------------------------------------------------
	OLED_ShowString(0,0,"Project=");		// 从(0,0)开始显示

	OLED_ShowString(64,0,"IIC_OLED");		// 从(64,0)开始显示		// 因为,【Project=】一共8个字符,横向上占用【64】个点
//-------------------------------------------------------------------------------------------------------------------------



// OLED显示【点分十进制_IP地址】
//-------------------------------------------------------------------------------------------------------------------------
	u8 IP_Address[4];
	   IP_Address[0] = 192;
	   IP_Address[1] = 168;
	   IP_Address[2] = 4;
	   IP_Address[3] = 1;
//	u8 IP_Address[4] = { 192,168,4,1 };		// 数组形式表示【点分十进制_IP地址】


	OLED_ShowString(0,2,"IP:");				// 从(0,2)开始显示		// 因为【Project=IIC_OLED】在纵向上占用了【2】页(2*8个点)

	OLED_ShowIP(24, 2, IP_Address);			// 从(24,2)开始显示		// 因为,【IP:】一共3个字符,横向上占用【24】个点
//-------------------------------------------------------------------------------------------------------------------------


	OLED_ShowString(0,4,"0123456789ABCDEFGHIJKLMN");	// 从(0,4)开始显示
														// 因为【Project=IIC_OLED】【IP:192.168.4.1】在纵向上占用了【4】页(4*8个点)
}

27.对应33_SmartConfig_WeChat(微信配网)

8266配网的方式有很多,【网页配网】、【APP配网】、【微信配网】
如果想使用微信配网,调用配网函数之前,必须【#include"smartconfig.h"】
实现原理:
①: Smartconfig过程中,ESP8266开 sniffer启模式,监听它可以接收到的所有的网络数据(不论数据是否打算发送给8266)
②:用户通过【手机/电脑】广播发送【加密的SSD和 Password】信息
③:EP8266抓取并解密空中【SSID和password】信息,从而连接到wiFl


reconnect

---- S_WIFI_STA_Connect=3-----------

---- ESP8266 Can't Connect to WIFI-----------
SC version: V2.5.4
scandone
scandone
scandone

------ smartconfig_done ------

SC_STATUS_FIND_CHANNEL

---- Please Use WeChat to SmartConfig ------

连接wifi后打开文件,从安信可公众号配网

28,对应34_SNTP_SmartConfig

温湿度计加智能配网

 

29.ESP8266-12F wifi总是闪蓝灯,解决办法

 

因为在arduino烧录过,在flash_download_tools_v3.6.3一直烧录失败,开始按如下配置下载限选,发现下载成功后,WIFI模块不可用,发送AT命令没有任何反馈。
 

端口在74800波段显示如下:

load 0x40100000, len 25180, room 16 
tail 12
chksum 0x90
ho 0 tail 12 room 4
load 0x3ffe8000, len 884, room 12 
tail 8
chksum 0xfb
load 0x3ffe8380, len 2388, room 0 
tail 4
chksum 0xe7
csum 0xe7
rf_cal[0] !=0x05,is 0xFF

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 25180, room 16 
tail 12
chksum 0x90
ho 0 tail 12 room 4
load 0x3ffe8000, len 884, room 12 
tail 8
chksum 0xfb
load 0x3ffe8380, len 2388, room 0 

重新下载了如下合成的固件(4M Bytes大小):

出厂默认 AT 固件

网址:https://docs.ai-thinker.com/_export/xhtml/esp8266/sdk

直接下载地址: ai-thinker_esp8266_at_firmware_dout_v1.5.4.1-a_20171130.rar

天翼云下载地址:https://cloud.189.cn/t/bq2Urq2QBZry

烧录32位的即可,

 

发现开发板可以用了,哈哈