weixin_58857297 2024-04-20 10:48 采纳率: 87.5%
浏览 9
已结题

这个程序要怎么弄呀,智能门锁,想加入gam模块

求问这个程序能实现智能门锁吗,LCD1206显示,一改.c要显示的文字就会出错,用PCtoLCD取模,然后替换就会出错。然后要加入GSM模块实现智能门锁解锁失败三次就报警并发送短信,但是显示CLOSE_USART2_RECEIVE、 OPEN_USART2_RECEIVE;这种没有定义,应该怎么定义呀?要用到什么调试软件吗


```c
//mainc
i#nclude "sim900a.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "usart1.h"
#include "usart2.h"
#include "delay.h"



uint8_t verification_code[7];        //存放验证码 




uint8_t sim900a_receive_data[128] = {0};
uint16_t sim900a_receive_count;




/**********************************************************************
描述:   SIM900A模块发送指令 函数
参数: *str:指令内容    ack:正常返回结果的数据 time:允许时间(1次代表 10ms)
返回: 0:指令得到正确回应 1: 指令没得到回应
***********************************************************************/
uint8_t sim900a_send_cmd(uint8_t *str,uint8_t *ack,uint16_t time)
{
    memset(sim900a_receive_data,'\0',sizeof(sim900a_receive_data));
    sim900a_receive_count = 0;
    
    usart_sendString(USART2,(char *)str);        //发送指令
    if(ack == NULL)    return 0;
    
    //开启中断接收
    OPEN_USART2_RECEIVE;
    while(time--)
    {
        delay_ms(10);
        //寻找要找的关键词 找到关中断接收 并且返回0
        if(strstr((char *)sim900a_receive_data,(char *)ack) != NULL)
        {
            CLOSE_USART2_RECEIVE;    //关闭中断接收
            return 0;
        }    
    }
    
    CLOSE_USART2_RECEIVE;    //关闭中断接收
    return 1;                //超时还没收到想要得到的关键词 关串口中断 并且返回1            
}


/**********************************************************************
描述:   SIM900A模块发送指令 函数
参数: *str:指令内容    ack:正常返回结果的数据 time:允许时间(1次代表 10ms)
返回: 0:指令得到正确回应 1: 指令没得到回应
***********************************************************************/
uint8_t sim900a_send_end(uint8_t data,uint8_t *ack,uint16_t time)
{
    sim900a_receive_count = 0;    
    memset(sim900a_receive_data,'\0',sizeof(sim900a_receive_data));
    

    usart_sendByte(USART2,data);        //发送结束指令
    if(ack == NULL)    return 0;
    
    //开启中断接收
    OPEN_USART2_RECEIVE;
    
    while(time--)
    {
        delay_ms(10);
        //寻找要找的关键词 找到关中断接收 并且返回0
        if(strstr((char *)sim900a_receive_data,(char *)ack) != NULL)
        {
            CLOSE_USART2_RECEIVE;    //关闭中断接收
            return 0;
        }    
    }
    CLOSE_USART2_RECEIVE;        //关闭中断接收
    return 1;                    //超时还没收到想要得到的关键词 关串口中断 并且返回1            
}



/**********************************************************************
描述:   随机生成验证码('0'~'9')
        产生字符 '0' ~ '9'  十进制也就是 48 ~ 57
***********************************************************************/
void generate_verification_code(char *data,uint8_t number)
{
    uint8_t i;
//    srand(time(NULL));

    for(i=0;i<number;i++)
    {
        data[i] = 48 + (rand() % 10);
    }
}

/**********************************************************************
描述: ASCII 转 unicode      比如 '1'  转成 "0031"
***********************************************************************/
void ASCII_TO_Unicode(char *ASCII,char *Unicode)
{
    int length;
    int i = 0;
    int j = 0;
    memset(Unicode,'\0',sizeof(Unicode));
    length = strlen(ASCII);

    for(i=0;i<length;i++)
    {
        Unicode[j++] = '0';
        Unicode[j++] = '0';

        Unicode[j++] = (ASCII[i] / 16) + 0x30;
        Unicode[j++] = (ASCII[i] % 16) + 0x30;
    }

}

/**********************************************************************
描述: SIM900A 发送验证码 函数
返回: 0:成功 1:失败
***********************************************************************/
uint8_t sim900a_send_verification_code(void)
{
    uint8_t ack;        //存放状态
    uint8_t err = 3;    //设置可错误次数 
    uint8_t send_count = 3;    //发送次数 发送次数达到还是没成功则放弃发送
    uint8_t sim900a_send_buffer[96] = {0};

SEND_AT:
    strcpy((char *)sim900a_send_buffer,"AT+CMGS=\"");
    
    //发送指令AT 检测是否返回OK 给300ms时间检测
    ack = sim900a_send_cmd(SIM900A_SEND_AT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("AT FAIL\r\n");
            return 1;    
        }
        goto SEND_AT;
    }
    printf("AT OK\r\n");
    err = 3;
        
    //发送 短消息格式 指令 检测是否返回OK 给300ms时间检测
SELECT_SMS_FORMAT:
    ack = sim900a_send_cmd(SIM900A_SELECT_SMS_FORMAT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SMS FORMAT FAIL\r\n");    
            return 1;    
        }
        goto SELECT_SMS_FORMAT;
    }
    printf("SMS FORMAT SUCCESS\r\n");
    err = 3;



    //发送 选择TE字库集 指令 检测是否返回OK 给300ms时间检测
SELECT_TE_FONT:
    ack = sim900a_send_cmd(SIM900A_SELECT_TE_FONT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SELECT_TE_FONT FAIL\r\n");
            return 1;    
        }
        goto SELECT_TE_FONT;
    }
    printf("SELECT_TE_FONT SUCCESS\r\n");
    err = 3;



    //发送 选择TE字库集 指令 不检测返回值
SAVE_SMS_SET:
    ack = sim900a_send_cmd(SIM900A_SAVE_SMS_SET,NULL,0);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SAVE_SMS_SET FAIL\r\n");
            return 1;    
        }
        goto SAVE_SMS_SET;
    }
    printf("SAVE_SMS_SET SUCCESS\r\n");
    err = 3;


    //发送 设置短消息文本模式参数 指令 检测是否返回OK 给300ms时间检测
SET_SMS_TEST_MODE:
    ack = sim900a_send_cmd(SIM900A_SET_SMS_TEST_MODE,"OK",30);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SMS TEST MODE FAIL\r\n");
                return 1;    
            }
            goto SET_SMS_TEST_MODE;
        }
        printf("SMS TEST MODE SUCCESS\r\n");
        err = 3;


    //让我们的设置接收短信方电话号码生成unicode编码    
    ASCII_TO_Unicode(PHONE_NUMBER,&sim900a_send_buffer[strlen(sim900a_send_buffer)]);
    strcat((char *)sim900a_send_buffer,"\"\r\n");         
    printf("%s\r\n",sim900a_send_buffer);
    //发送 接收短信方电话号码 指令 检测是否返回OK 给1000ms时间检测
SELECT_PHONE_NUMBER:
    ack = sim900a_send_cmd(sim900a_send_buffer,">",100);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SET PHONE NUMBER FAIL\r\n");
                return 1;    
            }
            goto SELECT_PHONE_NUMBER;
        }
        printf("SET PHONE NUMBER SUCCESS\r\n");
        err = 3;        
        
        //清空缓冲区 准备为发送验证码做准备
        memset(sim900a_send_buffer,'\0',sizeof(sim900a_send_buffer));
        
        

        
        //在这里开始就是开始发送内容了
        //1-生成验证码
        strcpy((char *)sim900a_send_buffer,"9A8C8BC17801003A");    //添加unicode码 "验证码:"
        generate_verification_code((char *)verification_code,6);//生成验证码
        printf("验证码生成结果:%s\r\n",verification_code);        
        
        //2-将随机产生的6位验证码转Unicode编码 并且拼接一起
        ASCII_TO_Unicode((char *)verification_code,&sim900a_send_buffer[strlen(sim900a_send_buffer)]);
        strcat((char *)sim900a_send_buffer,"\r\n");    //加上回车换行 
        printf("%s\r\n",sim900a_send_buffer);
        //3-发送数据
SEND_DATA:
    ack = sim900a_send_cmd(sim900a_send_buffer,">",300);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SEND DATA FAIL\r\n");
                return 1;    
            }
            goto SEND_DATA;
        }
        printf("SEND DATA SUCCESS\r\n");
        
        //4-发送 0X1A 标志
        ack = sim900a_send_end(0x1a,"OK",800);
        if(ack)
        {
            if(send_count-- == 0)    return 1;
            memset(sim900a_send_buffer,'\0',sizeof(sim900a_send_buffer));
            err = 3;
            goto SEND_AT;    //重发短信
        }
        
        printf("SEND MESSAGE SUCCESS\r\n");
    return 0;
}


/**********************************************************************
描述: SIM900A 初始化 函数
返回: 0:成功 1:失败
***********************************************************************/
uint8_t sim900a_init(void)
{
    uint8_t ack;        //存放状态
    uint8_t err;        //设置可错误次数 

    err = 3;
    //发送指令AT 检测是否返回OK 给300ms时间检测
SEND_AT:
    
    ack = sim900a_send_cmd(SIM900A_SEND_AT,"OK",30);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("AT FAIL\r\n");                //ESP8266模块不存在
                return 1;    
            }

            goto SEND_AT;
        }
        printf("AT SUCCESS\r\n");
        
    return 0;
}






//usart1.c
#include "stm32f10x.h"

#include "usart1.h"
#include "as608.h"

#ifdef FG_USE_USART1

//串口接收缓存区     
u8 USART1_RX_BUF[USART1_MAX_RECV_LEN];                 //接收缓冲,最大USART1_MAX_RECV_LEN个字节.
u8 USART1_TX_BUF[USART1_MAX_SEND_LEN]; 
vu16 USART1_RX_STA;

void TIM2_Int_Init(u16 arr,u16 psc);
//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率      
void USART1_Init(u32 pclk2,u32 bound)//PA2,3
{       
    float temp;
    u16 mantissa;
    u16 fraction;       
    temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp;                 //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分     
    mantissa<<=4;
    mantissa+=fraction; 
    RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
    RCC->APB2ENR|=1<<14;  //使能串口时钟 
    GPIOA->CRH&=0XFFFFF00F;//IO状态设置
    GPIOA->CRH|=0X000008B0;//IO状态设置 
    RCC->APB2RSTR|=1<<14;   //复位串口1
    RCC->APB2RSTR&=~(1<<14);//停止复位              
    //波特率设置
     USART1->BRR=mantissa; // 波特率设置     
    USART1->CR1|=0X200C;  //1位停止,无校验位.
    //使能接收中断 
    USART1->CR1|=1<<5;    //接收缓冲区非空中断使能            
    MY_NVIC_Init(2,0,USART1_IRQn,2);//组2,最低优先级 
    
    
    TIM2_Int_Init(99,7199);                //10ms中断
    TIM2->CR1&=~(1<<0);                    //关闭定时器4
    USART1_RX_STA=0;                    //清零
}


void USART1_IRQHandler(void)
{
    u8 res;        
    if(USART1->SR&(1<<5))//接收到数据
    {     
        res=USART1->DR;              
        if((USART1_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
        { 
            if(USART1_RX_STA<USART1_MAX_RECV_LEN)    //还可以接收数据
            {
                TIM2->CNT=0;                         //计数器清空
                if(USART1_RX_STA==0)                 //使能定时器4的中断 
                {
                    TIM2->CR1|=1<<0;                 //使能定时器4
                }
                USART1_RX_BUF[USART1_RX_STA++]=res;    //记录接收到的值     
            }
            else 
            {
                USART1_RX_STA|=1<<15;                //强制标记接收完成
            } 
        }
    }                                               
}

//*************************************************************

void TIM2_IRQHandler(void)
{                                       
    if(TIM2->SR&0X0001)//溢出中断
    {
        USART1_RX_STA|=1<<15;    //标记接收完成    
        TIM2->CR1&=~(1<<0);        //关闭定时器4
    }                   
    TIM2->SR&=~(1<<0);//清除中断标志位         
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器4!
void TIM2_Int_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<0;    //TIM2时钟使能   
     TIM2->ARR=arr;      //设定计数器自动重装值 
    TIM2->PSC=psc;      //预分频器设置
    TIM2->DIER|=1<<0;   //允许更新中断                
    TIM2->CR1|=0x01;    //使能定时器4
    MY_NVIC_Init(0,2,TIM2_IRQn,2);//抢占1,子优先级3,组2                                     
}
#endif


//usart1.h
#ifndef __USART1_H
#define __USART1_H             
#include "sys.h"    


#define USART1_MAX_RECV_LEN        800                    //最大接收缓存字节数
#define USART1_MAX_SEND_LEN        800                    //最大发送缓存字节数


extern u8  USART1_RX_BUF[USART1_MAX_RECV_LEN];         //接收缓冲,最大USART1_MAX_RECV_LEN字节
extern u8  USART1_TX_BUF[USART1_MAX_SEND_LEN];         //发送缓冲,最大USART1_MAX_SEND_LEN字节
extern vu16 USART1_RX_STA;

void USART1_Init(u32 pclk1,u32 bound);

#endif    

```c
//usart2.c
#include "usart2.h"
#include "as608.h"

#ifdef FG_USE_USART1
#else
//串口接收缓存区     
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];                 //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; 
vu16 USART2_RX_STA;

void TIM2_Int_Init(u16 arr,u16 psc);
//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率      
void USART2_Init(u32 pclk1,u32 bound)//PA2,3
{       
    float temp;
    u16 mantissa;
    u16 fraction;       
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp;                 //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分     
    mantissa<<=4;
    mantissa+=fraction; 

    RCC->APB2ENR|=1<<2;       //使能PORTA口时钟  
    GPIOA->CRL&=0XFFFF00FF;    //IO状态设置
    GPIOA->CRL|=0X00008B00;    //IO状态设置      

    RCC->APB1ENR|=1<<17;      //使能串口时钟 
          
    RCC->APB1RSTR|=1<<17;   //复位串口2
    RCC->APB1RSTR&=~(1<<17);//停止复位              
    //波特率设置
     USART2->BRR=mantissa;     // 波特率设置     
    USART2->CR1|=0X200C;      //1位停止,无校验位.


    //使能接收中断
    USART2->CR1|=1<<8;        //PE中断使能
    USART2->CR1|=1<<5;        //接收缓冲区非空中断使能            
    MY_NVIC_Init(3,3,USART2_IRQn,2);//组2,最低优先级
    
    
    TIM2_Int_Init(99,7199);                //10ms中断
    TIM2->CR1&=~(1<<0);                    //关闭定时器4
    USART2_RX_STA=0;                    //清零
}


void USART2_IRQHandler(void)
{
    u8 res;        
    if(USART2->SR&(1<<5))//接收到数据
    {     
        res=USART2->DR;              
        if((USART2_RX_STA&(0x8000))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
        { 
            if(USART2_RX_STA<USART2_MAX_RECV_LEN)    //还可以接收数据
            {
                TIM2->CNT=0;                         //计数器清空
                if(USART2_RX_STA==0)                 //使能定时器4的中断 
                {
                    TIM2->CR1|=1<<0;                 //使能定时器4
                }
                USART2_RX_BUF[USART2_RX_STA++]=res;    //记录接收到的值     
            }
            else 
            {
                USART2_RX_BUF[USART2_MAX_RECV_LEN-1]= 0;
                USART2_RX_STA|=0x8000;                //强制标记接收完成
            } 
        }
    }                                               
}

//*************************************************************

void TIM2_IRQHandler(void)
{                                       
    if(TIM2->SR&0X0001)//溢出中断
    {
        USART2_RX_BUF[USART2_RX_STA]= 0;
        USART2_RX_STA|=1<<15;    //标记接收完成    
        TIM2->CR1&=~(1<<0);        //关闭定时器4
    }                   
    TIM2->SR&=~(1<<0);//清除中断标志位         
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器4!
void TIM2_Int_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<0;    //TIM2时钟使能   
     TIM2->ARR=arr;      //设定计数器自动重装值 
    TIM2->PSC=psc;      //预分频器设置
    TIM2->DIER|=1<<0;   //允许更新中断                
    TIM2->CR1|=0x01;    //使能定时器4
    MY_NVIC_Init(0,2,TIM2_IRQn,2);//抢占1,子优先级3,组2                                     
}
#endif



//usart2.h
#ifndef __USART2_H
#define __USART2_H             
#include "sys.h"    

#define USART2_MAX_RECV_LEN        800                    //最大接收缓存字节数
#define USART2_MAX_SEND_LEN        800                    //最大发送缓存字节数


extern u8  USART2_RX_BUF[USART2_MAX_RECV_LEN];         //接收缓冲,最大USART2_MAX_RECV_LEN字节
extern u8  USART2_TX_BUF[USART2_MAX_SEND_LEN];         //发送缓冲,最大USART2_MAX_SEND_LEN字节
extern vu16 USART2_RX_STA;

void USART2_Init(u32 pclk1,u32 bound);

#endif    


```c
//sim900a.c
#include "sim900a.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "usart1.h"
#include "usart2.h"
#include "delay.h"



uint8_t verification_code[7];        //存放验证码 




uint8_t sim900a_receive_data[128] = {0};
uint16_t sim900a_receive_count;




/**********************************************************************
描述:   SIM900A模块发送指令 函数
参数: *str:指令内容    ack:正常返回结果的数据 time:允许时间(1次代表 10ms)
返回: 0:指令得到正确回应 1: 指令没得到回应
***********************************************************************/
uint8_t sim900a_send_cmd(uint8_t *str,uint8_t *ack,uint16_t time)
{
    memset(sim900a_receive_data,'\0',sizeof(sim900a_receive_data));
    sim900a_receive_count = 0;
    
    usart_sendString(USART2,(char *)str);        //发送指令
    if(ack == NULL)    return 0;
    
    //开启中断接收
    OPEN_USART2_RECEIVE;
    while(time--)
    {
        delay_ms(10);
        //寻找要找的关键词 找到关中断接收 并且返回0
        if(strstr((char *)sim900a_receive_data,(char *)ack) != NULL)
        {
            CLOSE_USART2_RECEIVE;    //关闭中断接收
            return 0;
        }    
    }
    
    CLOSE_USART2_RECEIVE;    //关闭中断接收
    return 1;                //超时还没收到想要得到的关键词 关串口中断 并且返回1            
}


/**********************************************************************
描述:   SIM900A模块发送指令 函数
参数: *str:指令内容    ack:正常返回结果的数据 time:允许时间(1次代表 10ms)
返回: 0:指令得到正确回应 1: 指令没得到回应
***********************************************************************/
uint8_t sim900a_send_end(uint8_t data,uint8_t *ack,uint16_t time)
{
    sim900a_receive_count = 0;    
    memset(sim900a_receive_data,'\0',sizeof(sim900a_receive_data));
    

    usart_sendByte(USART2,data);        //发送结束指令
    if(ack == NULL)    return 0;
    
    //开启中断接收
    OPEN_USART2_RECEIVE;
    
    while(time--)
    {
        delay_ms(10);
        //寻找要找的关键词 找到关中断接收 并且返回0
        if(strstr((char *)sim900a_receive_data,(char *)ack) != NULL)
        {
            CLOSE_USART2_RECEIVE;    //关闭中断接收
            return 0;
        }    
    }
    CLOSE_USART2_RECEIVE;        //关闭中断接收
    return 1;                    //超时还没收到想要得到的关键词 关串口中断 并且返回1            
}



/**********************************************************************
描述:   随机生成验证码('0'~'9')
        产生字符 '0' ~ '9'  十进制也就是 48 ~ 57
***********************************************************************/
void generate_verification_code(char *data,uint8_t number)
{
    uint8_t i;
//    srand(time(NULL));

    for(i=0;i<number;i++)
    {
        data[i] = 48 + (rand() % 10);
    }
}

/**********************************************************************
描述: ASCII 转 unicode      比如 '1'  转成 "0031"
***********************************************************************/
void ASCII_TO_Unicode(char *ASCII,char *Unicode)
{
    int length;
    int i = 0;
    int j = 0;
    memset(Unicode,'\0',sizeof(Unicode));
    length = strlen(ASCII);

    for(i=0;i<length;i++)
    {
        Unicode[j++] = '0';
        Unicode[j++] = '0';

        Unicode[j++] = (ASCII[i] / 16) + 0x30;
        Unicode[j++] = (ASCII[i] % 16) + 0x30;
    }

}

/**********************************************************************
描述: SIM900A 发送验证码 函数
返回: 0:成功 1:失败
***********************************************************************/
uint8_t sim900a_send_verification_code(void)
{
    uint8_t ack;        //存放状态
    uint8_t err = 3;    //设置可错误次数 
    uint8_t send_count = 3;    //发送次数 发送次数达到还是没成功则放弃发送
    uint8_t sim900a_send_buffer[96] = {0};

SEND_AT:
    strcpy((char *)sim900a_send_buffer,"AT+CMGS=\"");
    
    //发送指令AT 检测是否返回OK 给300ms时间检测
    ack = sim900a_send_cmd(SIM900A_SEND_AT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("AT FAIL\r\n");
            return 1;    
        }
        goto SEND_AT;
    }
    printf("AT OK\r\n");
    err = 3;
        
    //发送 短消息格式 指令 检测是否返回OK 给300ms时间检测
SELECT_SMS_FORMAT:
    ack = sim900a_send_cmd(SIM900A_SELECT_SMS_FORMAT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SMS FORMAT FAIL\r\n");    
            return 1;    
        }
        goto SELECT_SMS_FORMAT;
    }
    printf("SMS FORMAT SUCCESS\r\n");
    err = 3;



    //发送 选择TE字库集 指令 检测是否返回OK 给300ms时间检测
SELECT_TE_FONT:
    ack = sim900a_send_cmd(SIM900A_SELECT_TE_FONT,"OK",30);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SELECT_TE_FONT FAIL\r\n");
            return 1;    
        }
        goto SELECT_TE_FONT;
    }
    printf("SELECT_TE_FONT SUCCESS\r\n");
    err = 3;



    //发送 选择TE字库集 指令 不检测返回值
SAVE_SMS_SET:
    ack = sim900a_send_cmd(SIM900A_SAVE_SMS_SET,NULL,0);    
    if(ack)
    {
        if(err-- == 0)
        {
            printf("SAVE_SMS_SET FAIL\r\n");
            return 1;    
        }
        goto SAVE_SMS_SET;
    }
    printf("SAVE_SMS_SET SUCCESS\r\n");
    err = 3;


    //发送 设置短消息文本模式参数 指令 检测是否返回OK 给300ms时间检测
SET_SMS_TEST_MODE:
    ack = sim900a_send_cmd(SIM900A_SET_SMS_TEST_MODE,"OK",30);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SMS TEST MODE FAIL\r\n");
                return 1;    
            }
            goto SET_SMS_TEST_MODE;
        }
        printf("SMS TEST MODE SUCCESS\r\n");
        err = 3;


    //让我们的设置接收短信方电话号码生成unicode编码    
    ASCII_TO_Unicode(PHONE_NUMBER,&sim900a_send_buffer[strlen(sim900a_send_buffer)]);
    strcat((char *)sim900a_send_buffer,"\"\r\n");         
    printf("%s\r\n",sim900a_send_buffer);
    //发送 接收短信方电话号码 指令 检测是否返回OK 给1000ms时间检测
SELECT_PHONE_NUMBER:
    ack = sim900a_send_cmd(sim900a_send_buffer,">",100);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SET PHONE NUMBER FAIL\r\n");
                return 1;    
            }
            goto SELECT_PHONE_NUMBER;
        }
        printf("SET PHONE NUMBER SUCCESS\r\n");
        err = 3;        
        
        //清空缓冲区 准备为发送验证码做准备
        memset(sim900a_send_buffer,'\0',sizeof(sim900a_send_buffer));
        
        

        
        //在这里开始就是开始发送内容了
        //1-生成验证码
        strcpy((char *)sim900a_send_buffer,"9A8C8BC17801003A");    //添加unicode码 "验证码:"
        generate_verification_code((char *)verification_code,6);//生成验证码
        printf("验证码生成结果:%s\r\n",verification_code);        
        
        //2-将随机产生的6位验证码转Unicode编码 并且拼接一起
        ASCII_TO_Unicode((char *)verification_code,&sim900a_send_buffer[strlen(sim900a_send_buffer)]);
        strcat((char *)sim900a_send_buffer,"\r\n");    //加上回车换行 
        printf("%s\r\n",sim900a_send_buffer);
        //3-发送数据
SEND_DATA:
    ack = sim900a_send_cmd(sim900a_send_buffer,">",300);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("SEND DATA FAIL\r\n");
                return 1;    
            }
            goto SEND_DATA;
        }
        printf("SEND DATA SUCCESS\r\n");
        
        //4-发送 0X1A 标志
        ack = sim900a_send_end(0x1a,"OK",800);
        if(ack)
        {
            if(send_count-- == 0)    return 1;
            memset(sim900a_send_buffer,'\0',sizeof(sim900a_send_buffer));
            err = 3;
            goto SEND_AT;    //重发短信
        }
        
        printf("SEND MESSAGE SUCCESS\r\n");
    return 0;
}


/**********************************************************************
描述: SIM900A 初始化 函数
返回: 0:成功 1:失败
***********************************************************************/
uint8_t sim900a_init(void)
{
    uint8_t ack;        //存放状态
    uint8_t err;        //设置可错误次数 

    err = 3;
    //发送指令AT 检测是否返回OK 给300ms时间检测
SEND_AT:
    
    ack = sim900a_send_cmd(SIM900A_SEND_AT,"OK",30);    
        if(ack)
        {
            if(err-- == 0)
            {
                printf("AT FAIL\r\n");                //ESP8266模块不存在
                return 1;    
            }

            goto SEND_AT;
        }
        printf("AT SUCCESS\r\n");
        
    return 0;
}



//sim900a.h
#ifndef __SIM900A_H
#define __SIM900A_H
#include "stm32f10x.h"

/*用户必改 xxxxxxxxxxx 改成接收短信的电话号码*/
#define        PHONE_NUMBER        "xxxxxxxxxxx"


#define        SIM900A_SEND_AT                            "AT\r\n"
//1.选择短消息格式 (0:PDU模式 1:文本模式)
#define        SIM900A_SELECT_SMS_FORMAT                "AT+CMGF=1\r\n"            
//2.选择TE字库集
#define        SIM900A_SELECT_TE_FONT                    "AT+CSCS=\"UCS2\"\r\n"
//3.保存SMS设置
#define        SIM900A_SAVE_SMS_SET                    "AT+CSCA?\r\n"
//4.设置短消息文本模式参数
#define        SIM900A_SET_SMS_TEST_MODE                "AT+CSMP=17,167,0,25\r\n"



extern uint8_t  sim900a_receive_data[128];
extern uint16_t  sim900a_receive_count;

extern uint8_t verification_code[7];        //存放验证码



uint8_t sim900a_send_cmd(uint8_t *str,uint8_t *ack,uint16_t time);    //SIM900A模块发送字符串指令 函数
uint8_t sim900a_send_end(uint8_t data,uint8_t *ack,uint16_t time);    //SIM900A模块发送单字节指令 函数
void generate_verification_code(char *data,uint8_t number);            // 随机生成验证码('0'~'9')
void ASCII_TO_Unicode(char *ASCII,char *Unicode);                    // ASCII 转 unicode
uint8_t sim900a_init(void);
uint8_t sim900a_send_verification_code(void);
#endif

```

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-20 10:53
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    该程序似乎无法实现智能门锁功能。以下是问题的解答:
    1. 能否实现智能门锁功能? 该程序中没有任何实现智能门锁功能的代码,因此无法实现智能门锁功能。
    2. 更改.c文件后为什么显示会出错? 更改.c文件可能会导致一些变量或函数被删除或更改名称,从而导致其他代码无法识别这些变量或函数的名称,从而导致错误。如果更改了.c文件,请确保所有依赖该文件的代码都已经更新以反映这些更改。
    3. 使用PCtoLCD取模替换时为什么会出错? 使用PCtoLCD取模替换可能会导致转换后的图像不符合预期,这可能是由于使用的取模算法与LCD屏幕的控制器不兼容所致。请尝试使用其他的取模工具或手动编写取模代码来解决问题。
    4. 如何定义CLOSE_USART2_RECEIVE和OPEN_USART2_RECEIVE? 这些变量没有在程序中定义,因此需要添加相应的定义,例如:
    #define CLOSE_USART2_RECEIVE USART_ITConfig(USART2, USART_IT_RXNE, DISABLE)
    #define OPEN_USART2_RECEIVE USART_ITConfig(USART2, USART_IT_RXNE, ENABLE)
    
    1. 如何调试程序? 可以使用串口调试工具(例如TeraTerm或RealTerm)来查看程序的输出和输入,帮助诊断问题。还可以使用单步调试器(例如st-link或j-link)来逐步执行程序并监视变量和寄存器的值。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态
  • ¥15 浮动div的高度控制问题。
  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created