lwking412 发表于 2008-8-26 01:00:50

单片机连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了

单片机128连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了短信?并知道短信序号从而成功读取呢》?
我知道用at+cnmi可以设置短消息提示方式,但是如果是超级终端,短信来了,可以看见提示的是哪一条,从而可以立刻读取
但是对于单片机,即时短信来了,我们也不知道是第几条啊,从而不知道该怎么读取,从不能从序号1一直读到末尾巴,很困惑,请大家赐教!不胜感激!
ps:实在是没经验,也没做过这东西,所以现在急死了,看了1个星期!

通常手机发短信给模块,超级终端   会提示+CMTI:“SM”,X(X表示接收短消息的SIM卡存储号码)
但是换成单片机,如何让单片机明白x是多少呢》从而正常读取!

Appcat 发表于 2008-8-26 01:10:30

既然超级终端能收到+CMTI:“SM”,X ,那么接到单片机上时,单片机串口一样会收到的,只要在单片机程序里边解析这个字符串
获得X不就可以了吗?

mljda 发表于 2008-8-26 08:01:24

判断串口接受的值ASCII吗是x=‘x’

marker 发表于 2008-8-26 10:04:47

这样可能会丢短信的,我的做法是一直读下去,到出出ERROR 321为止。

cock 发表于 2008-8-26 10:05:17

两种以上方法:
用读短信列表查
设置为收到短信主动发话通知

n0831 发表于 2008-8-26 10:31:56

/*
我贴一段处理的代码:
使用的Freescale的9SO8AW16.
*/
//短信索引结构
typedef struct{
unsigned char In_Dex;// 短信索引
unsigned char Mess_len ;//索引长度

} MESSAGE_t;

//短信内容结构
typedef struct{
unsigned char M_state;      // 信息状态,1未读,0已读
unsigned char Sender ;   //发信息者号码 e:<+8613934240439>
unsigned char M_DATA ;//时间         e:<08/08/07,10:06:03>
unsigned char M_main ; //信息内容      30字符,多余的舍去.
unsigned char M_Length;   //信息长度

} Message_xinxi_t;

volatile static unsigned char UART1_RX_state = 0X00;//串口1接收状态机
volatile static unsigned char RX1_counter = 0;//串口1接收辅助记数
volatile static unsigned char RX1_BUF = 0; //串口1接收缓冲区
MESSAGE_t Message ={{0},0};
Message_xinxi_t M_XinXi ={0,{0},{0},{0}};
/*****************串口1接收中断*************************************/
interrupt 17 voidSCI1_RE(void) {
    unsigned char buff1 = 0;
    unsigned char k = 0;
    while(!SCI1S1_RDRF);
         buff1 = SCI1D;
   // SCI1_putchar(buff1);
//#define DEBUG_RXGPS0
   switch(UART1_RX_state)
{

case 0x00 : RX1_BUF = SCI1D;    //引导同步头
            
             switch(RX1_counter)
             {
            case 0 :if(RX1_BUF != '+')
                         RX1_counter = 0;
                        else
                         RX1_counter++;
                        break;
            case 1 :if(RX1_BUF != 'C')
                        RX1_counter = 0;
                        else
                         RX1_counter++;
                         break;
            case 2 :if(RX1_BUF != 'M')
                        RX1_counter = 0;
                        else
                         RX1_counter++;
                         break;
            case 3 :if(RX1_BUF != 'T')
                        RX1_counter = 0;
                        else
                         RX1_counter++;
                         break;
            case 4 :if(RX1_BUF != 'I')
                        RX1_counter = 0;
                        else
                         RX1_counter++;
                         break;
            case 5 :if(RX1_BUF != ':')
                        RX1_counter = 0;
                        else
                         RX1_counter++;
                         break;
            case 6 :if(RX1_BUF != ' ')
                        RX1_counter = 0;
                        else
                        {
                        RX1_counter = 0;
                        UART1_RX_state = 0x11;
                        }
                        break;
            default :break;
            
             }
         
            
          //////////////////////////////////////////////////////////////////////////////////////////////

             #ifdef DEBUG_RXGPS0
             SCI1_putchar('A');
         #endif
      
         
         break;
case 0x11 : RX1_BUF = SCI1D;    //"SM",
             RX1_counter++;
             if((RX1_counter > 4) &&(RX1_BUF == ','))
            {
               RX1_counter = 0;
         
               if((RX1_BUF == 'S') && (RX1_BUF == 'M'))
                {
                   UART1_RX_state = 0x12;
         
                }
               else
                {
                  UART1_RX_state = 0;
                }
         
             }
               
             #ifdef DEBUG_RXGPS0
             SCI1_putchar('B');
         #endif
         break;
case 0x12 : RX1_BUF = SCI1D;    //信息索引
            RX1_counter++;
             if((RX1_counter > 0) &&(RX1_BUF == 0X0A))
            {
               for(k = 0;k < RX1_counter-2;k++)
                Message.In_Dex = RX1_BUF;
                Message.Mess_len = RX1_counter-2;
             // Debug_puts(Message.In_Dex,Message.Mess_len);//输出字符串
                OFF_SCI1_RXF;   //关闭接收短信
                OFF_SCI2_RXF;   //关闭GPS
                NEW_Message_Flag = 1;
                RX1_counter = 0;
                UART1_RX_state = 0x00;
             }
               
             #ifdef DEBUG_RXGPS0
             SCI1_putchar('C');
         #endif
         break;
default :break;
}

}
//根据索引读取消息内容
unsigned char Read_Message(MESSAGE_t* P_index,Message_xinxi_t* P_xinxi) //读消息
{

unsigned char k = 0;
unsigned char BUF = {0};
String_Send((unsigned char*)CMGR,8);
String_Send(P_index->In_Dex,P_index->Mess_len);
String_Send((unsigned char*)CR_LF,2);
for(k = 1;;k++) //接收回显
{
   BUF = GSM_getchar();
   if((BUF ==0X0A) && (BUF ==0X0D))
   break;
}

k = 0;
do //接收响应信息      
    {
    BUF = GSM_getchar();
    k++;
    if((BUF =='E') && (BUF =='R'))
   return 0;
    }while(BUF != ',');
   
   if(BUF == 'U')
      P_xinxi->M_state = 1;
   else
      P_xinxi->M_state = 0;
   
    k = 0;
    do //接收响应信息--发送方手机号码      
    {
    BUF = GSM_getchar();
    k++;
   // if((BUF !='"') || (BUF =='"'))
   //return 0;
    }while(BUF != ',');
   
    for(k = 0;k < 14;k++)
      P_xinxi->Sender = BUF;
   
    k = 0;
   do //接收响应信息 --,分割符   
    {
    BUF = GSM_getchar();
    k++;
    }while(BUF != ',');
   
   
   k = 0;
    do //接收响应信息--时间信息
    {
    BUF = GSM_getchar();
    k++;
   
    //if((BUF !='"') || (BUF !='"'))
    // return 0;
    }while(BUF != '+');
   
    for(k = 0;k < 17;k++)
      P_xinxi->M_DATA = BUF;
   
    k = 0;
   for(k = 0;;k++) //接收回显
{
   BUF = GSM_getchar();
   if((BUF ==0X0A) && (BUF ==0X0D))
   break;
}
    k = 0;
    do //接收响应信息      
    {
    P_xinxi->M_main = GSM_getchar();
    k++;
    if(k>sizeof(P_xinxi->M_main))
   break;
    }while(P_xinxi->M_main != 0x0A);
   
    P_xinxi->M_Length = k-2;
    return 1;

}

zc3909 发表于 2008-8-27 00:06:55

AT+CMGF=0
AT+CNMI=2,2,0,0,0
SIM300适用

lwking412 发表于 2008-8-31 07:56:07

谢谢楼上几位,前几天回家了,今天开始复工,继续做。。。5楼的程序有些复杂,但是对我受益匪浅,我觉得可能是我的中断程序太简单了!

void __attribute((signal))   __vector_18(void)
{
{os_atomic_t _nesc_atomic = os_atomic_start();
   
   
      
   {
switch((char)UDR0)
{    case'X':
          control_node1();
break;
          case'Y':
      control_node2();
break;
      case'Z':
      control_node3();//control_node3()为中断处理函数
break;
       }
       }
               os_atomic_end(_nesc_atomic);
         
   }
}

lwking412 发表于 2008-8-31 08:37:49

case 0x00 : RX1_BUF = SCI1D;    //引导同步头
想问下引导同步头什么意思,我编程基础很差

zc3909 发表于 2008-8-31 23:25:00

我看楼主的通信还是没有搞定呀,先把通信搞好,这个可是实现功能的基础

lwking412 发表于 2008-9-1 17:19:29

你好,不知道可以向你请教么!

n0831 发表于 2008-9-1 18:11:31

+CMTI:“SM”,X ,

这个是新短信的提示呀.
case 0x00 : RX1_BUF = SCI1D;    //引导同步头


在这个case里就是接收 +CMTI: 这个字段了

lwking412 发表于 2008-9-7 16:27:27

已经成功了,谢谢楼上

tatagui 发表于 2008-11-6 14:48:27

我遇到的问题和楼主有些相似,能否请教楼主些问题呢?

bxs19830629 发表于 2009-3-31 09:12:46

标记

zachary0101 发表于 2010-10-28 12:55:36

MARK

jckj 发表于 2010-10-28 19:52:54

走过

hanhuliang 发表于 2010-11-14 17:49:37

mark

huguang0218 发表于 2011-7-28 15:28:53

MARK

comway 发表于 2011-7-28 22:20:11

用扩展指令模块,可以直接输出GBK码短信内容,你只要监听串口就行了

longtanshan 发表于 2011-9-20 14:35:58

mark

zhaanm 发表于 2011-12-31 16:52:59

mark

sweet_146 发表于 2012-2-27 10:10:50

zspzwal 发表于 2012-3-8 18:23:12

mark

huaohui666666 发表于 2012-6-1 13:35:32

好好学习啦,MARK

52168 发表于 2012-6-9 16:56:18

MARK关注中

32MCU 发表于 2012-6-10 08:23:36

关注中。标记!

Julius20110 发表于 2012-11-3 20:02:39

{:loveliness:}楼主和强大   用的数据结构很到位

efree 发表于 2013-10-18 15:47:43

mark , 这个要好好学习一下。

mandey 发表于 2013-10-18 15:49:06

一般上设置上动上报就行了。

csb1030 发表于 2013-10-18 16:11:27

短信可以查中断,有短信会有一个20ms的低电平在ring管脚,也可以查串口信息,有短信会有+CM:xxxx

chianz1 发表于 2013-11-1 19:29:45

标记下,一定用得到

xjsok2007 发表于 2014-3-29 20:02:00

学习,ing
页: [1]
查看完整版本: 单片机连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了