新手,勿喷!求指教!想通过sim900a实现一个最基本的功能,就是收到一条特定内容的短信后,自动向指定的手机回复相关的数据,设置了短信提醒功能,sim900a初始化函数执行不了,从而后面的发送短信都过不去,现把一些代码贴出来,麻烦看一下,非常感谢!
这是while死循环
while(1)
{
p1=(u8*)sim900a_check_cmd("+CMTI:");
if(p1) //是否收到短信提示,
{
led_op(green,on); //短信提示,绿灯亮
//delay_ms(10);
p2=(u8*)strstr((const char*)(p1),",");
p4=(u8*)strstr((const char*)(p2+1),"
");
p4[0]=0;
//msgindex[0]=*(p2+1); //得到信息存放在SIM卡中的位置
//msgindex[1]=*(p2+2);
//msgindex[2]=0;
sprintf((char*)p,"AT+CMGR=%s
",p2+1);
if(sim900a_send_cmd(p,"+CMGR:",200)==0) //读取短信,是否读取短信成功
{
led_op(orange,on); //橘 {MOD}亮表示读取短信成功
s1=(u8*)strstr((const char*)(USART3_RX_BUF),"
");//直接读取短信的内容
s2=s1+2; //s2指向接收到短信内容;
if(strstr((const char*)(s2),"CX")) //短信内容是否为“CX”,如果是则开始发送短信
{
delay_ms(10);
led_op(red,off); //红灯灭表示收到了CX
sim900a_sms_send();
}
}
}
}
这是sim900a初始化的函数:初始化函数执行不了
void sim900a_init(void)
{
delay_ms(10);
if(sim900a_send_cmd("AT
","OK",100)==0) //检测是否应答AT指令 默认是回显,所以返回的AT OK
{
if(sim900a_send_cmd("ATE0
","OK",100)==0) //不回显
{
if(sim900a_send_cmd("AT+CMGF=1
","OK",100)==0) //设置文本模式
{
sim900a_send_cmd("AT+CSCS="GSM"
","OK",100) ;//设置GSM字符集
sim900a_send_cmd("AT+CNMI=2,1
","OK",100);//设置新消息提示
}
}
}
}
数据接收是采用串口中断中接收,采用原子哥提供的资料
void USART3_IRQHandler(void)
{
u8 res;
if(USART3->SR&(1<<5))//接收到数据
{
res=USART3->DR;
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据
{
TIM7->CNT=0; //计数器清空
if(USART3_RX_STA==0)TIM7_Set(1); //使能定时器4的中断
USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值
}else
{
USART3_RX_STA|=1<<15; //强制标记接收完成
}
}
}
串口发送是自己写的单个字符逐个发送的函数:
void u3_printf(char *buf)
{
u16 i;
u8 len=strlen(buf);
for(i=0;i<len;i++)
{
USART3->DR=buf;
delay_ms(10);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
用sizeof可以运行到if(sim900a_send_cmd(p,"+CMGR:",200)==0) 这里就进不去了,sizeof不是返回的是变量所占的字节数吗?应该是一个固定的值吧,为什么用sizeof的话,sim900a_init()还能正常运行?这不科学啊!用strlen应该没错,但是直接就卡在p1=(u8*)sim900a_check_cmd("+CMTI:");想不通,实在想不通。
一周热门 更多>