使用串口进行ESP8266_04的通信

1.硬件电路:

1. ESP8266
其拥有两个异步传输串口
UART0


UART1
,其中
UART0 既有发送引脚(TXD)也有接收引脚(RXD)
,而
UART1 只有发送引脚(TXD)
,UART1

TXD
引脚为
GPIO2

2. 我们可以直接使用
UART0
用作我们模组程序运行状态信息 的输出,而当我们需要将 ESP8266     
与其他设备进行串口通讯的时候,由于
UART1 没有接收引脚(RXD)
,因此我们
常常将 UART1       用作状态信息的打印,而 UART0 用 作与其他设备之间的通讯

3. 最后需要我们大家注意的是,我们的
ESP8266
的串口默认配置为
1
个起始 位,8
个数据位,无校验位,
1
个停止位,
波特率 74880

UART0
默认开启,
UART1默认关闭。

2.软件设计:

1.在使用串口前,我们先需要将uart的驱动拷贝到我们的工程目录下。uart的驱动在driver_lib下,将他们分别拷贝到app/driver和app/include/driver下,然后刷新工程。

2.需要用到的函数:

1.
void uart_init(UART0 波特率, UART1 波特率)

串口初始化函数,同时设置其波特率,
波特率可设置为:9600,19200,38400,57600,74880,115200,230400,460800, 921600

例:

uart_init(115200,115200);//设置uart0、uart1的波特率为115200

2.os_printf(“ ”) :串口输出数据函数,用法与我们 C 语言里面的 printf 相同。

例:

os_printf("\r\n Hello Word! \r\n");

3.
uart0_sendStr(“”):
串口 0 发送字符串函数

例:

uart0_sendStr("\r\n Hello Word! \r\n");

4.
uart1_sendStr_no_wait(“”);
串口 1 发送字符串函数

例:

uart1_sendStr_no_wait("\r\n Hello Word! 1 \r\n");

5.
UART_SetPrintPort(uint8 uart_no): 

修改 os_printf()使用的串口函数。 uint8 uart_no:UART 号, UART0 或者 UART1

例:

UART_SetPrintPort(UART1);//os_printf使用串口1进行输出数据

6.接收数据:

在uart.c中的uart_recvTask()进行修改。

uart_recvTask(os_event_t *events)
{
	uint8_t buf[100]={0};//存放数据
	LED_GPIO_Init();   //LED初始化
    if(events->sig == 0){
    #if  UART_BUFF_EN  
        Uart_rx_buff_enq();
    #else
        uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
        uint8 d_tmp = 0;
        uint8 idx=0;
        /*
        for(idx=0;idx<fifo_len;idx++) {
            d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
            uart_tx_one_char(UART0, d_tmp);
        }
        */
        //将数据存入buf数组中
        for(idx=0;idx<fifo_len;idx++)
        {
        	buf[idx]=READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
        }
        buf[idx]='\0';
        //判断数组中的数据,实现led的控制
        if(os_strcmp("ledon",buf)==0)
          {
       	   GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
       	   os_printf("LED is OPEN!\n");
          }
          else if(os_strcmp("ledoff",buf)==0)
          {
       	   GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
       	   os_printf("LED is OFF!\n");
          }


        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
        uart_rx_intr_enable(UART0);
    #endif
    }else if(events->sig == 1){
    #if UART_BUFF_EN
	 //already move uart buffer output to uart empty interrupt
        //tx_start_uart_buffer(UART0);
    #else 
    
    #endif
    }
}

3.程序的功能和源码:

程序的功能:实现串口点灯。

程序源码:

1.user_main.c:

#include "ets_sys.h"
#include "osapi.h"
#include "c_types.h" //变量类型
#include "eagle_soc.h"//GPIO函数,宏定义
#include "user_interface.h"
#include "driver/uart.h"
/******************************************************************************
 * 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:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        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)
{
}

/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
   uart_init(9600,9600);//初始化串口0,1波特率
   os_printf("-----------------------\r\n");
   os_printf("SDK Version:%s\r\n",system_get_sdk_version());
}

2.uart.c中的修改(注意添加头文件)

//LED初始化
void LED_GPIO_Init(void)
{
	//设置GPIO4引脚的功能为GPIO
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
	//默认输出为高点平
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
}


LOCAL void ICACHE_FLASH_ATTR ///
uart_recvTask(os_event_t *events)
{
	uint8_t buf[100]={0};
	LED_GPIO_Init();
    if(events->sig == 0){
    #if  UART_BUFF_EN  
        Uart_rx_buff_enq();
    #else
        uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
        uint8 d_tmp = 0;
        uint8 idx=0;
        /*
        for(idx=0;idx<fifo_len;idx++) {
            d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
            uart_tx_one_char(UART0, d_tmp);
        }
        */
        for(idx=0;idx<fifo_len;idx++)
        {
        	buf[idx]=READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
        }
        buf[idx]='\0';
        if(os_strcmp("ledon",buf)==0)
          {
       	   GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
       	   os_printf("LED is OPEN!\n");
          }
          else if(os_strcmp("ledoff",buf)==0)
          {
       	   GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
       	   os_printf("LED is OFF!\n");
          }


        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
        uart_rx_intr_enable(UART0);
    #endif
    }else if(events->sig == 1){
    #if UART_BUFF_EN
	 //already move uart buffer output to uart empty interrupt
        //tx_start_uart_buffer(UART0);
    #else 
    
    #endif
    }
}

4.运行结果:

如需源码请在评论区留下邮箱地址!!! 

物联沃分享整理
物联沃-IOTWORD物联网 » 使用串口进行ESP8266_04的通信

发表评论