ESP8266 SDK开发: 外设篇-串口

串口分布

  

串口切换说明

1.默认所有的数据都使用串口0输出

官方提供了函数可以选择printf利用哪一个串口输出

配置printf使用串口1打印输出,波特率115200

(注:这样配置对于调试程序很有帮助,printf当做程序运行的日志打印)

  

  

  

void
uart_init_new(void)
{
    UART_WaitTxFifoEmpty(UART0);
    UART_WaitTxFifoEmpty(UART1);

    UART_ConfigTypeDef uart_config;
    uart_config.baud_rate    = BIT_RATE_115200;//波特率
    uart_config.data_bits     = UART_WordLength_8b;//数据位数
    uart_config.parity          = USART_Parity_None;//奇偶校验
    uart_config.stop_bits     = USART_StopBits_1;//停止位
    uart_config.flow_ctrl      = USART_HardwareFlowControl_None;//硬件流控制
    uart_config.UART_RxFlowThresh = 120;
    uart_config.UART_InverseMask = UART_None_Inverse;
    UART_ParamConfig(UART0, &uart_config);

    UART_ParamConfig(UART1, &uart_config);//串口1和串口0的配置一样

    UART_IntrConfTypeDef uart_intr;
    //配置启用哪些些中断                                                    数据接收超时                                                               接收数据错误                                                  缓存满中断                                                            发送空中断
    uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA;
    uart_intr.UART_RX_FifoFullIntrThresh = 10;//接收数据个数超过10个字节进入FIFO满中断
    uart_intr.UART_RX_TimeOutIntrThresh = 2;//超过两个字节的数据的时间没有接收到数据,进入接收超时中断
    uart_intr.UART_TX_FifoEmptyIntrThresh = 20;
    UART_IntrConfig(UART0, &uart_intr);

//    UART_SetPrintPort(UART0);
    UART_SetPrintPort(UART1);//printf使用串口1输出
    UART_intr_handler_register(uart0_rx_intr_handler, NULL);
    ETS_UART_INTR_ENABLE();

    /*
    UART_SetWordLength(UART0,UART_WordLength_8b);
    UART_SetStopBits(UART0,USART_StopBits_1);
    UART_SetParity(UART0,USART_Parity_None);
    UART_SetBaudrate(UART0,74880);
    UART_SetFlowCtrl(UART0,USART_HardwareFlowControl_None,0);
    */

}

串口接收数据说明

1.该模块默认内部有个128字节的缓存区,默认接收的数据存入缓存区里面

在中断接收函数里面,从缓存里面获取数据

  

2.咱们在串口中断函数里面,是在满中断和接收超时中断里面获取串口接收的数据

  

串口接收数据典型程序

1.具体请参考: https://www.cnblogs.com/yangfengwu/p/11669373.html

2.uart.c

//串口数据接收处理方式:https://www.cnblogs.com/yangfengwu/p/11669373.html
char Usart0ReadBuff[Usart0ReadLen]={0};//接收数据缓存
u32  Usart0ReadCnt = 0;//串口接收的数据个数
u32  Usart0ReadCntCopy = 0;//用于拷贝串口接收的数据个数
u32  Usart0IdleCnt = 0;//空闲时间累加变量
u32  Usart0IdleTime = 10;//设置串口空闲时间
u8   Usart0ReadFlage=0;//串口接收到一条完整的数据标志

LOCAL void
uart0_rx_intr_handler(void *para)
{
    uint8 RcvChar;
    uint8 uart_no = UART0;//UartDev.buff_uart_no;
    uint8 fifo_len = 0;
    uint8 buf_idx = 0;
    uint8 fifo_tmp[128] = {0};
    uint32 uart_intr_status = READ_PERI_REG(UART_INT_ST(uart_no)) ;
    while (uart_intr_status != 0x0) {
        if (UART_FRM_ERR_INT_ST == (uart_intr_status & UART_FRM_ERR_INT_ST)) {//数据错误
            //printf("FRM_ERR\r\n");
            WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR);
        } else if (UART_RXFIFO_FULL_INT_ST == (uart_intr_status & UART_RXFIFO_FULL_INT_ST)) {//FIFO满中断
//            printf("full\r\n");
            fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读取缓存了多少字节
            buf_idx = 0;
            while (buf_idx < fifo_len) {
                if(Usart0ReadCnt>Usart0ReadLen){//预防数组溢出
                    Usart0ReadCnt=0;
                }
                Usart0ReadBuff[Usart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//把数据存入数组
                Usart0ReadCnt++;
//                uart_tx_one_char(UART0, READ_PERI_REG(UART_FIFO(UART0)) & 0xFF);//从FIFO读取一字节数据并发送出去
//                buf_idx++;
            }
            WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
        } else if (UART_RXFIFO_TOUT_INT_ST == (uart_intr_status & UART_RXFIFO_TOUT_INT_ST)) {//接收超时中断
//            printf("tout\r\n");
            fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读取缓存了多少字节
            buf_idx = 0;
            while (buf_idx < fifo_len) {
                if(Usart0ReadCnt>Usart0ReadLen){//预防数组溢出
                    Usart0ReadCnt=0;
                }
                Usart0ReadBuff[Usart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//把数据存入数组
                Usart0ReadCnt++;
//                uart_tx_one_char(UART0, READ_PERI_REG(UART_FIFO(UART0)) & 0xFF);//从FIFO读取一字节数据并发送出去
//                buf_idx++;
            }

            WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);
        } else if (UART_TXFIFO_EMPTY_INT_ST == (uart_intr_status & UART_TXFIFO_EMPTY_INT_ST)) {//发送缓存为空
//            printf("empty\n\r");
            WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_TXFIFO_EMPTY_INT_CLR);
            CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);
        } else {
            //skip
        }
        uart_intr_status = READ_PERI_REG(UART_INT_ST(uart_no)) ;
    }
}

 

3.uart.h

#define Usart0ReadLen 1024  //串口缓存的最大字节数

猜你喜欢

转载自www.cnblogs.com/yangfengwu/p/12375342.html