求问这个程序能实现智能门锁吗,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
```