3415|5

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为什么 单片机收到小灵通或10086这类的 短信死机 [复制链接]

单片机选用的 MSP430,利用SIM300模块实现短信控制功能,手机收发短信一切功能正常,但奇怪的 是单片机收到小灵通或10086这类的短信就会死机,因为里面设计的就是手机与手机发短信,但 死机确实是 个大隐患,下面是 我 的 串口中断函数
while((IFG1&UTXIFG0)==0);
      *RX_bit=RXBUF0;
      if(flag_sending)
                  {
                         flag_sending1=1;
                          flag_sending2=1;                 
                         }
        //是否有新消息到达0D91(48 68 57 49) ,决定合适开始截取消息内容,现在截取的是0D91后面的部分86 13098870434F+其它
                else if(flag_newmess)
                        {
                               
                                  flag_measuring=0;
                                if(*RX_bit==48)
                                {
                             flag_receiving1=1;
                                }
                        else
                                {
                                if(*RX_bit==68&&flag_receiving1==1)
                               
                                        flag_receiving2=1;
                                else if(*RX_bit==57&&flag_receiving1==1&&flag_receiving2==1)
                                        flag_receiving3=1;
                                else if(*RX_bit==49&&flag_receiving1==1&&flag_receiving2==1&&flag_receiving3==1)
                                        {
                                        RX_bit=RX_action-1;//截取0D91后面的 内容存入RX_action[]
                                      flag_receiving=1;
                                       flag_newmess=0;
                                        }
                                else
                                        {
                                        flag_receiving1=0;
                                       flag_receiving2=0;
                                        flag_receiving3=0;
                                        }
                                }
                        }
        else if(flag_receiving)
                {
              diskeyint();
                counter_action++;
                if(counter_action>60)
                        {
                        Action_judge();
                        enkeyint();
                        }
                else
                        {
                        flag_measuring=1;
                        flag_display=0;
                        }
                }
       
        else
                {
                 if(*RX_bit==77)
                         {
                         if(flag_newmess1&&flag_newmess2)
                                {
                                 Action_newmess();
                                }
                         }
                 
                 else if(*RX_bit==83)
                         {
                         if(flag_newmess1)
                                flag_newmess2=1;
                       
                         }
                 
                 else if(*RX_bit==34)
                         flag_newmess1=1;
                 else
                         {
                         flag_newmess1=0;
                    flag_newmess1=0;
                         }
                }
               
      RX_bit++;
现在发现问题也许出现在0D91这个地方,因为小灵通的 短信这里不是0D91而是0D81

小灵通格式的短信分析,以下是小灵通短信的格式例子:
08 91 683108301705F0 24 0F A1 01067361083658F9 00 08 60106051158423 08 77ED4FE16D4B8BD5
手机
08 91 683108200505F0 84 0D 91 683172979237F2   00 08 70102180635480 0C 547D4EE48BBE590781EA68C0
     08表示随后的服务中心的号码是8位(两个字符表示1位),91表示是国际编码标准(81为国内),683108301705F0为服务中心的号码,利用两位倒置法为:8613800371500, 字符F是为了保存号码是偶数个而增加的多余字符,转换后去掉。
     24表示SMS_DELIVER的第一个8位。
     0F表示发送者的手机号的长度(0F为15位)。
     A1表示发送号码的地址类型。
     01067361083658F9共计16位为发送者的手机号,因为发送者的手机号长度为15所以补F。转换后要去掉,利用二位倒置法转换后为106037168063859。
     00表示TP-PID.协议标识 。
     08表示TP-DCS 编码方式。该处为8位bit方式。
     60106051158423表示时间戳,转换后为:06年01月06日15时51分48秒,23为时区。
     08表示用户发送短信内容的长度。
     77ED4FE16D4B8BD5表示短信内容,采用两个字符表示一个单位。
请 高人指点一下,死机的原因大概在哪里?程序上有时没好的改进方法没有,谢谢大家了!

最新回复

到过来处理   详情 回复 发表于 2007-12-21 16:06
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我想死机的原因不在于消息的内容,而在于处理消息的方法。
可能是接收到消息之后的处理方法不当导致的死机
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
    while((IFG1&UTXIFG0)==0);

    *RX_bit=RXBUF0;
    if(flag_sending)
    {
        flag_sending1=1;
        flag_sending2=1;
    }//是否有新消息到达0D91(48   68   57   49)   ,决定合适开始截取消息内容,现在截取的是0D91后面的部分86   13098870434F+其它
    else   if(flag_newmess)
           {
               flag_measuring=0;
               if(*RX_bit==48)
               {
                   flag_receiving1=1;
               }
               else
               {
                   if(*RX_bit==68&&flag_receiving1==1)
                       flag_receiving2=1;
                   else    if(*RX_bit==57&&flag_receiving1==1&&flag_receiving2==1)
                              flag_receiving3=1;
                           else   if(*RX_bit==49&&flag_receiving1==1&&flag_receiving2==1&&flag_receiving3==1)
                                  {
                                      RX_bit=RX_action-1;//截取0D91后面的   内容存入RX_action[]
                                      flag_receiving=1;
                                      flag_newmess=0;
                                  }
                                  else
                                  {
                                       flag_receiving1=0;
                                       flag_receiving2=0;
                                       flag_receiving3=0;
                                  }
               }
           }
           else    if(flag_receiving)
                   {
                       diskeyint();
                       counter_action++;
                       if(counter_action> 60)
                       {
                           Action_judge();
                           enkeyint();
                       }
                       else
                       {
                           flag_measuring=1;
                           flag_display=0;
                       }
                   }
                   else
                   {
                       if(*RX_bit==77)
                       {
                           if(flag_newmess1&&flag_newmess2)
                           {
                               Action_newmess();
                           }
                       }
                       else    if(*RX_bit==83)
                               {
                                   if(flag_newmess1)
                                       flag_newmess2=1;
                               }
                               else    if(*RX_bit==34)
                                           flag_newmess1=1;
                                       else
                                       {
                                           flag_newmess1=0;
                                           flag_newmess1=0;
                                       }
                   }
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
整理了一下

好像感觉是这个问题

这个应该是你用来取消息的状态机...

你的MCU没有死,而是没有做小灵通或是其它特殊号码短信的处理

机器在你的状态机里瞎转悠吧?

呵呵

用个switch分支来处理这个消息吧

另,我觉得在表达状态机这类的东西的时候,switch比IF-ELSE更帅
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
其实现在知道问题就出在这里,只是没有什么没好的方法,除了手机号码之外的短信在0D91这里都是不一样的,是一种未知的状态,从0891截取不 知道 行不 行,因为 我 不是原始设计者,只是一个 问题 的 解决者,项目比较急。没办法
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
到过来处理

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表