OpenEdv-开源电子网

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

原子哥的SIM900A 短信读取程序的解读!

[复制链接]

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
发表于 2016-7-29 09:41:06 | 显示全部楼层 |阅读模式
1金钱
以下是源代码,怎么获取的未读短信条数?怎么准确的读取某一条短信?
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//短信测试部分代码

//SIM900A读短信测试
void sim900a_sms_read_test(void)
{
        u8 *p,*p1,*p2;
        u8 timex=0;
        u8 msgindex[3];
        u8 msglen=0;
        u8 msgmaxnum=0;                //短信最大条数
        u8 key=0;
        u8 smsreadsta=0;        //是否在短信显示状态
        p=mymalloc(200);//申请200个字节的内存
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        Show_Str_Mid(0,30,"ATK-SIM900A 读短信测试",16,240);                                             
        Show_Str(30,50,200,16,"读取:     总信息:",16,0);        
        kbd_fn_tbl[0]="读取";
        kbd_fn_tbl[1]="返回";
        sim900a_load_keyboard(0,180,(u8**)kbd_tbl1);//显示键盘  
        while(1)
        {
                key=sim900a_get_keynum(0,180);
                key=14;
                if(key)
                {  
                        if(smsreadsta)
                        {
                                LCD_Fill(30,75,239,179,WHITE);//清除显示的短信内容
                                smsreadsta=0;
                        }
                        if(key<10||key==11)
                        {
                                if(msglen<2)
                                {
                                        msgindex[msglen++]=kbd_tbl[key-1][0];
                                        u2_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
                                }
                                if(msglen==2)
                                {
                                        key=(msgindex[0]-'0')*10+msgindex[1]-'0';
                                        if(key>msgmaxnum)
                                        {
                                                msgindex[0]=msgmaxnum/10+'0';
                                                msgindex[1]=msgmaxnum%10+'0';                                       
                                        }
                                }
                        }else
                        {
                                if(key==13)if(msglen)msglen--;//删除  
                                if(key==14&&msglen)//执行读取短信
                                {
                                        LCD_Fill(30,75,239,179,WHITE);//清除之前的显示                    
                                        sprintf((char*)p,"AT+CMGR=%s",msgindex);
                                        if(sim900a_send_cmd(p,"+CMGR:",200)==0)//读取短信
                                        {
                                                POINT_COLOR=RED;
                                                Show_Str(30,75,200,12,"状态:",12,0);
                                                Show_Str(30+75,75,200,12,"来自:",12,0);
                                                Show_Str(30,90,200,12,"接收时间:",12,0);
                                                Show_Str(30,105,200,12,"内容:",12,0);
                                                POINT_COLOR=BLUE;
                                                if(strstr((const char*)(USART2_RX_BUF),"UNREAD")==0)Show_Str(30+30,75,200,12,"已读",12,0);
                                                else Show_Str(30+30,75,200,12,"未读",12,0);
                                                p1=(u8*)strstr((const char*)(USART2_RX_BUF),",");
                                                p2=(u8*)strstr((const char*)(p1+2),"\"");
                                                p2[0]=0;//加入结束符
                                                sim900a_unigbk_exchange(p1+2,p,0);                        //将unicode字符转换为gbk码
                                                Show_Str(30+75+30,75,200,12,p,12,0);                //显示电话号码
                                                p1=(u8*)strstr((const char*)(p2+1),"/");
                                                p2=(u8*)strstr((const char*)(p1),"+");
                                                p2[0]=0;//加入结束符
                                                Show_Str(30+54,90,200,12,p1-2,12,0);                //显示接收时间  
                                                p1=(u8*)strstr((const char*)(p2+1),"\r");        //寻找回车符
                                                sim900a_unigbk_exchange(p1+2,p,0);                        //将unicode字符转换为gbk码
                                                Show_Str(30+30,105,180,75,p,12,0);                        //显示短信内容
                                                smsreadsta=1;                                                                //标记有显示短信内容
                                        }else
                                        {
                                                Show_Str(30,75,200,12,"无短信内容!!!请检查!!",12,0);
                                                delay_ms(1000);
                                                LCD_Fill(30,75,239,75+12,WHITE);//清除显示
                                        }          
                                        USART2_RX_STA=0;
                                }
                                if(key==15)break;
                        }
                        msgindex[msglen]=0;
                        LCD_Fill(30+40,50,86,50+16,WHITE);
                        Show_Str(30+40,50,86,16,msgindex,16,0);         
                }
                if(timex==0)                //2.5秒左右更新一次
                {
                        if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0)        //查询优选消息存储器
                        {
                                p1=(u8*)strstr((const char*)(USART2_RX_BUF),",");
                                p2=(u8*)strstr((const char*)(p1+1),",");
                                p2[0]='/';
                                if(p2[3]==',')//小于64K SIM卡,最多存储几十条短信
                                {
                                        msgmaxnum=(p2[1]-'0')*10+p2[2]-'0';                //获取最大存储短信条数
                                        p2[3]=0;
                                }else //如果是64K SIM卡,则能存储100条以上的信息
                                {
                                        msgmaxnum=(p2[1]-'0')*100+(p2[2]-'0')*10+p2[3]-'0';//获取最大存储短信条数
                                        p2[4]=0;
                                }
                                sprintf((char*)p,"%s",p1+1);
                                Show_Str(30+17*8,50,200,16,p,16,0);
                                USART2_RX_STA=0;               
                        }
                }       
                if((timex%20)==0)LED0=!LED0;//200ms闪烁
                timex++;
                delay_ms(10);
                if(USART2_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
        }
        myfree(p);
}


最佳答案

查看完整内容[请看2#楼]

楼主学会看代码,就不用这样了....非常简单的东西. if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0) //查询优选消息存储器 这句就是用来读取短信总数的.另外,自己要多看看AT指令表.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-29 09:41:07 | 显示全部楼层
楼主学会看代码,就不用这样了....非常简单的东西.  if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0)        //查询优选消息存储器                      这句就是用来读取短信总数的.另外,自己要多看看AT指令表.
回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2016-7-29 09:42:59 | 显示全部楼层
在线等!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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