用stm32控制SIM900a发短信
时间:10-02
整理:3721RD
点击:
想用stm32控制SIM模块发短信,先进行了几个测试,用sim900a_send_cmd()函数,发送了"AT"、"AT+CPIN?"、"AT+CGMI"指令均返回ok,所以说明32可以与SIM模块通讯,按照正点原子的例程修改了一下,但是,这个发送短信的指令一直没有收到想要的结果
//测试短信发送内容(70个字[UCS2的时候,1个字符/数字都算1个字])
const u8* sim900a_test_msg="您好,这是一条测试短信,由ATK-SIM900A GSM模块发送";
//SIM900A发短信测试
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[20]="15527608108"; //号码缓存
u8 timex=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)
{
if(smssendsta)
{
smssendsta=0;
Show_Str(30+40,70,170,90,"等待发送",16,0);//显示状态
}
delay_ms(10);
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("AT","OK",100)==0)LED2=0;
// if(sim900a_send_cmd("AT+CPIN?","OK",200)==0) LED2=0;
// if(sim900a_send_cmd("AT+CGMI","OK",200)==0) LED2=0;
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{
LED2=0;
u2_printf("%s",p1); //发送短信内容到GSM模块
delay_ms(90); //必须延时,否则 不能发送短信
if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
}
USART2_RX_STA=0;
break;
}
if((timex%20)==0)LED3=!LED3;//200ms闪烁
timex++;
delay_ms(10);
if(USART2_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2);
}
就是那行红色的指令一直未显示发送成功,,我使用LED来判断if里面的条件成不成立,LED灯没有反应。
有大神知道可能的原因吗,发一些基本指令会返回ok,所以说明SIM卡可以检测到的。
求指点。
//测试短信发送内容(70个字[UCS2的时候,1个字符/数字都算1个字])
const u8* sim900a_test_msg="您好,这是一条测试短信,由ATK-SIM900A GSM模块发送";
//SIM900A发短信测试
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[20]="15527608108"; //号码缓存
u8 timex=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)
{
if(smssendsta)
{
smssendsta=0;
Show_Str(30+40,70,170,90,"等待发送",16,0);//显示状态
}
delay_ms(10);
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("AT","OK",100)==0)LED2=0;
// if(sim900a_send_cmd("AT+CPIN?","OK",200)==0) LED2=0;
// if(sim900a_send_cmd("AT+CGMI","OK",200)==0) LED2=0;
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{
LED2=0;
u2_printf("%s",p1); //发送短信内容到GSM模块
delay_ms(90); //必须延时,否则 不能发送短信
if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
}
USART2_RX_STA=0;
break;
}
if((timex%20)==0)LED3=!LED3;//200ms闪烁
timex++;
delay_ms(10);
if(USART2_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2);
}
就是那行红色的指令一直未显示发送成功,,我使用LED来判断if里面的条件成不成立,LED灯没有反应。
有大神知道可能的原因吗,发一些基本指令会返回ok,所以说明SIM卡可以检测到的。
求指点。
求指点
感谢party感谢人民感谢电子发烧友,程序终于调好了!
要加0x1A结束的吧
if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;/ 这里加了哦,是因为前面一些指令的原因
你可以看看合方圆的GU906和GU900E模块
暑假了,想学习FPGA的同学们,可以利用暑假期间好好学习下FPGA,我们现在有款初学者的FPGA开发板利器,现在购买还有配套书籍赠送哦:
入门FPGA开发板:
https://item.taobao.com/item.htm ... &id=35911884243
赠送完全配套书籍:
https://item.taobao.com/item.htm ... amp;id=540865636294
有一定基础的同学,可以看下高端的开发板:
https://item.taobao.com/item.htm ... amp;id=520588767908
如果以上两款依然满足不了您的需求,更可以看下更高端的开发板:
https://item.taobao.com/item.htm ... &id=39939126777
有任何问题,欢迎旺旺 QQ来咨询哦!