打印

dsPIC30f6014与MC39I的通信问题

[复制链接]
1872|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qfyangfu|  楼主 | 2011-11-21 07:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚开始用PIC单片机。下面是我用PIC单片机编写的单片机读一条短信控制LED的代码。但未能成功。麻烦高手们帮我看看哪出错了?
沙发
qfyangfu|  楼主 | 2011-11-21 07:57 | 只看该作者
#include<p30f6014.h>
#include<string.h>
#include <ctype.h>
#include "ceshi.h"
_FOSC(0x0ffe5);                 //XT振荡,4倍频晶振.
_FWDT(WDT_OFF);                 //关闭看门狗定时器
_FBORPOR(PBOR_OFF & MCLR_EN);   //掉电复位禁止,MCLR复位使能。
_FGS(CODE_PROT_OFF);            //代码保护禁止
#define uchar unsigned char
#define uint unsigned int
#define MAX_TM   100
#define MAX_T    35
uchar uart_buff[MAX_TM];
uchar receive_count;
uchar para_temp[MAX_TM];
uchar read_tmp;
uchar sms_num_tmp;
uchar sms_tmp;
uchar TEL_temp[15];
//---定时用-------------
uint timercount;
uchar timer_1S_cnt;
uchar timer_10S_cnt;
uchar timer_S_cnt;
//----------------
//----延时函数----------
void dmsec(unsigned int count)
{
        while(count)
        {
                unsigned int i=100;
                while(i>0)i--;
                count--;
        }       
}
//--定时器中断服务程序-----------------
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
        IFS0bits.T1IF=0;                     
           timer_1S_cnt++;   
           timercount++;
           if(timer_1S_cnt==50)    //20×50=1000MS  =1S
    {
            timer_10S_cnt++; timer_1S_cnt=0;
              timer_S_cnt++;
    }                              //1秒=1000毫秒
    if(timer_10S_cnt==60)   //60S
    {
           timer_10S_cnt=0;
        }

}
//--串口中断服务程序------------------
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
        //U1STAbits.UTXEN =0;             //允许发送
        receive_count=0;
        if(IFS0bits.U1RXIF)
        {
                IFS0bits.U1RXIF=0;
                while(!U1STAbits.URXDA);
                {
               
                                uart_buff[receive_count]=U1RXREG;
                                U2TXREG=uart_buff[receive_count];
                }
       

        }
       
        else
{
                return;
        }
                //U1STAbits.UTXEN =1;             //允许发送       
}
//---------字符串查找------------------------
uchar strsearch(uchar *ptr2,uchar *ptr1_at)
{
        uchar i,j,k;
        uchar flag;
        if(ptr2[0]==0)
        {
                return(0);
        }       
        flag=0;
        for(i=0,j=0;i<MAX_TM-2;i++)
        {
        if(ptr1_at[i]==ptr2[j])
        {//第一个字符相同
                k=i;
                //for(k=i;k<MAX_TM-2;k++,j++)
                do {
                        if(ptr2[j]==0)//比较正确
                                return(i+1);               //返回值是整数,不含0
                        if(ptr1_at[k]!=ptr2[j]) break;
                        k++;j++ ;
                } while(k<MAX_TM-2) ;

                j=0;
        }
        }
        return(0);       
}
uchar strsearch1(uchar i,uchar *ptr2,uchar *ptr1)
{      uchar j=0,k;
                        k=i;
      do{
                       if(ptr1[k]==ptr2[j])
                       {j++;k++;}
                       else return(0);
                       if(ptr2[j]==0)  return(k);
        }while(j<=60);
        return(0xff);
}
//-----删除短信----------------------
void CMGD_GSM(char* ptr1_at,uchar id)
{
         uchar  ptr1[3] ;
     ptr1[0]=(id/10)+0x30;
     ptr1[1]=(id%10)+0x30;
     ptr1[2]=0;
         Send_AT_Command(SMS_CMGD,ptr1_at,ptr1);    //删除其它没有用的短信
         Send_AT_Command(SMS_CMGD,ptr1_at,ptr1);
}
//---读短信报文---------------


/*
*********************************************************************************************************
** 函数名称          CPMS_SM()
** 函数功能                  功能 读短信报文 ,有短信就读短信 ,把有短信的ID找到,并读出内容
** 全局变量或数组:   receive_count 接收指针  uart_buff  sms_num_tmp
** 入口参数          :  AT指令 字符串
                              *str_at=要复制的内容/转AT指令
                    sms_num_tmp     短信ID  供删除短信时用

** 出口参数         : 1-成功      0-失败
*********************************************************************************************************
*/

uchar CPMS_SM(char* ptr1_at )
//----------------------
{   
        uchar i,j,r,num_tmp1;
    Send_AT_Command(AT_INIT,ptr1_at,0);
    dmsec(1000);dmsec(1000);dmsec(1000);
    Send_AT_Command(AT_E,ptr1_at,0);
    dmsec(1000);dmsec(1000);dmsec(1000);
    Send_AT_Command(AT_CPMS,ptr1_at,0);
    dmsec(1000);dmsec(1000);dmsec(1000);
    if(i=strsearch("+CPMS:",ptr1_at)) //"SM"  +CPMS: 0,20,0,45,0,45
                   {
                                 i=i+5;
                             //+CPMS: 0,20,0,45,0,45
                          if(strsearch1(i,"\x20\x30,",ptr1_at))  //没有短信
                         {     
                                 return(0);
                         }
                          else  if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'1')  //9以下短信处理
                                    &&(ptr1_at[i+1]<='9'))&&(ptr1_at[i+2]==','))
                       {      //+CPMS: 1,20,1,20,1,20
                                  i=i+1;
                                   r=ptr1_at[i]-0x30;   //有几个短个
                                   i++;//,
                                   i++; //20
                                   j=0;
                                   j=ptr1_at[i]-0x30;
                                   j=j*10; //高位
                                   i++;
                                   j=j+(ptr1_at[i]-0x30); //低位
                                   i++;
                                   if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的
                                   { j=j*10;i++;
                                     j=j+(ptr1_at[i]-0x30);

                                  }
                 //返回是可以存多少短信
                                  //r=j+10;
                         }
                          else if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'0')  //10条短信以上处理
                                    &&(ptr1_at[i+2]>='0'))&&(ptr1_at[i+3]==','))
                       {
                                  i=i+1;
                                   r=ptr1_at[i++]-0x30;
                                   r=r*10;   //移到十位
                                   r=r+ptr1_at[i++]-0x30;

                                   i++; //20
                                   j=0;
                                   j=ptr1_at[i]-0x30;
                                   j=j*10; //高位
                                   i++;
                                   j=j+(ptr1_at[i]-0x30); //低位
                                   i++;
                                   if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的
                                   { j=j*10;i++;
                                     j=j+(ptr1_at[i]-0x30);

                                  }
                  //返回是可以存多少短信
                                  //r=j+10;

                            }

                        }
           else   //出错处理
           {   if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x34)
                           {
                                    return(0);
                       }

           }

         r=j;
  //---------下面有短信时,进行短信查找 从1-100------------------------------------
         num_tmp1=1;
        do{
            if(r>=100)  //短信存储号不能超过100个
            {
                r=1; //
            }   
            if(r==1)         //如果是一条发AT+CMGL=ALL或AT+CMGL=4
                {
                  
                                   Send_AT_Command(SMS_CMGL,ptr1_at,0);
                                   dmsec(1000);
                   dmsec(1000);
                                   if(i=strsearch("+CMGL:\x20",ptr1_at))  //查短信代码回复是否对
                                    {  i=i+6;
                                      if(ptr1_at[i+1]==',')
                                          {
                                            num_tmp1=ptr1_at[i]-0x30; //当前短信存储号 10以内
                                          }
                                          else        //当前短信存储号 10以上
                                          {
                                              num_tmp1=ptr1_at[i++]-0x30;
                                              num_tmp1=num_tmp1*10;
                                                  num_tmp1=num_tmp1+ptr1_at[i++]-0x30;

                                          }
                                      sms_num_tmp=num_tmp1;
                                      return(1);
                                    }


                }
                           else
                                {
                                        i= READ_TEL(ptr1_at,num_tmp1) ;
                                        if(i) //有短信跳出
                                          {   
                                                  i=i+7;
                                               sms_num_tmp=num_tmp1;
                                               return(1);
                                          }

                                }

                           r--;
                           num_tmp1++; //
       }while(r!=0);
      //---------------------------------------------
       return(0);
}
//----读sim卡的电话本----------------------
uchar  read_sms(char* ptr1_at,char* ptr1_code,char* ptr_tel)
{

         uint  i;
     uchar   j,  PDU_TEXT,y;
     if(!CPMS_SM(ptr1_at))
     {
                     return(0);
     }
          
      if((i=strsearch("08916831",ptr1_at)))//短信中心号码字头  //如果不是,说明没有短信
                 {  i=i+17;  j=0;
                      //带+86的中国移动与联通手机
                    if((ptr1_at[i]>='0')&&(ptr1_at[i+1]>='0'))
                        {  i=i+2;  //当前指针移动两位
                             //_______取出对方号码长度______________
                             j=ptr1_at[i++]-0x30;  //取高位
                             j=j*16;   //称入高位
                             if(ptr1_at[i]>=0x41)    //大于9的低位处理
                                 {
                                          j=j+(ptr1_at[i++]-0x37);
                                 }
                                 else    //9及以下处理
                                   j=j+(ptr1_at[i++]-0x30);
                             //___________________________
                              //-接入码-- 9186  与A1 接入码字头
                                  if(ptr1_at[i]=='9') //
                                  {
                                          i=i+4;  //指针移动4位,去掉 9186
                                  }
                              else
                                i=i+2;  // 指针移动2位,去掉 A1
                                  //j=j-1;
                                 //------------对方号码查找---------------
                                 //--电话号码存入 TEL_temp数组
                                   y=0;
                              do {
                                         j--;j--;
                       ptr_tel[y++]=ptr1_at[i+1];
                       if(ptr1_at[i]=='F') //有补码
                       {  ptr_tel[y]=0;
                          i++; i++;
                                              break;
                       }
                       ptr_tel[y++]=ptr1_at[i];
                       i=i+2;
                         if(y>15) break; //长度不能超过20
                                      }while(j!=0);
                                        ptr_tel[y]=0;
                                 //---------------------------------
                      //i=i+1;
                      //是否是中文模式 0008   2100
                                        if((ptr1_at[i]>='0')&&(ptr1_at[i+1]>='0')&&(ptr1_at[i+2]>='0')
                                        &&(ptr1_at[i+3]=='8'))
                                        {
                                          i=i+4; //移动4位,去掉本0008
                      i=i+14; //移动14位,去掉本日期及时间
                                          i=i+2;
                       //----------内容复制-将内容放到para_temp里------
                       for(j=0;j<=MAX_T-3;j++)  //不能超过最大值
                       {
                             ptr1_code[j]=ptr1_at[i++];
                                                  if(ptr1_at[i]==0x0d)
                                                  {  ptr1_code[++j]=0; break;
                                                  }
                          PDU_TEXT=0;   //PDU
                          if(i>=MAX_TM)  break;
                       }
                      //---------------------
                                        }
                                // 英文模式
                              //+CMGR: "REC READ","8613818120592",,"09/06/25,14:16:33+32",145,4,0,0,"8613800210500",
                                        //145,3
                                        //END  0
                             //  2B 43 4D 47 52 3A 20 22 52 45 43 20 52 45 41 44 22 2C 22 38 36 31 33 38 31 38 31 32 30 35 39 32 22
                             //2C 2C 22 30 39 2F 30 36 2F 32 35 2C 31 34 3A 31 36 3A 33 33 2B 33 32 22 2C 31 34 35 2C 34 2C 30 2C 30
                             // 2C 22 38 36 31 33 38 30 30 32 31 30 35 30 30 22 2C
                                 //31 34 35 2C 33 0D 0A 45 4E 44 0D 0A 30 0D

                                 else
                                {            PDU_TEXT=1;//文本
                                             goto err_dll;


                              }
                                //i++;

                     } //固定代码对不对
             else goto err_dll;



                 } //08916831
         else
            goto err_dll;


    if(PDU_TEXT==0) //中文内容分析
    {     i=0;
              //5438 5408  吸合
            if(strsearch1(i,"54385408",ptr1_code))
                            {


                                      LATD=0x00FF;
                                     strcpy(ptr1_code,"SET OK\x1a");

                                     return(1);

                            }
        //  断开 65AD 5F00   PUD码
       else  if(strsearch1(i,"65AD5F0",ptr1_code))
                            {


                                      LATD=0x0000;
                                       return(2);

                            }
            else goto err_dll;



}
  //------------------------------------------------------------
   else   if(PDU_TEXT==1)//英文
     {

                   goto err_dll;


                }
        //-------------------------------------------------------------------

                        else {

err_dll:                        //短信号码删除 AT+CMGD=01
                                CMGD_GSM(ptr1_at,  sms_num_tmp );

                                        for(i=1;i<=MAX_TM-3;i++)
                                 {    ptr1_at[i]=0; }

                           Send_AT_Command(AT_CMGF0,ptr1_at,0);  //中文方式
                           dmsec(1000);dmsec(1000);dmsec(1000);
                                  Send_AT_Command(AT_CNMI,ptr1_at,0);//AT+CNMI=2,1
                                  dmsec(1000);dmsec(1000);dmsec(1000);
                                        // return;

                                 }



             return(0);





}
//---------1-20条短信号码读取--------------
uchar   READ_TEL(char* ptr1_at,uchar  id)                //读短信号码1-20个
{

         uchar  ptr1[5],t;
     t=0;
     ptr1[t++]=(id/10)+0x30;
     ptr1[t++]=(id%10)+0x30;
     ptr1[t++]=0;ptr1[t++]=0x00;
         Send_AT_Command(SMS_CMGR,ptr1_at,ptr1);
         dmsec(1000);dmsec(1000);dmsec(1000);
     timercount=0; while(timercount<20) ;
    // if(t=strsearch("+CMGR: 0,,0",ptr1_at))
         if(receive_count<10)
         {
                 return(0);
         }
      return(1);

}
//----模块初始化----------------------------------
void Initialize_Model(char* ptr1_at,char* ptr1_code)    //初始化 PIN检测
{
        uchar i,j;
     
         //BELL=0;  for(i=0;i<=100;i++) dmsec(1);  BELL=1;
   //  GPS_READ(ptr1_at,ptr1_code);

     ptr1_code[0]=0;
        for(i=0;i<15;i++)
        {   //进行初始化,并显示  ATE0V0  = ATE0 ATV0   AT_E
                Send_AT_Command(AT_E,ptr1_at,0);
                Send_AT_Command(AT_INIT,ptr1_at,0);
                dmsec(1000);dmsec(1000);dmsec(1000);dmsec(1000);
                if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x30)
                {  break;}
        else if(ptr1_at[receive_count-1]==0x0d&&ptr1_at[receive_count-2]=='0')
         {  break;}

                if(i==1)
                {  // IO_IGT=0;   for(i=0;i<=200;i++) dmsec(30);IO_IGT=1;
                    timercount=0; while(timercount<60);
                }


              timercount=0; while(timercount<60);

    }

        for(i=0;i<12;i++)
            {            //读卡  AT+CPIN?

                     Send_AT_Command(AT_E,ptr1_at,0);
                         Send_AT_Command(AT_INIT,ptr1_at,0);
                     Send_AT_Command(AT_CPIN,ptr1_at,0) ;
                     dmsec(1000);
                     dmsec(1000);
                     //如有收到回应进行分析收到的信息,
                     timercount=0; while(timercount<2);
                        if(j=strsearch("READY",ptr1_at))
                                break;

            timercount=0; while(timercount<60);
            }




        Send_AT_Command(AT_IPR,ptr1_at,0);//波特率  AT+IPR=9600
        dmsec(1000);dmsec(1000);dmsec(1000);
          Send_AT_Command(AT_CGMM,ptr1_at,0);  //模块型号 AT+CGMM
          dmsec(1000);dmsec(1000);dmsec(1000);


     timer_S_cnt=0; while(timer_S_cnt<10) ;
     //BELL=0;  for(i=0;i<=100;i++) dmsec(1);  BELL=1;
     Send_AT_Command(AT_CNMI,ptr1_at,0);
     dmsec(1000);dmsec(1000);dmsec(1000);
     Send_AT_Command(AT_CMGF0,ptr1_at,0);//AT+CMGF=0
     dmsec(1000);dmsec(1000);dmsec(1000);
}
//--------单片机初始化----------------------------
void sys_init(void)
{
        IEC0bits.T1IE=1;
        LATD=0x0000;
        TRISD=0xFF00;
        T1CON=0;                       //T1做定时器。分频比1:1
    TMR1=0;  
    PR1=0x4E20;  //20ms定时
    T1CON=0x8000;
    TRISFbits.TRISF2 =1;            //RC脚输入  
          TRISFbits.TRISF3 =0;            //TX脚输出
          IPC2bits.U1RXIP=7;              //中断优先级别
          IEC0bits.U1TXIE=0;              //禁止发送中断
          IEC0bits.U1RXIE=1;              //使能接收中断
          U1BRG =64;                      //波特率设置为9600,外部10M
          U1MODE =0x8020;                 //使能UART功能无奇偶校验
          U1STA=0X0000;   
          U1STAbits.UTXEN =1;             //允许发送
          #if 1
          TRISFbits.TRISF4 =1;            //RC脚输入  
          TRISFbits.TRISF5 =0;            //TX脚输出
          IPC6bits.U2RXIP=7;              //中断优先级别
          IEC1bits.U2TXIE=0;              //禁止发送中断
          IEC1bits.U2RXIE=0;              //使能接收中断
          U2BRG =64;                      //波特率设置为9600,外部10M
          U2MODE =0x8020;                 //使能UART功能
          U2STA=0X0000;   
          U2STAbits.UTXEN =1;             //允许发送  
          #endif
          timer_1S_cnt=0;receive_count=0;

}
//------发送AT指令----------------------------
uchar  Send_AT_Command( uchar type,uchar *str_at ,uchar *str_code)      //发送AT指令
//拨号时号码放在phone.number
//其他用para_temp
{
        uint   i;
    switch(type)
    {
      case AT_CPIN:                //检查当前是否要输入PIN码
        strcpy(str_at,"AT+CPIN?");
        break;
     //  AT_E
       case AT_E:                //ATE0 功能关回显  ATE1 开回显
        strcpy(str_at,"ATE0");
        break;
      case AT_INIT:                //ATV0  回复方式 30 0D  ATV1 回复方式  OK
        strcpy(str_at,"ATV0");
        break;
        //0D 0A 54 43 33 35 0D 0A
      case   AT_CGMM:   //模块版型号
        strcpy(str_at,"AT+CGMM");
        break;
      case AT_CMGF0:    //PDU方式
          strcpy(str_at,"AT+CMGF=0");
        break;
    // AT_CNMI
      case AT_CNMI:    //   AT+CNMI=2,1
          strcpy(str_at,"AT+CNMI=2,1");
        break;
       case  AT_IPR:   // 波特率 9600
        strcpy(str_at,"AT+IPR=9600"); break;

        case SMS_CMGL:                //删除一个短信
        // strcpy(uart_buff,"AT+CMGL=\"ALL\"");
        strcpy(str_at,"AT+CMGL=4");
      //  strcat(uart_buff,ptr);
        break;

      case SMS_CMGR:                //读一个短信
        strcpy(str_at,"AT+CMGR=");
        strcat(str_at,str_code);
        break;

       case SMS_CMGD:                //删除一个短信
        strcpy(str_at,"AT+CMGD=");
        strcat(str_at,str_code);
        break;

       case AT_CPMS:       //读短信报文
               strcpy(str_at,"AT+CPMS=\x22SM\x22");
        break;  //AT_CPMS

     //----------------------------------------------------

         //----------------------------------------------------------

     //-----------------------------------------------
      case AT_COMMAND:
              break;
      default:
              receive_count=0;
              return(1);
    }
    U1STAbits.UTXEN =1;
    strcat(str_at,"\x0d\x00");//在命令后加入CR
    IFS0bits.U1RXIF=0;                                        //清除接收标志
    IFS0bits.U1TXIF=0;
   //------------------------------
    for(i=0;i<MAX_TM;i++)
        {        if(str_at[i]==0) break;
                U1TXREG=str_at[i];
            U1STAbits.UTXEN =1;
                while(!IFS0bits.U1TXIF);
                IFS0bits.U1TXIF=0;
        }
        dmsec(1000);dmsec(1000);dmsec(1000);
   //---------------------
   receive_count=0;
   str_at[0]=0; str_at[1]=0;str_at[2]=0;
   i=0; timer_1S_cnt=0;
   do{
       dmsec(3);
       if(receive_count>1)
       {   //        dmsec(50);
                   timercount=0; while(timercount<30);
            break;
       }

    }while(timer_1S_cnt<3);



    return(1);



}

void main(void)
{
         uchar i;
         sys_init();
         Initialize_Model(uart_buff,para_temp);//进行初始化
         receive_count=0;
         sms_tmp=0;
        while(1)
        {
                //-----------查询1到20条中的短信,只要有短信就处理------------------------------------------


                                i=read_sms(uart_buff,para_temp,TEL_temp);                           //timer_S_cnt=0;
                                if(i==0)
                                {
                                    receive_count=0;
                                     timer_S_cnt=0; while(timer_S_cnt<60)
                                  {
                                           if(strsearch( "+CMTI:",uart_buff))
                                             {
                                                 break;
                                                  }
                                           if(receive_count>=7)
                                              {break; }

                                  }


                                }
               else
               {
                   //加入回复短信程序

                          CMGD_GSM(uart_buff,sms_num_tmp );
               }





        }


}

使用特权

评论回复
板凳
qfyangfu|  楼主 | 2011-11-21 14:57 | 只看该作者
30f6014串口数组接收怎么编写啊?

使用特权

评论回复
地板
qfyangfu|  楼主 | 2011-11-29 20:27 | 只看该作者
有没有人用过MC39i啊

使用特权

评论回复
5
yewuyi| | 2011-11-30 10:23 | 只看该作者
没有人会耐心给你看完这些代码的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝