ESP8266--学习笔记(七)UART转发

来源:互联网 发布:linux grub 引导 过程 编辑:程序博客网 时间:2024/05/06 11:21

 因为需要使用串口发送数据,而又决定自己写固件,所以就需要完成一项功能:

  • ESP接收串口传来的数据,并判断
  • 将接收的串口数据转发出去

 ESP8266给串口发送数据很容易

uart_sendString("串口发送数据");usrt0_sendStr("\r\n Hello World\r\n");os_printf("发送数据成功!!\r\n");

 这些语句都可以使用串口发送数据,但是串口接收数据就不容易了。
 有时候,需要ESP8266接收数据并作出判断。于是就搞出来这个程序了。

————————————————————

user_main.c

#include "ets_sys.h"#include "osapi.h"#include "user_interface.h"#include "driver/uart.h"#include "driver/pwm.h"void delay_ms(uint16 x){    for(;x>0;x--)    {    os_delay_us(1000);    }}void user_init(void){    uart_init(BIT_RATE_115200,BIT_RATE_115200);    uart_sendString("串口发送程序");    //接收程序在uart.c uart0_rx_intr_handler(void *para)函数里面}

uart.c

#include "ets_sys.h"#include "osapi.h"#include "driver/uart.h"#define UART0   0#define UART1   1// UartDev is defined and initialized in rom code.extern UartDevice UartDev;LOCAL void uart0_rx_intr_handler(void *para);//串口接收数据中断函数LOCAL void ICACHE_FLASH_ATTRuart_config(uint8 uart_no){    if (uart_no == UART1) {        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);    } else {        /* rcv_buff size if 0x100 */        ETS_UART_INTR_ATTACH(uart0_rx_intr_handler,  &(UartDev.rcv_buff));        PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);        PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);    }    uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));    WRITE_PERI_REG(UART_CONF0(uart_no),    UartDev.exist_parity                   | UartDev.parity                   | (UartDev.stop_bits << UART_STOP_BIT_NUM_S)                   | (UartDev.data_bits << UART_BIT_NUM_S));    //clear rx and tx fifo,not ready    SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);    CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);    //set rx fifo trigger    WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);    //clear all interrupt    WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);    //enable rx_interrupt    SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA);}/*************//*发送一个字符*//*************/LOCAL STATUS ICACHE_FLASH_ATTRuart1_tx_one_char(uint8 TxChar){    while (true)    {        uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(UART1)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);        if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {            break;        }    }    WRITE_PERI_REG(UART_FIFO(UART1) , TxChar);    return OK;}LOCAL void ICACHE_FLASH_ATTRuart1_write_char(char c){    if (c == '\n') {        uart1_tx_one_char('\r');        uart1_tx_one_char('\n');    } else if (c == '\r') {    } else {        uart1_tx_one_char(c);    }}/*************************//**串口接收数据中断处理函数**//************************/LOCAL voiduart0_rx_intr_handler(void *para){    /* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents     * uart1 and uart0 respectively     */    RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;    uint8 RcvChar;    if (UART_RXFIFO_FULL_INT_ST != (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST)) {        return;    }    WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);    while (READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {        RcvChar = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;        uart_tx_one_char(RcvChar);     //   uart0_tx_buffer(RcvChar,1);        if (pRxBuff->pWritePos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {            // overflow ...we may need more error handle here.            pRxBuff->pWritePos = pRxBuff->pRcvMsgBuff ;        }    }}void ICACHE_FLASH_ATTRuart0_tx_buffer(uint8 *buf, uint16 len){    uint16 i;    for (i = 0; i < len; i++) {        uart_tx_one_char(buf[i]);    }}/*********************************//****串口初始化函数****//*********************************/void ICACHE_FLASH_ATTRuart_init(UartBautRate uart0_br, UartBautRate uart1_br){    // rom use 74880 baut_rate, here reinitialize    UartDev.baut_rate = uart0_br;    uart_config(UART0);    UartDev.baut_rate = uart1_br;    uart_config(UART1);    ETS_UART_INTR_ENABLE();    // install uart1 putc callback    os_install_putc1((void *)uart1_write_char);}void ICACHE_FLASH_ATTRuart_sendString(uint8 *st){    uint8 x;    for(x=0;x<os_strlen(st);x++)    {        uart_tx_one_char(st[x]);    }}
1 0
原创粉丝点击