找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 324|回复: 3
打印 上一主题 下一主题
收起左侧

esp8266不进中断函数,但是在串口调试工具中可以正常运行

[复制链接]
跳转到指定楼层
楼主
ID:1175545 发表于 2026-8-1 15:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

u8 idata UART_RX_BUF[UART_RX_BUF_SIZE];

void UART_init(u32 baud, bit isMultiple){
////////////////////////////
////
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:469589 发表于 2026-8-11 08:41 | 只看该作者
被你的更高级中断抢先了,例如SYSTICK的有限级高于你这个中断
回复

使用道具 举报

板凳
ID:1175545 发表于 2026-8-2 17:32 | 只看该作者
用得是普中a4的开发板。

u8 idata UART_RX_BUF[UART_RX_BUF_SIZE];

void UART_init(u32 baud, bit isMultiple){
        if(isMultiple) PCON = 0x80; else PCON = 0;
        TL1 = TH1 = GEN_UART_TH1(baud);//256 -  FOSC * 1. * (1 << (PCON >> 7)) / (12 * 32L * baud);//9600
        SCON |= 0X50;
        TMOD |= 0X20;
       
        ES = 1;
        EA = 1;
        TR1 = 1;
}


void UART_sendData(u8 dat){
        ES = 0;
        TI = 0;
        SBUF = dat;
        while(TI == 0);
        TI = 0;
        ES = 1;
}


void UART_sendString(u8 *pbuf){
        u8 buf;
        while(buf = *pbuf++){
                UART_sendData(buf);
                delay_10us(5);
        }
}



==================================================
volatile bit g_wifi_init_rx_complete_resp_Flag = 0;
volatile bit g_wifi_init_at_rst_flag = 0;

void UART_IRQn(void) interrupt 4{
        static u8 data i = 0;

        if(RI){       
                TI = 0;
                RI = 0;               
                i = i % (UART_RX_BUF_SIZE - 1);
                if(i == 0) {
                        memset(UART_RX_BUF, '\0', UART_RX_BUF_SIZE);//0.007551 // 0.00649197//memset(UART_RX_BUF, 0, UART_RX_BUF_SIZE);
                }
                UART_RX_BUF = SBUF;
                if(UART_RX_BUF[0] == 'A' || g_wifi_init_at_rst_flag){ // at+...
                        if(strcmp(UART_RX_BUF, "AT+RST\r\n\r\nOK\r\n") == 0){
                                g_wifi_init_at_rst_flag = 1;
                                i++;
                        }else if(
                                (i >= 4 && UART_RX_BUF[i-4] == '\n' && strcmp(&UART_RX_BUF[i-3], "OK\r\n") == 0) ||
                                //(i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ERROR\r\n") == 0) ||
                                (i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ready\r\n") == 0)
                        ){
                                UART_RX_BUF_SIZE_reset(&i);
                                g_wifi_init_rx_complete_resp_Flag = 1;
                                g_wifi_init_at_rst_flag = 0;
                        }else{i++;}
                }else if(
                        strstr(UART_RX_BUF, ",CONNECT\r\n") != NULL ||
                        strstr(UART_RX_BUF, ",CLOSED\r\n") != NULL
                ){
                        UART_RX_BUF_SIZE_reset(&i);
                }else if(i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ready\r\n") == 0){
                        UART_RX_BUF_SIZE_reset(&i);
                        g_wifi_init_rx_complete_resp_Flag = 1;                       
                }else{i++;}
        }
}

void UART_RX_BUF_SIZE_reset(u8 *i){
        *i = 0;
        memset(UART_RX_BUF, '\0', UART_RX_BUF_SIZE);
}

void ESP8266_sendCMD(u8* pbuf){
        u8 buf = NULL;
        while(buf = *pbuf++){
                UART_sendData(buf);
        }
        UART_sendData('\r');
        UART_sendData('\n');
        while(!g_wifi_init_rx_complete_resp_Flag);
}

void ESP8266_init(void){
        ESP8266_sendCMD("AT+RST");
        ESP8266_sendCMD("AT+CWMODE_DEF=1");//STA
        ESP8266_sendCMD("AT+CWAUTOCONN=0");
        ESP8266_sendCMD("AT+CIPSTA_DEF=\"192.168.1.100\",\"192.168.1.1\",\"255.255.255.0\"");
        ESP8266_sendCMD("AT+CWJAP_DEF=\"******\",\"*******\"");
        ESP8266_sendCMD("AT+CIPMODE=0");
        ESP8266_sendCMD("AT+CIPMUX=1");
        ESP8266_sendCMD("AT+CIPSERVER=1");//PORT=333
}

void WIFI_init(void){
        UART_init(WIFI_BAUD2, 1);//WIFI_BAUD2==9600  esp8266也是相同波特率
        ESP8266_init();
}


回复

使用道具 举报

沙发
ID:1175545 发表于 2026-8-1 15:58 | 只看该作者
u8 idata UART_RX_BUF[UART_RX_BUF_SIZE];

void UART_init(u32 baud, bit isMultiple){
////////////////////////////
////        TIMER 1
////////////////////////////
        if(isMultiple) PCON = 0x80; else PCON = 0;
        TL1 = TH1 = GEN_UART_TH1(baud);//256 -  FOSC * 1. * (1 << (PCON >> 7)) / (12 * 32L * baud);
        SCON |= 0X50;
        TMOD |= 0X20;
        ES = 1;
        EA = 1;
        TR1 = 1;
}


void UART_sendData(u8 dat){
        ES = 0;
        TI = 0;
        SBUF = dat;
        while(TI == 0);
        TI = 0;
        ES = 1;
}


void UART_sendString(u8 *pbuf){
        u8 buf;
        while(buf = *pbuf++){
                UART_sendData(buf);
                delay_10us(5);
        }
}

========================================================================
volatile bit g_wifi_init_rx_complete_resp_Flag = 0;
volatile bit g_wifi_init_at_rst_flag = 0;

void UART_IRQn(void) interrupt 4{
        static u8 data i = 0;

        if(RI){       
                TI = 0;
                RI = 0;               
                i = i % (UART_RX_BUF_SIZE - 1);
                if(i == 0) {
                        memset(UART_RX_BUF, '\0', UART_RX_BUF_SIZE);
                }
                UART_RX_BUF[i] = SBUF;

                if(UART_RX_BUF[0] == 'A' || g_wifi_init_at_rst_flag){ // at+...
                        if(strcmp(UART_RX_BUF, "AT+RST\r\n\r\nOK\r\n") == 0){
                                g_wifi_init_at_rst_flag = 1;
                                i++;
                        }else if(
                                (i >= 4 && UART_RX_BUF[i-4] == '\n' && strcmp(&UART_RX_BUF[i-3], "OK\r\n") == 0) ||
                                //(i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ERROR\r\n") == 0) ||
                                (i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ready\r\n") == 0)
                        ){
                                UART_RX_BUF_SIZE_reset(&i);
                                g_wifi_init_rx_complete_resp_Flag = 1;
                                g_wifi_init_at_rst_flag = 0;
                        }else{i++;}
                }else if(
                        strstr(UART_RX_BUF, ",CONNECT\r\n") != NULL ||
                        strstr(UART_RX_BUF, ",CLOSED\r\n") != NULL
                ){
                        UART_RX_BUF_SIZE_reset(&i);
                }else if(i >= 7 && UART_RX_BUF[i-7] == '\n' && strcmp(&UART_RX_BUF[i-6], "ready\r\n") == 0){
                        UART_RX_BUF_SIZE_reset(&i);
                        g_wifi_init_rx_complete_resp_Flag = 1;                       
                }else{i++;}
        }
}

void UART_RX_BUF_SIZE_reset(u8 *i){
        *i = 0;
        memset(UART_RX_BUF, '\0', UART_RX_BUF_SIZE);
}

void ESP8266_sendCMD(u8* pbuf){
        u8 buf = NULL;
        while(buf = *pbuf++){
                UART_sendData(buf);
        }
        UART_sendData('\r');
        UART_sendData('\n');
        while(!g_wifi_init_rx_complete_resp_Flag);
}

void ESP8266_init(void){
        ESP8266_sendCMD("AT+RST");
        ESP8266_sendCMD("AT+CWMODE_DEF=1");//STA
        ESP8266_sendCMD("AT+CWAUTOCONN=0");
        ESP8266_sendCMD("AT+CIPSTA_DEF=\"192.168.1.100\",\"192.168.1.1\",\"255.255.255.0\"");
        ESP8266_sendCMD("AT+CWJAP_DEF=\"*****\",\"*********\"");
        ESP8266_sendCMD("AT+CIPMODE=0");
        ESP8266_sendCMD("AT+CIPMUX=1");
        ESP8266_sendCMD("AT+CIPSERVER=1");//PORT=333
}

void WIFI_init(void){
        UART_init(WIFI_BAUD1, 1);// WIFI_BAUD1 == 9600  esp8266的波特率也是9600
        ESP8266_init();
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表