搜索
bottom↓
回复: 25

求助:51单片机和TC35I通信的问题!!!

[复制链接]

出0入0汤圆

发表于 2009-5-20 21:15:28 | 显示全部楼层 |阅读模式
最近在弄51单片机控制TC35I的东东,买回TC35I后通过电脑和它连接,打电话,发短信都可以,就开始用51单片机控制TC35I,可是没有成功,还希望大家帮帮助,看看是什么问题!
程序如下:我想实现在功能是给TC35I发中文短信单片机会据短信内容作出相应动作,下面的程序只用了一个P1。0和P1。1端口,发“吃饭”两个字的短信的话,P1。0会吸合继电器,给TC35I打电话的时候,P1。1吸合继电器。若再发“吃饭”那P1。0继电器就断开,再打电话的话P1。0继电器断开
程序中对TC35I初始化后我让它给我打个电话表示初始化成功,但是TC35I什么都没做,很晕,希望大家可以帮帮我,感谢中

TC35I和单片机我是这样连接的,RXD TXD是直接对连的(交叉接它也没有反应),地线接地线。
程序如下,

#include<reg51.h>
#include<string.h>
sbit Race=P1^0;
sbit AIR=P1^1;
sbit START=P3^2; //启动端口
bit i=1,l=1; //main函数中的变量
unsigned char  RsPoint=0; //接收缓存指针
unsigned char  RsBuf[60]="\n";         //接收缓存数组
//延时函数
void delay(unsigned char n)
{
        unsigned char i=204;
        while(n--)
        {
                while(i--);
        }
}
//51单片机初始化
void init51(void)
{
  P1=0x00;         //控制端端口初始化
  TMOD=0X20;//定时器1,定时方式2
  TH1=0XFD;        //波特9600初始化
  TL1=0XFD;
  PCON=0X00; //波特不加倍
  TCON=0X40;//定时器开始计数
  SCON=0X50;//串口方式1,允许接收
  IE=0X9;//EA=1,ES=1
}
//给TC35I发送ASC字符
void SendASC(unsigned char ASC)
{
   bit es;
   es=ES;

   ES=0;
   TI=0;
   SBUF=ASC;
   while(!TI);
    TI=0;

    ES=es;
   
}
  
//给TC35I发信息         
void SendToTC35(unsigned char *p,unsigned char n)
{
   
   while(n--)
    {                                       
         SendASC(*p++);  
         }
   
}

//打电话的子程序  拨通后可自动挂断
void Call(void)
{
   unsigned char *p;

   while(1)
    {
      SendToTC35("ATD15881084287;",15);
          SendASC(0x0d);  //回车
          delay(2000);
          p=strstr(RsBuf,"BUSY");
          if(p!=NULL) //如果打通了后就延时一下,再挂机
            {
                         
                        SendToTC35("ATH",3);
                        SendASC(0x0d);//回车
                        break;
             }
         }

}

   //TC51初始化设置

void initTC51i(void)
{
   delay(1000);
  SendToTC35("AT+CNMI=1,2,0,0,1",17);     SendASC(0x0d);//有短信直接发给51
  delay(1000);
  SendToTC35("AT+CLIP=1",9);              SendASC(0x0d);//来电显示
  delay(1000);
  SendToTC35("AT+CMGF=0",9);              SendASC(0x0d);//中文短信
  delay(1000);
  Call();//初始化后回拔电话表示已完成
}  
  //串口中断
void com_init(void) interrupt 4 using 3
{
     char *Ring;
         if(RI)
           {
            
            RsBuf[RsPoint++]=SBUF;         
                 if(RsPoint>=sizeof(RsBuf))
                   {
                    RsPoint=0;
                        }
               
                 Ring=strstr(RsBuf,",161,,,,0")        ;//查询到有来电标志的话 挂机
                 if(Ring!=NULL)
                   {
                    delay(400);
                    SendToTC35("ATH",3);
                        SendASC(0x0d);
                        strcpy(RsBuf+(strlen(RsBuf)-9),"\n");//清除来电激活标志: ,161,,,,0
                        }
                        RI=0;
                }
}

         //主函数
void main(void)
{  
   unsigned char *pass;
   init51();
   initTC51i();             // 初始化
   
   while(1)
    {  
         delay(300);
         
         pass=strstr(RsBuf,"505A996D");//做饭的UNICODE代码         查询接收的短信中有做饭的代码 接通继电器
         if(pass!=NULL)
           {
             if(i==1)  { Race =1; i=0; } //开p2.0继电器
         else      { Race =0; i=1; }        //断p2.0继电器
                 Call();
      
                 strcpy(RsBuf,pass+8);   //接收到的PDU串 8是命令的长度(如做饭8个unicode字符)48是短信无信息时的字符个数
         RsPoint=strlen(RsBuf);
                }  
       
         pass=strstr(RsBuf,"15881084287");//接收到指定的电话后         接通相应继电器
         if(pass!=NULL)
           {
             if(l==1)  { AIR=1;  l=0;  }
                 else      { AIR=0;  l=1;  }
                 Call();

                 strcpy(RsBuf,pass+11);   //接收到的PDU串 8是命令的长度(如做饭8个unicode字符)48是短信无信息时的字符个数
         RsPoint=strlen(RsBuf);
       
                 
           }
        }           
                 
}

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-5-21 12:13:33 | 显示全部楼层
请大家帮帮忙呀!谢谢了,

出1070入962汤圆

发表于 2009-5-21 12:28:05 | 显示全部楼层
程序没仔细看,就是觉得在串口接收中断里边直接进行判断处理不好,有可能会丢数据。还是移出来的好。中断只负责收字符并且放入缓冲区。
做这类应用的关键是要知道单片机和模块之间到底发生了什么。AT指令有没有发给模块,模块有没有回答,回答的信息有没有给单片机,只要解决这个问题,就知道毛病在什么地方了,可以有针对性的去查。要不也许是个很小的问题,光猜问题在哪里就要花费大量时间精力。
还有刚发现,你的TC35初始化函数里边给模块的初始化命令都没有发送回车啊?

出0入0汤圆

 楼主| 发表于 2009-5-21 13:01:20 | 显示全部楼层
//TC51初始化设置

void initTC51i(void)
{  
   delay(1000);
  SendToTC35("AT+CNMI=1,2,0,0,1",17);     SendASC(0x0d);//有短信直接发给51
  delay(1000);
  SendToTC35("AT+CLIP=1",9);              SendASC(0x0d);//来电显示
  delay(1000);
  SendToTC35("AT+CMGF=0",9);              SendASC(0x0d);//中文短信
  delay(1000);
  Call();//初始化后回拔电话表示已完成
}

苹果猫我有发回车的呀SendASC(0x0d);,每个命令都有的,
我在中断里弄了个判断的处理主要是当电话来的时候好把它挂断,不知道这样做好不好,我还是先按你说的做一下吧,

非常感谢你苹果猫,谢谢!

出1070入962汤圆

发表于 2009-5-21 13:13:51 | 显示全部楼层
汗!没看到你写在一行里边,眼睛不好使了,呵呵。不过,你还不如直接这么写呢,SendToTC35("AT+CMGF=0\r",10);

出0入0汤圆

 楼主| 发表于 2009-5-21 21:14:55 | 显示全部楼层
我还以为\r它不认识呢 呵呵,我继续努力
苹果猫 你有空看看程序逻辑上有没有什么不对了,谢谢了哈!
也请论坛里的高手们都来帮帮忙哈,

出1070入962汤圆

发表于 2009-5-21 21:56:58 | 显示全部楼层
51的单片机我不熟。你还是先确定硬件没有问题,然后再考虑软件。你主程序中直接strstr搜索电话号码是行不通的,PDU的电话号码已经做过转换了,如果是固定的电话号码,可以直接搜索转换后的字符。

出0入0汤圆

 楼主| 发表于 2009-5-25 09:14:52 | 显示全部楼层
苹果猫  你说你
主程序中直接strstr搜索电话号码是行不通的,PDU的电话号码已经做过转换了,如果是固定的电话号码,可以直接搜索转换后的字符。
我不是太清楚,我用超级终端做的短信收发实验,如果我打电话在超级终端里,它是会显示出电话号码的(AT+CLIP=1)。我用STRSTR搜索电话号码应该可以吧,如果是发短信过来才不能这样搜索是吧,发短信来时我是根据短信中的UNICODE码来判断的,如下
pass=strstr(RsBuf,"505A996D");//做饭的UNICODE代码         查询接收的短信中有做饭的代码 接通继电器

这样对的吧!非常感谢你苹果猫,我继续检查,谢谢你一直关注!呵呵

出1070入962汤圆

发表于 2009-5-25 09:51:43 | 显示全部楼层
楼上完全正解!

出0入0汤圆

发表于 2009-7-24 13:04:26 | 显示全部楼层
楼主,给个联系方式。

出0入0汤圆

 楼主| 发表于 2009-7-25 17:02:08 | 显示全部楼层
qq:182434286希望搞这个的大家一起多交流

出0入0汤圆

发表于 2009-7-27 09:14:27 | 显示全部楼层
最近也在玩这方面,不过用的是M128,开始是由于电源供电有问题造成模块工作不正常,后来解决后ok了。
   建议选查硬件,确保没问题:
     1)查看电源设计是否符合要求。
     2)查看sim部分电路设计。date要上拉!
     3)确定模块初始化成功!

出0入0汤圆

发表于 2009-8-1 14:05:52 | 显示全部楼层
最近也在弄这个,希望到时可以请教一下楼主

出0入0汤圆

发表于 2009-8-1 16:33:25 | 显示全部楼层
你的问题解决了吗?
是什么地方出现了问题,怎么解决的

出0入0汤圆

发表于 2009-8-6 11:11:30 | 显示全部楼层
我现在也在做它们的通信,根据说明模块上有一个串口转换芯片,单片机板子上不用转换芯片,我是RXD--TXD,TXD--RXD,GND--GND,这样交叉连接的,不太好使,讨论一下,串口转换芯片用一片吗?还有应该交叉连接还是直接对连(RXD--RXD,TXD--TXD,GND--GND)?

出0入0汤圆

发表于 2009-8-7 18:45:08 | 显示全部楼层
我直接就是发的出去没回应。也是单片机与短信模块之间用了RS232通讯标准,两片MAX232,可是却没回应

出0入0汤圆

 楼主| 发表于 2009-8-7 23:20:40 | 显示全部楼层
和14楼接的一样,TXD和RXD,RXD和TXD,GND,GND三线相连,当时只能单边通信,单片机给TC35I发命令时可以收到,但是TC35I回信息却收不到,另外15楼的朋友,我也试了用两个MAX232接,最后问题解决了,但是同14楼的一样,我也据说明书上说可以直接连,给大家提两个建议,一个就是在TC35I的RXD上弄一个上拉电阻,1K试试。二就是把TC35I的电压提到4.2V再试试,(注意:两个方法的前提都是交叉连接,另外因为我现在在外地,没法验证这两个想法,希望和我遇到一样问题的朋友可以试试,若成功,请说明一下,谢谢!!)

出0入0汤圆

发表于 2010-1-22 11:12:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-29 17:15:32 | 显示全部楼层
马克吐温

出0入0汤圆

发表于 2010-3-31 16:04:09 | 显示全部楼层
回复【15楼】Gvinnar
-----------------------------------------------------------------------

我和你的一样 模块这边是rs232,板子里有个max232 照理串口是可以通信的,但接上就是没反应,怪。

出0入0汤圆

发表于 2010-4-1 21:42:02 | 显示全部楼层
楼主我改了一下你的程序用KEIL UV2,调了一下发现你通过串口送给TC35的数据是A         。不是你想的那些"AT+CNMI=1,2,0,0,1"等等,然后我把你程序中的 SendToTC35("AT+CNMI=1,2,0,0,1",17); 改成strcpy(at,"AT+CNMI=1,2,0,0,1/r");                       SendToTC35(&at,18);  //at是我定义的一个数组

再试结果发现发给串口的数据对了。但我不知道这是为什么,希望哪个大虾能解释一下两种方式有什么不同.希望我发现的这点对楼主有帮助,谢谢楼主的程序,受益匪浅。

出0入0汤圆

发表于 2010-4-14 11:32:09 | 显示全部楼层
20楼的能不能给个联系方式,好请教一下!

出0入0汤圆

发表于 2010-5-13 00:42:26 | 显示全部楼层
刚开始学习.记号

出0入0汤圆

发表于 2010-9-24 01:22:25 | 显示全部楼层
大家都很猛。。

出0入0汤圆

发表于 2010-10-3 20:23:18 | 显示全部楼层
ATE0V0是AT指令集吗?
在单片机控制TC35时遇到的,据说是TC35的初始化命令,
怎么查了半天西门子的官方AT集也找不到啊?

出0入0汤圆

发表于 2011-3-26 16:31:16 | 显示全部楼层
各位大侠,小弟这厢有礼了。。。
我最近也在弄这个东西啊(做毕业设计)。
TC35i 是一个芯片还是已经集成了SIM卡模块,还有就是程序是下载在单片机还是TC35i上?
很急啊。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 03:33

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

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