OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8920|回复: 9

SIM900A的问题

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2013-11-12
在线时间
0 小时
发表于 2015-5-12 16:59:21 | 显示全部楼层 |阅读模式
5金钱
大家好,在网上买了一个SIM900A模块,想让他收到一条短信后自动回复,我设定收到的短信是第十一条,一旦收到第十一条短信,自动回复给对方一条短信,然后再将第十一条短信删除,如此循环。但是,问题就出来了,我调用 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)这个函数,但是SIM900A模块收到短信后,会自动生成一条语句+CMTI: "SM",11(假如收到的是第十一条短信),不需要发送命令,不知道我这样用对吗sim900a_send_cmd(NULL,"+CMTI: \"SM\",11",200)。还有就是,我在sim900a.c里面定义了一个全局变量u8 pnum[14]用于储存电话号码,这样定义不知道对不对?弄好了这些,我向SIM900A发送一条短信,但是收不到回复,弄了半天也不知道问题在哪里,求指教。
u8 pnum[14];   //存储电话号码

//向sim900a发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0; 
USART3_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次数据发送完成  
USART3->DR=(u32)cmd;
}else u3_printf("%s\r\n",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据 
USART3_RX_STA=0;

}
if(waittime==0)res=1; 
}
return res;


u8 sim900a_sms_read_test(void)

u8 *p,*p1,*p2,*tmpp;
u8 timex=0,i=0;
u8 msgindex[3];
u8 msglen=0;
u8 msgmaxnum=0; //短信最大条数
u8 key=0;
u8 smsreadsta=0; //是否在短信显示状态

u8 sec[4]="seco";     //用于存储将要发送什么样的雨量测试
u8 min[4]="minu";
u8 date[4]="date";
u8 hour[4]="hour";

u8 pcon[4];//存储电话号码跟短信内容
p=mymalloc(SRAMIN,200);//申请200个字节的内存 
while(1)
{
sprintf((char*)p,"AT+CMGR=%s",msgindex);
if(sim900a_send_cmd(p,"+CMGR:",200)==0)//读取短信
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+2),"\"");
p2[0]=0;//加入结束符
sim900a_unigbk_exchange(p1+2,p,0); //将unicode字符转换为gbk码 
tmpp=p;
for(i=0;i<14;i++)
{
pnum=*p;
p++;
}
p=tmpp;
p1=(u8*)strstr((const char*)(p2+1),"/");
p2=(u8*)strstr((const char*)(p1),"+");
p2[0]=0;//加入结束符
p1=(u8*)strstr((const char*)(p2+1),"\r"); //寻找回车符
sim900a_unigbk_exchange(p1+2,p,0); //将unicode字符转换为gbk码
tmpp=p;
for(i=0;i<4;i++)
{
pcon=*p;
p++;
}
p=tmpp;
smsreadsta=1; //标记有显示短信内容 
}
USART3_RX_STA=0;
if(timex==0) //2.5秒左右更新一次
{
if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0) //查询优选消息存储器

p1=(u8*)strstr((const char*)(USART3_RX_BUF),","); 
p2=(u8*)strstr((const char*)(p1+1),",");
p2[0]='/'; 
USART3_RX_STA=0;
}
}
if((timex%20)==0)LED0=!LED0;//200ms闪烁 
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据 
myfree(SRAMIN,p); 

if(strcmp(sec,pcon)==0)
return 1;
else if(strcmp(min,pcon)==0)
return 2;
else if(strcmp(hour,pcon)==0)
return 3;
  else if(strcmp(date,pcon)==0)
return 4;
else return 0;

}
}
//测试短信发送内容(70个字[UCS2的时候,1个字符/数字都算1个字])
const u8* sim900a_test_msg="你好,这是一条测试短信";
//SIM900A发短信测试 
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[14],i=0; //号码缓存
u8 pohnenumlen=0; //号码长度,最大15个数 
u8 timex=0;
u8 key=0;
u8 smssendsta=0; //短信发送状态,0,等待发送;1,发送失败;2,发送成功 
p=mymalloc(SRAMIN,100); //申请100个字节的内存,用于存放电话号码的unicode字符串
p1=mymalloc(SRAMIN,300);//申请300个字节的内存,用于存放短信的unicode字符串
p2=mymalloc(SRAMIN,100);//申请100个字节的内存 存放:AT+CMGS=p1 
while(1)
{
for(i=0;i<14;i++)
phonebuf=pnum;
smssendsta=1;  
sim900a_unigbk_exchange(phonebuf,p,1); //将电话号码转换为unicode字符串
sim900a_unigbk_exchange((u8*)sim900a_test_msg,p1,1);//将短信内容转换为unicode字符串.
sprintf((char*)p2,"AT+CMGS=\"%s\"",p); 
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{  
u3_printf("%s",p1); //发送短信内容到GSM模块 
  if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
}  
phonebuf[pohnenumlen]=0; 
if((timex%20)==0)LED0=!LED0;//200ms闪烁 
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据 
}
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2); 


u8 sim900a_sms_test(void)
{
u8 key;
u8 timex=0;
if(sim900a_send_cmd("AT+CMGF=1","OK",200))return 1; //设置文本模式 
if(sim900a_send_cmd("AT+CSCS=\"UCS2\"","OK",200))return 2; //设置TE字符集为UCS2 
if(sim900a_send_cmd("AT+CSMP=17,0,2,25","OK",200))return 3; //设置短消息文本模式参数 
while(1)
{
if(sim900a_send_cmd(NULL,"+CMTI: \"SM\",11",200)==0)

sim900a_sms_read_test();
delay_ms(5);
sim900a_sms_send_test();
delay_ms(5);
timex=0;
sim900a_send_cmd("AT+CMGD=11","OK",200);
}
timex++;
if(timex==20)
{
timex=0;
LED0=!LED0;
}
delay_ms(10);

sim900a_send_cmd("AT+CSCS=\"GSM\"","OK",200); //设置默认的GSM 7位缺省字符集
return 0;


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2015-5-12 17:04:04 | 显示全部楼层
void sim900a_test(void)
{
u8 key=0; 
u8 timex=0;
u8 sim_ready=0;
sim900a_send_cmd("AT","OK",100);
key+=sim900a_send_cmd("ATE0","OK",200);//不回显

while(1)
{
delay_ms(10); 
if(sim_ready)//SIM卡就绪.
{
sim900a_sms_test(); //短信测试
timex=0;
}
if(timex==0) //2.5秒左右更新一次
{
if(sim900a_gsminfo_show(40,225)==0)sim_ready=1;
else sim_ready=0;
}
if((timex%20)==0)LED0=!LED0;//200ms闪烁 
timex++;  

}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-5-12 22:38:12 | 显示全部楼层
这么判断也是可以的,不过这只是表示短信存储在位置11,而不是代表有11条短信。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2015-5-12 23:33:25 | 显示全部楼层
回复【3楼】
原子哥,我知道,但是每当我的SIM900A模块收到短信后,他不自动回复短信啊,这是什么原因,是我的电话号码读取不对吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-5-12 23:45:47 | 显示全部楼层
回复【4楼】菜鸟级别:
---------------------------------
短信箱满了,就不会回复。你看看是不是满了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2015-5-13 15:00:37 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
不是,没有满,现在只差一点点了,就是下面的函数中
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{       
u3_printf("%s",p1);  //发送短信内容到GSM模块 
  if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
LED1=0;

这一段怎么不执行啊?试过很多种方法,就是不行。


u8 pnum[14];   //存储电话号码

//sim900a发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//    其他,期待应答结果的位置(str的位置)
u8* sim900a_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000) //接收到一次数据了

USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);

return (u8*)strx;
}
//向sim900a发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0; 
USART3_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次数据发送完成  
USART3->DR=(u32)cmd;
}else u3_printf("%s\r\n",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据 
USART3_RX_STA=0;

}
if(waittime==0)res=1; 
}
return res;
}

const u8* sim900a_test_msg="你好,小廖用,在一个.C文件里面能定义全局数组变量吗?";
//SIM900A发短信测试 
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[11],i=0;  //号码缓存
u8 pohnenumlen=0; //号码长度,最大15个数 
u8 timex=0;
u8 key=0;
u8 smssendsta=0; //短信发送状态,0,等待发送;1,发送失败;2,发送成功 
p=mymalloc(SRAMIN,100); //申请100个字节的内存,用于存放电话号码的unicode字符串
p1=mymalloc(SRAMIN,300);//申请300个字节的内存,用于存放短信的unicode字符串
p2=mymalloc(SRAMIN,100);//申请100个字节的内存 存放:AT+CMGS=p1 
for(i=0;i<11;i++)
phonebuf=pnum[i+3];
smssendsta=1;  
// sim900a_unigbk_exchange(phonebuf,p,1); //将电话号码转换为unicode字符串
sim900a_unigbk_exchange((u8*)sim900a_test_msg,p1,1);//将短信内容转换为unicode字符串.
sprintf((char*)p2,"AT+CMGS=\"%s\"",phonebuf); 
Show_Str(25,290,200,16,p2,16,0);
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{       
u3_printf("%s",p1);  //发送短信内容到GSM模块 
  if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
LED1=0;

else
{
LED0=0;
}
// USART3_RX_STA=0;
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2); 
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-5-13 23:00:44 | 显示全部楼层
回复【6楼】菜鸟级别:
---------------------------------
慢慢调试下吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-7-25
在线时间
28 小时
发表于 2015-7-29 16:06:21 | 显示全部楼层
回复【6楼】菜鸟级别:
---------------------------------
你sim900a的程序调好了吗?想问一下怎么调的,我也和你遇到同样的问题,发送短信函数只要放在if语句中就发送失败,从if语句移出来,就能发送成功。你是怎么解决的,能否分享一下。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-7-28
在线时间
0 小时
发表于 2015-7-30 12:50:31 | 显示全部楼层
同问啊,楼主实现收到短信自动回复了吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-12-3
在线时间
0 小时
发表于 2015-12-3 18:45:05 | 显示全部楼层
我用python脚本做了一下,还是蛮方便的.准备移植到树莓派上去...
 #!/usr/bin/env python
#coding:utf8
'''
这是用来发报警电话的脚本
'''

'''
导入库
'''
import serial
import time

#定义串口信息
ser=serial.Serial('/dev/ttyUSB0',9600,timeout=1)
#刷新数据,初始化
ser.flush()
#拨打电话,电话目前固定,后面测试一下电话表.
ser.write('ATD18343281790;\r')
#等待接听的时间,30秒后无人接听就挂断电话.
time.sleep(30)
#挂断电话
ser.write('ATH\r')
#关闭串口
ser.close()
骑驴玩儿漂移
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表