HC-05底层驱动

INT8U BT_INIT(const char * pNAME, INT32U BAUD, INT8U ROLE, INT32U PSWD)
{
    INT8U    OS_ERR    = OS_ERR_NONE;
    INT8U    BT_ERR    = BT_ERR_NONE;
    INT8U    RETRY    = 0;
    BOOLEAN    F_SET    = FALSE;
    BOOLEAN    F_BOOT    = FALSE;
    char    *MAIL;
    
    
    // Ç¿ÖÆÖØÆô½øÈëATģʽ
    BT_PWR_SET(0);
    _delay_ms(25);
    BT_DAT_MOD_SET(DAT_MOD_AT);
    BT_PWR_SET(1);
    _delay_ms(25);
    
    /* È·¶¨À¶ÑÀ½øÈëATģʽ *************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=25; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT
");
                // printf("%s
", mail);
                if(strstr(MAIL, "OK")) {
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT -> ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    
    /* »ñÈ¡±¾»úÀ¶ÑÀµØÖ· *****************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+ADDR?
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+ADDR?
");
                // printf("%s
", mail);
                if(strstr((char *)MAIL, "ADDR")) {
                    ADDR_PARSE(MAIL, (INT32U *)&BT_API.MAC);
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->ADDR : ERR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    
    /* ½«À¶ÑÀÉèÖÃΪÖ÷»ú/´Ó»úģʽ *************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+ROLE?
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+ROLE?
");
                // printf("%s
", mail);
                if(ROLE == HOST) {
                    if(strstr(MAIL, "ROLE:1")) {
                        F_SET = FALSE;
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                    else if(strstr(MAIL, "ROLE:0")) {
                        F_SET = TRUE;
                        F_BOOT = TRUE;
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                }
                else {
                    if(strstr(MAIL, "ROLE:0")) {
                        F_SET = FALSE;
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                    else if(strstr(MAIL, "ROLE:1")) {
                        F_SET = TRUE;
                        F_BOOT = TRUE;
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                }
            }
            else {
                // debug info...
                // printf("BT->ROLE? -> OS_ERR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    if(BT_ERR==BT_ERR_NONE && F_SET==TRUE) {
        F_SET = FALSE;
        for(RETRY=5; RETRY>0; RETRY--) {
            if(ROLE == HOST) {
                xfprintf(BT_OUT, "AT+ROLE=1
");
            }
            else {
                xfprintf(BT_OUT, "AT+ROLE=0
");
            }
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+ROLE=x
");
                // printf("%s
", mail);
                if(strstr(MAIL, "OK")) {
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT_ROLE->ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    
    /* ²éѯºÍÉèÖÃÀ¶ÑÀ²¨ÌØÂÊ *************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+UART?
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+UART?
");
                // printf("%s
", mail);
                if(strstr(MAIL, "OK") && strstr(MAIL, "UART")) {
                    char *pnum = strchr(MAIL, ':');
                    if(pnum) {
                        pnum++;
                        if(atoi(pnum) != BAUD) {
                            F_SET = TRUE;
                            F_BOOT = TRUE;
                        }
                        else {
                            F_SET = FALSE;
                        }
                    }
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT_BAUD? -> ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    if(BT_ERR==BT_ERR_NONE && F_SET==TRUE) {
        F_SET = FALSE;
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+UART=%d,0,0
", BAUD);
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+UART=%d,0,0
", BAUD);
                // printf("%s
", mail);
                if(strstr(MAIL, "OK")) {
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT_BAUD=xxxxxx -> ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    
    /* ²éѯ/ÉèÖÃ-Åä¶ÔÂë **************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+PSWD?
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+PSWD?
");
                // printf("%s
", mail);
                if(strstr(MAIL, "PSWD") && strstr(MAIL, "OK")) {
                    char * pnum = strchr(MAIL, ':');
                    if(pnum) {
                        pnum++;
                        if(atoi(pnum) == PSWD) {
                            F_SET = FALSE;
                        }
                        else {
                            F_SET = TRUE;
                            F_BOOT = TRUE;
                        }
                    }
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT+PSWD? -> ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    if(BT_ERR==BT_ERR_NONE && F_SET==TRUE) {
        F_SET = FALSE;
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+PSWD=%04d
", PSWD);
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+PSWD=%d
", PSWD);
                // printf("%s
", mail);
                if(strstr(MAIL, "OK")) {
                    BT_ERR = BT_ERR_NONE;
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT+PSWD=xxxx -> ERROR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    
    /* ²éѯ/ÉèÖÃÖ÷»úÃû³Æ **************************************************************/
    if(BT_ERR == BT_ERR_NONE) {
        for(RETRY=5; RETRY>0; RETRY--) {
            xfprintf(BT_OUT, "AT+NAME?
");
            MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
            if(OS_ERR == OS_ERR_NONE) {
                // debug info...
                // printf("AT+NAME?
");
                // printf("%s
", mail);
                if(strstr(MAIL, "NAME")) {
                    BT_ERR = BT_ERR_NONE;
                    if(strstr(MAIL, pNAME)) {
                        F_SET = FALSE;
                    }
                    else {
                        F_SET = TRUE;
                        F_BOOT = TRUE;
                    }
                    break;
                }
                else {
                    BT_ERR = BT_ERR_RES;
                }
            }
            else {
                // debug info...
                // printf("BT->AT+NAME? : ERR!
");
                _delay_ms(25);
            }
        }
        if(RETRY==0) BT_ERR = BT_ERR_OS;
    }
    if(F_SET == TRUE) {
        if(BT_ERR == BT_ERR_NONE) {
            for(RETRY=5; RETRY>0; RETRY--) {
                xfprintf(BT_OUT, "AT+NAME=%s
", pNAME);
                MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
                if(OS_ERR == OS_ERR_NONE) {
                    // debug info...
                    // printf("AT+NAME=%s
", pNAME);
                    // printf("%s
", mail);
                    if(strstr(MAIL, "OK")) {
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                    else {
                        BT_ERR = BT_ERR_RES;
                    }
                }
                else {
                    // debug info...
                    // printf("BT->AT+NAME=xxxx : ERR!
");
                    _delay_ms(25);
                }
            }
            if(RETRY==0) BT_ERR = BT_ERR_OS;
        }
    }
    
    // ½«À¶ÑÀÈí¸´Î»£¬ÉúЧ¸ü¸Ä
    if(F_BOOT == TRUE) {
        if(BT_ERR == BT_ERR_NONE) {
            for(RETRY=5; RETRY>0; RETRY--) {
                xfprintf(BT_OUT, "AT+RESET
");
                MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
                if(OS_ERR == OS_ERR_NONE) {
                    // debug info...
                    // printf("AT+RESET=1
");
                    // printf("%s
", mail);
                    if(strstr(MAIL, "OK")) {
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                    else {
                        BT_ERR = BT_ERR_RES;
                    }
                }
                else {
                    // debug info...
                    // printf("BT->AT+RESET : ERR!
");
                    _delay_ms(25);
                }
            }
            if(RETRY==0) BT_ERR = BT_ERR_OS;
        }
        
        // µÈ´ýÀ¶ÑÀ¸´Î»³É¹¦
        if(BT_ERR == BT_ERR_NONE) {
            for(RETRY=25; RETRY>0; RETRY--) {
                xfprintf(BT_OUT, "AT
");
                MAIL = (char *)OSMboxPend(BT_MEvent, OS_TICKS_PER_SEC/10, &OS_ERR);
                if(OS_ERR == OS_ERR_NONE) {
                    // debug info...
                    // printf("AT
");
                    // printf("%s
", mail);
                    if(strstr(MAIL, "OK")) {
                        BT_ERR = BT_ERR_NONE;
                        break;
                    }
                    else {
                        BT_ERR = BT_ERR_RES;
                    }
                }
                else {
                    // debug info...
                    // printf("BT->AT -> ERROR!
");
                    _delay_ms(25);
                }
            }
            if(RETRY==0) BT_ERR = BT_ERR_OS;
        }
    }
    
    return BT_ERR;
}
原文地址:https://www.cnblogs.com/qdrs/p/10079860.html