中级会员
 
- 积分
- 264
- 金钱
- 264
- 注册时间
- 2013-9-17
- 在线时间
- 29 小时
|
5金钱
#include"sim900a.h"
#include"delay.h"
#include "sys.h"
#include "usart.h"
#include "ds18b20.h"
#include "stm32f10x.h"
#include "stdio.h"
//#include"JIDIANQI.h"
#include"led.h"
u8 AT_Read[12]=""; //用来存储发送读取短信指令
u8 numberbuf[3]=""; //用来保存短信条数
char end_char = 0x1a;/*短信内容后加“0x1a”结尾,以16进制发送*/
u8 receiveready ;
u8 readcommendflag;
u8 send;
void sim900a_init()
{
u8 i;
LOOP: printf("at\r"); /*ati初始化sim900模块 */
delay_ms(5000);
printf("ate0\r");
delay_ms(5000);
printf("AT+CSCS=\"GSM\"\r"); /*设置选择TE字符集为GSM7位默认字符*/
delay_ms(3000);
printf("AT+CMGF=2,1\r");
delay_ms(5000);
printf("AT+CMGF=1\r");
delay_ms(50000);
if((USART_RX_BUF[0]=='O')&&(USART_RX_BUF[1]=='K')) //通过串口发送大写的OK 判断USART_RX_BUF的第一第二位是不是OK
{
for(i=0;i<200;i++)
{
USART_RX_BUF=0;
}
USART_RX_STA=0;
}
else{
for(i=0;i<200;i++)
{
USART_RX_BUF=0;
}
USART_RX_STA=0;
goto LOOP;
}
}
void receive_ready(void)
{
u8 i;
if((USART_RX_BUF[3]=='T')&&USART_RX_BUF[4]=='I') //通过串口向stm发送数据,但是第4.5位必须是TI
{ // 此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
receiveready=1;
//如果不是新短信的指令,就舍弃,并将接收数组清零/
}
else{
for(i=0;i<200;i++)
{
USART_RX_BUF=0;
}
USART_RX_STA=0;
}
}
void read_message(void)
{
u8 i;
delay_ms(1000);
for(i=0;i<2;i++)
{
numberbuf=USART_RX_BUF;
}
for(i=0;i<8;i++)
{
AT_Read=AT_CMGR;
}
for(i=8;i<10;i++)
{
AT_Read=numberbuf[i-8];
}
for(i=0;i<10;i++)
{
USART_SendData(USART1,AT_Read);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);//发送读取短信的命令
}
for(i=0;i<200;i++)
{
USART_RX_BUF=0;
}
USART_RX_STA=1; //发送AT+CMGR=?,?代表短信储存所在位置
readcommendflag=1;
}
void message_read(void)//但是第三次发送open1等短信时就不能够接收到数据
{
if((readcommendflag==1)&&(USART_RX_BUF[0]=='G')&&(USART_RX_BUF[1]=='R'))
send=1;
}
void readcommend(void)
{
u8 i;
if(USART_RX_STA&8000==1)
delay_ms(1000);
{ USART_RX_STA=0;
for(i=0;i<5;i=i+1) //将短信内容中的指令部分截取出来放到
{
CommandBuf=USART_RX_BUF[i+5]; //CommandBuf数组中
// CommandBuf=USART_RX_BUF[i+64];
}
if((CommandBuf[0]=='o')&&(CommandBuf[1]=='p')&&(CommandBuf[2]=='e')&&(CommandBuf[3]=='n'))
{
switch(CommandBuf[4])
{
case '1' : LED0=0;break;
case '2' : LED1=0;break;
// case '3' : jidianqi=0;break;
case '4' : send_message();break;
// default:flag; //其他指令定义为错误操作
// break; //置位错误操作位为1
}
}
else if((CommandBuf[0]=='s')&&(CommandBuf[1]=='h')&&(CommandBuf[2]=='u')&&(CommandBuf[3]=='t')) //判断指令是否为关闭电器指令
{
switch(CommandBuf[4])
{
case '1': LED0=1; //关闭继电器1
break;
case '2': LED1=1; //关闭继电器2
break;
// case '3': jidianqi=1; //关闭继电器3
}
}
}
}
主要的问题是第一 第二次能够接收数据,用料之后都吧USART_RX_BUF[]清零,以便接收下次数据,但是第三次,我发送open1的时候就接收不到程序了
我在吧我的MDK源文件附上 就大神帮主
|
|