搜索
bottom↓
回复: 26

急求tc35i短信接收程序,现在接收不了短信,大侠们帮帮我!

[复制链接]

出0入0汤圆

发表于 2011-10-5 19:43:17 | 显示全部楼层 |阅读模式
我通过手机发送中文短信,手机消息报告成功,但是单片机没有测检测到收到信息,怎么回事?如果哪位大侠有tc35i的短信接收程序,给我分享下!下下!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-10-5 19:53:50 | 显示全部楼层
有消息报告吗?

出0入0汤圆

 楼主| 发表于 2011-10-5 19:57:07 | 显示全部楼层
程序如下,望大侠们看看,问题在哪!!!
#include <reg52.h>
#include <intrins.h>       

/*************宏定义专区***************/
#define uint unsigned int         
#define uchar unsigned char
#define BLKN  4      //列锁存器数(=LED显示字数*2)
#define TOTAL 8        //待显示字个数,本例共14个
sbit led1=P3^4;
sbit led2=P3^5;

/*************变量定义专区*************/
sbit G=P1^7;         //P1.7为154译码器显示允许控制信号端口,0时输出,1时输出全为高阻态.
sbit CLK=P1^6;       //P1.6为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据.(引脚12)
sbit SCLR=P1^5;      //P1.5为595移位寄存器清零口,平时为1,为0时,输出全为0.(引脚10)
sbit dat_595=P2^0;         //595的14脚
sbit Shift_Clk=P2^1; //595的11脚
//unsigned char dispram[(BLKN/2)*32]={0}; //显示区缓存,1字共1*32单元
unsigned char dispram[32]={0}; //显示区缓存,1字共1*32单元
sbit START_TC=P3^2;        //启动TC35i的控制端
uchar code AT[]={"AT"};                //AT指令
uchar code AT_Code[]="OK";     //GSM响应
uchar idata RsBuf[100];              //接收缓存区
uchar code  Receive_Mode[]={"AT+CNMI=2,1,0,0,0"};   //短信接收模式设置:通过SIM卡接收
uchar code  Read_Message[]={"AT+CMGR=1"};                   //读第一条短信
uchar code  Delete_All_Message[]={"AT+CMGD=1,4"};  //删除所有短信
void main(void)
{
  start_TC35i();
        UART_Init();   // 串口初始化
        Send_Set();           //GSM设置
        while(1)
        {
         led1=0;
               Read();        //读短信   
        }
}
start_TC35i()  //启动TC35i的函数
{

       
        START_TC=0;//启动TC35i
        delay_Xms(1500);// 时间必须大于100ms
        START_TC=1;//完成启动 //此后一直保持高电平
}
delay_Xms(uint t)
{
        uint i,j;
          for(i=t;i>0;i--)
             for(j=113;j>0;j--);
}
/**************************************************
*函数名称:SendByte_595
*输入:byte
*输出:无
*功能说明:595发送一个字节的数据
***************************************************/
void SendByte_595(unsigned char byte)
{     
    unsigned char i;
        for(i=0;i<8;i++)
        {
                byte >>=1;
                dat_595=CY;
                Shift_Clk=1;
                _nop_();
                _nop_();
                Shift_Clk=0;
        }  
   
}
/**************************************************
*函数名称:display_up
*输入:word1,word2         待显示的汉字
*输出:无
*功能说明:点阵显示:上滚形式
***************************************************/
void display_up(uchar word1)
{
        register unsigned char i,j,k,l,q;
//unsigned char j,k,q;
//for (i=0; i<word1; i++)   
//   {
if(word1==0)
{  i=0;
    for (j=0; j<2; j++)
      for (k=0; k<8; k++)
        {
        for (l=0; l<16; l++)
          {  
          for(q=0;q<1;q++)
             {
              dispram[l*2+q*32] = dispram[l*2+q*32]<<1 | dispram[l*2+1+q*32]>>7;
              if(q==1-1) dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | Bmp1[l*2+j]>>(7-k);
             else dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | dispram[l*2+(q+1)*32]>>7;
                    }
          }
        delay_ms(100);
        }
  }
}

/****************************************
*函数名称:delay_ms
*输入:uint ms延时时间 ,注意ms的数据类型
*输出:无
*功能说明:毫秒级延时
*****************************************/
void delay_ms(uint ms)       
{                                               
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

/********************************
*函数名称:UART_Send_Byte
*输入:byte
*输出:无
*功能说明:发送单字节
*********************************/
void UART_Send_Byte(uchar ch)
{
        SBUF=ch;           //缓冲区装载要发送的字节数据
        while(TI==0);        //等待发送完毕,TI标志位会置1
        TI=0;                        //清零发送完成标志位
}
/*************************************
*函数名称:UART_Send_Str
*输入:*str        字符串指针,len字符串长度
*输出:无
*功能说明:发送字符串
**************************************/
void UART_Send_Str(uchar * str,uint len)
{
        while(len--)
        {
                UART_Send_Byte(*str++);       
        }
}

/*************************************
*函数名称:UART_Init
*输入:无
*输出:无
*功能说明:串口初始化
**************************************/
void UART_Init(void)
{
        SCON=0X50;
        TMOD=0X20;
        TH1=0XFD;
        TL1=0XFD;//波特率为9600
        TR1=1;
    ES=1;
  //定时器初始化,主要用于LED显示
        TMOD = 0x01;               //定时器T0工作方式1:16位方式
        TR0 = 1;                   //启动定时器T0
   TH0 = (65536-1000)/256;          //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
        TL0 = (65536-1000)%256;
        P1 = 0x3f;                 //CONIO端口初值
        ET0=1;                    //允许定时器T0中断
        EA=1;       
}
/*************************************
*函数名称:ClrRsBuf
*输入:uchar * str  uint len
*输出:无
*功能说明:清除接受指令缓存区
**************************************/
void ClrRsBuf(uchar * str,uint len)
{
        uchar  i;
        for(i=0;i<len;i++)
            str=0;
}
/*************************************
*函数名称:GSM_OK
*输入:无
*输出:1:返回OK;0:不返回OK
*功能说明:判断是否返回OK
**************************************/
uchar GSM_OK(void)
{
        uchar i;
        for(i=0; i<sizeof(RsBuf); i++)
        {
                if(RsBuf == 'O' && RsBuf[i+1]== 'K')
                {
                        return 1;
                }
        }
        return 0;       
}
/***********************************************************
*函数名称:CheckAtc_Message
*输入:无
*输出:1:收到信息;0:没收到信息
*功能说明:判断是否返回"+CMTI: "SM", 41",若返回,则收到短信
**************************************************************/
uchar CheckAtc_Message(void)
{
    uchar j;
    for(j=0;j<sizeof(RsBuf);j++)
    {                                   
        if((RsBuf[j]==0x53)&&(RsBuf[j+1]==0x4D))    //0X53 'S'         4D 'M'
                    return 1;
    }

    return 0;
}
/***********************************************************
*函数名称:GSM_Read_Message
*输入:无
*输出:1:收到佛;2:收到科;0:没有收到“佛”或“科”
*功能说明:判断读到的短信
**************************************************************/
uchar GSM_Read_Message(void)
{
        uchar j;
    for(j=0;j<sizeof(RsBuf);j++)
    {   
            if((RsBuf[j]==0x34)&&(RsBuf[j+1]==0x46)&&(RsBuf[j+2]==0x35)&&(RsBuf[j+3 ]==0x42)) //收到佛(4F5B)字
                     return 1;   
                else if((RsBuf[j]==0x37)&&(RsBuf[j+1]==0x39)&&(RsBuf[j+2]==0x44)&&(RsBuf[j+3]==0x31))  //收到科(79D1)字
                          return 2;                       
    }
    return 0;
}
/*********************************************************************
*函数名称:Read_One_Message
*输入:无
*输出:        0,1,2
*功能说明:返回读到短信内容所指标志,如收到“佛”返回1,收到“科”返回2
************************************************************************/
uchar Read_One_Message(void)
{
         ES=0;
     UART_Send_Str(Read_Message,sizeof(Read_Message)-1);   //发送AT+CMGR=1读第一条短信
         UART_Send_Byte(0x0d);
     ES=1;
     delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
         return  GSM_Read_Message();
}
/***********************************************************
*函数名称:Read
*输入:无
*输出:无
*功能说明:读一条短信完整过程
**************************************************************/
void Read(void)
{     led2=0;
        if(CheckAtc_Message())        //收到短信
                {
        led2=1;
        delay_ms(100);
                        if(Read_One_Message()==1)         //收到“佛”
                        {
                         display_up(0);
          display_up(1);   //点阵显示“佛山
                        //        Send_Set();                   //重新设置
                        }
                        else if(Read_One_Message()==2) //收到“科
                        {
                                display_up(2);  //点阵显示“科学
            display_up(3);
                                Send_Set();                 //重新设置
                        }
                }       
}
/**************************************************
*函数名称:GSM_AT
*输入:无
*输出:1:返回OK,连接成功;0:不返回OK,连接不成功
*功能说明:发AT指令,返回OK证明已连接  
***************************************************/       
uchar  GSM_AT(void)
{   
     ES=0;
         ClrRsBuf(RsBuf,sizeof(RsBuf)); //////////////////清空缓冲区
         UART_Send_Str(AT,2);
         UART_Send_Byte(0x0d);
         ES=1;
         delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
     return   GSM_OK();
}  

/**************************************************
*函数名称:GSM_Receive_Mode
*输入:无
*输出:1:返回OK,设置成功;0:不返回OK,设置不成功
*功能说明:设置接收短信模式:通过SIM卡接收
***************************************************/
uchar GSM_Receive_Mode(void)
{   
     ES=0;
     UART_Send_Str(Receive_Mode,17);
     UART_Send_Byte(0x0d);
     ES=1;
     delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
         return   GSM_OK();
}
/**************************************************
*函数名称:Delete_Message
*输入:无
*输出:1:返回OK,设置成功;0:不返回OK,设置不成功
*功能说明:删除SMI卡内所有短信
***************************************************/
uchar Delete_Message(void)
{   
     ES=0;
     UART_Send_Str(Delete_All_Message,sizeof(Delete_All_Message)-1);
     UART_Send_Byte(0x0d);
     ES=1;
     delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
         return   GSM_OK();
}
/**************************************************
*函数名称:Send_Set
*输入:无
*输出:无
*功能说明:设置GSM
***************************************************/
void Send_Set(void)
{      
        if(GSM_AT()) //发AT指令,返回OK证明已连接
        {
                if(Delete_Message()) //删除SMI卡内所有短信
                {
                        if(GSM_Receive_Mode()) //设置接收短信模式,返回OK,设置成功
                        {
                          
                        }       
                }
        }       
}


/**************************************************
*函数名称:GSM_UART
*输入:无
*输出:无
*功能说明:串口接收中断
***************************************************/
void GSM_UART(void) interrupt 2
{
        static uchar k=0;       
        if(RI==1)                //检测接收完成标志位置1
        {
                RI=0;                     //清零接收完成标志位
                RsBuf[k++] = SBUF;  //读取接收到的数据
                if(k >= (sizeof(RsBuf)))
                {
                        k=0;
                }
        }
}
/**********显示屏扫描(定时器T0中断)函数**********/
void leddisplay(void) interrupt 1 using 1
{
        register unsigned char m, n=BLKN;
          TH0 = (65536-1000)/256;         //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
        TL0 = (65536-1000)%256;
        m = P1;                 //读取当前显示的行号
        m = ++m & 0x0f;         //行号加1,屏蔽高4位
        SCLR=1;
        do {
            n--;
            SendByte_595(dispram[m*2+(n/2)*30 + n]); //送显示数据
        }
        while (n);             //完成一行数据的发送             //完成一行数据的发送
        G = 1;                 //消隐(关闭显示)
        P1 &= 0xf0;             //行号端口清0
        CLK=1;                  //显示数据打入输出锁存器
   P1 |= m;                //写入行号
        CLK=0;                  //锁存显示数据
        G = 0;                   //打开显示
//   P1 |= m;                //写入行号
       
}


我测试led显示的部分没有问题,但是我发送短信的时候就进不了if(CheckAtc_Message())//收到短信,大侠们啊,我急啊!!!

出0入0汤圆

 楼主| 发表于 2011-10-5 19:58:14 | 显示全部楼层
我的手机有消息报告

出0入0汤圆

发表于 2011-10-5 20:00:18 | 显示全部楼层
它收到短信不会主动提示你,你的单片机在初始化的时候先从头按顺序找到sim卡短信存储的空白位置,不停的读取这个位置的内容,如果相关标志位变化说明有新信息。然后提取这个地方的信息就行了。
给模块打电话却会主动提示你。不停的发送“RING”,呵呵~~~
tc35是这样的。

出0入0汤圆

发表于 2011-10-5 20:01:26 | 显示全部楼层
2年前做过西门子手机6688短信控制开关,有点忘掉了,读短信好像是AT+CMGR

出0入0汤圆

发表于 2011-10-5 20:01:43 | 显示全部楼层
2年前做过西门子手机6688短信控制开关,有点忘掉了,读短信好像是AT+CMGR。不难的,串口读写的操作

出0入0汤圆

 楼主| 发表于 2011-10-5 20:09:24 | 显示全部楼层
我是这样设置的啊,但是没有检测到“SM”,是怎么回事,但是我手机发送的消息,有消息报告啊,我糊涂了,不知道是怎么回事?

出0入0汤圆

发表于 2011-10-5 20:13:46 | 显示全部楼层
你的gsm模块上的串口还能再扯出线吗?如果能的话,就连到电脑的串口上,监视一下他俩之间到底发了什么东西。
你这么看代码看不出问题的。

出0入0汤圆

 楼主| 发表于 2011-10-5 20:43:48 | 显示全部楼层
恩,我试试看,谢谢!

出0入0汤圆

发表于 2011-10-5 21:56:33 | 显示全部楼层
需要设置的如果没记错的话应该是AT+CMTI,最好看下AT指令集的手册!我之前弄的时候就是这样!

出0入0汤圆

 楼主| 发表于 2011-10-5 22:10:15 | 显示全部楼层
恩,好的!

出0入0汤圆

 楼主| 发表于 2011-10-5 22:15:13 | 显示全部楼层
回复【10楼】xiaosi1102
需要设置的如果没记错的话应该是at+cmti,最好看下at指令集的手册!我之前弄的时候就是这样!
-----------------------------------------------------------------------

你能把你之前搞的测试成功的例子发给我看看吗?邮箱:838239297@qq.com

出0入0汤圆

发表于 2011-10-6 00:04:02 | 显示全部楼层
回复【12楼】luoguangqi  小猫咪……
-----------------------------------------------------------------------

我的是STM32的程序估计你用不了!

出0入0汤圆

发表于 2011-10-6 00:05:34 | 显示全部楼层
我现在是用电话上的,看看明天的,我把程序传上来吧!

出0入0汤圆

发表于 2011-10-6 01:47:07 | 显示全部楼层
楼主能把电路图上传吗?很想学习你的程序

出0入0汤圆

发表于 2011-10-6 07:42:13 | 显示全部楼层
wavecom公司的2406有这样的一个命令,好像是和短信提醒有关系的。

"AT+CNMI=2,1,0,0,0",
看了你前面的程序,好像也有这个设置命令的啊。






------------------------------
uchar GSM_Receive_Mode(void)
{   
     ES=0;
     UART_Send_Str(Receive_Mode,17);
     UART_Send_Byte(0x0d);
     ES=1;
     delay_ms(1000); //GSM反应速度较慢,等待它反应,具体时间待定
return   GSM_OK();
}
这个函数,你执行的时候,要确认一下,是不是返回OK了。最好做法是,设置命令后,通过判断串口返回值来。
如果等待时间不够长的话,继续下一条命令,可能会出现前面命令设置错误的。

出0入0汤圆

发表于 2011-10-6 09:09:30 | 显示全部楼层
LS的方法是正确的  我的设置也是这样的   设置完之后你收到短信会有指令提示的

出0入0汤圆

 楼主| 发表于 2011-10-6 09:52:22 | 显示全部楼层
回复【16楼】yinjinzhong 殷淼
wavecom公司的2406有这样的一个命令,好像是和短信提醒有关系的。
"at+cnmi=2,1,0,0,0",
看了你前面的程序,好像也有这个设置命令的啊。

------------------------------
uchar gsm_receive_mode(void)
{   
     es=0;
     uart_send_str(receive_mode,17);
     uart_send_byte(0x0d);
     es=1;
     delay_ms(1000); //gsm反应速度较慢,等待它反应,具体时间待定
return   gsm_ok();
}  
这个函数,你执行的时候,要确认一下,是不是返回ok了。最好做法是,设置命令后,通过判断串口返回值来。
如果等待时间不够长的话,继续下一条命令,可能会出现前面命令设置错误......
-----------------------------------------------------------------------

我用的是tc35i啊,不一样啊!程序需要怎么改一下啊!

出0入0汤圆

发表于 2011-10-6 14:09:50 | 显示全部楼层
看不懂

出0入0汤圆

 楼主| 发表于 2011-10-6 20:45:57 | 显示全部楼层
大侠们,给我一个51控制tc35i接收短信的程序吧!!!本人不胜感激!!!邮箱:838239297@qq.com

出0入0汤圆

发表于 2012-3-26 14:09:20 | 显示全部楼层
都是高手啊,膜拜。

出0入0汤圆

发表于 2012-4-30 16:10:21 | 显示全部楼层
xiaosi1102 发表于 2011-10-6 00:04
回复【12楼】luoguangqi  小猫咪……
----------------------------------------------------------------- ...

您好,我现在正在做STM32 的TC35i的设计,我出现了这样的问题,利用串口来检测STM32的发送数据和TC35i的接收数据都显示正确一致,为什么TC35i就是不能工作啊,你能给我看看程序吗,我的QQ705066269,可以的话加个好友,谢谢!

出0入0汤圆

发表于 2012-5-1 21:09:28 | 显示全部楼层
justyou 发表于 2012-4-30 16:10
您好,我现在正在做STM32 的TC35i的设计,我出现了这样的问题,利用串口来检测STM32的发送数据 ...

你应该查一下  你的TC35I是否硬件初始化了   然后在确定一下你的AT指令是否有问题   
只要这两个没有问题   都是可以发出去短信的
还有就是波特率    一定要匹配

出0入0汤圆

发表于 2012-5-4 21:23:07 | 显示全部楼层
xiaosi1102 发表于 2012-5-1 21:09
你应该查一下  你的TC35I是否硬件初始化了   然后在确定一下你的AT指令是否有问题   
只要这两个没有问题 ...

谢谢了,现在问题解决了,估计是tc35i初始化的时间还没有好,就发送了指令,然后当时是在进行测试,所以main函数一开始就执行了,导致tc35i没有收到数据,然后使用复位重发,但有打乱了tc35i的AT指令,后来加了个按键来控制AT命令,成功解决问题

出0入0汤圆

发表于 2012-5-4 22:59:16 | 显示全部楼层
justyou 发表于 2012-5-4 21:23
谢谢了,现在问题解决了,估计是tc35i初始化的时间还没有好,就发送了指令,然后当时是在进行测试,所以m ...

一般TC35出问题基本上都是这几个  所以把初始化时间调长点  注意下AT指令顺序就没问题了

出0入0汤圆

发表于 2014-4-19 18:21:31 | 显示全部楼层
xiaosi1102 发表于 2011-10-6 00:04
回复【12楼】luoguangqi  小猫咪……
----------------------------------------------------------------- ...

您好!你的STM32的程序能否给我发一份,感谢万分!邮箱365231628@qq.com
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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