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/driverapp/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.运行结果:

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

  • 18
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值