Ayumi 发表于 2009-5-20 21:15:28

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

最近在弄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 charRsPoint=0; //接收缓存指针
unsigned charRsBuf="\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=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);
       
               
           }
        }           
               
}

Ayumi 发表于 2009-5-21 12:13:33

请大家帮帮忙呀!谢谢了,

Appcat 发表于 2009-5-21 12:28:05

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

Ayumi 发表于 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);,每个命令都有的,
我在中断里弄了个判断的处理主要是当电话来的时候好把它挂断,不知道这样做好不好,我还是先按你说的做一下吧,

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

Appcat 发表于 2009-5-21 13:13:51

汗!没看到你写在一行里边,眼睛不好使了,呵呵。不过,你还不如直接这么写呢,SendToTC35("AT+CMGF=0\r",10);

Ayumi 发表于 2009-5-21 21:14:55

我还以为\r它不认识呢 呵呵,我继续努力
苹果猫 你有空看看程序逻辑上有没有什么不对了,谢谢了哈!
也请论坛里的高手们都来帮帮忙哈,

Appcat 发表于 2009-5-21 21:56:58

51的单片机我不熟。你还是先确定硬件没有问题,然后再考虑软件。你主程序中直接strstr搜索电话号码是行不通的,PDU的电话号码已经做过转换了,如果是固定的电话号码,可以直接搜索转换后的字符。

Ayumi 发表于 2009-5-25 09:14:52

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

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

Appcat 发表于 2009-5-25 09:51:43

楼上完全正解!

hero520hero 发表于 2009-7-24 13:04:26

楼主,给个联系方式。

Ayumi 发表于 2009-7-25 17:02:08

qq:182434286希望搞这个的大家一起多交流

yingfu_758 发表于 2009-7-27 09:14:27

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

woaiyu 发表于 2009-8-1 14:05:52

最近也在弄这个,希望到时可以请教一下楼主

woaiyu 发表于 2009-8-1 16:33:25

你的问题解决了吗?
是什么地方出现了问题,怎么解决的

flytudou 发表于 2009-8-6 11:11:30

我现在也在做它们的通信,根据说明模块上有一个串口转换芯片,单片机板子上不用转换芯片,我是RXD--TXD,TXD--RXD,GND--GND,这样交叉连接的,不太好使,讨论一下,串口转换芯片用一片吗?还有应该交叉连接还是直接对连(RXD--RXD,TXD--TXD,GND--GND)?

Gvinnar 发表于 2009-8-7 18:45:08

我直接就是发的出去没回应。也是单片机与短信模块之间用了RS232通讯标准,两片MAX232,可是却没回应

Ayumi 发表于 2009-8-7 23:20:40

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

dreamboy258 发表于 2010-1-22 11:12:29

mark

renjun861214 发表于 2010-1-29 17:15:32

马克吐温

xuegd 发表于 2010-3-31 16:04:09

回复【15楼】Gvinnar
-----------------------------------------------------------------------

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

jamin 发表于 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是我定义的一个数组

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

xuegd 发表于 2010-4-14 11:32:09

20楼的能不能给个联系方式,好请教一下!

mmoorrgg 发表于 2010-5-13 00:42:26

刚开始学习.记号

dnangel106 发表于 2010-9-24 01:22:25

大家都很猛。。

langxing08 发表于 2010-10-3 20:23:18

ATE0V0是AT指令集吗?
在单片机控制TC35时遇到的,据说是TC35的初始化命令,
怎么查了半天西门子的官方AT集也找不到啊?

youlu 发表于 2011-3-26 16:31:16

各位大侠,小弟这厢有礼了。。。
我最近也在弄这个东西啊(做毕业设计)。
TC35i 是一个芯片还是已经集成了SIM卡模块,还有就是程序是下载在单片机还是TC35i上?
很急啊。。。
页: [1]
查看完整版本: 求助:51单片机和TC35I通信的问题!!!