打印

单片机和GSM TC35通信失败,求高手解答,非常感谢!!

[复制链接]
楼主: ewby
手机看帖
扫描二维码
随时随地手机跟帖
41
ewby|  楼主 | 2011-5-19 01:46 | 只看该作者 回帖奖励 |倒序浏览
40# chunyang

有可能上个一个命令执行完,需要一小段时间来执行一些东西,期间不能发送命令给他。
但是我现在给程序间上了一小段延时,也没有效果,还是ERROR。
或者连接计算机和GSM,直接给GSM送:
ATE
AT+CNMI=1,1,2

两个命令同时发给GSM,GSM直接返回两个OKOK,这说明问题不在这……

其他原因,想不出来还会有什么了……

使用特权

评论回复
42
byhoo| | 2011-5-19 09:37 | 只看该作者
你得要读返回信息,返回OK的话,就做下一步操作,
还有就是你得要模块初始化完了之后再进行操作,连上电脑,那有可能是模块初始化完了,你通过串口调试助手来发AT指令,当然能成功,
你在用MCU发AT指令的时候,如果模块没有初始化完成,而你发AT,ATE,模块会有响应,但是你发AT+CNMI=1,1,2的话,模块内部的功能模块没初始化好,所以会返回失败...

使用特权

评论回复
43
byhoo| | 2011-5-19 09:38 | 只看该作者
如果不知道怎么检测模块是否成功初始化,那么就在模块上电后,延时20s左右的时间,再来发短信试试

使用特权

评论回复
44
corset| | 2011-5-19 11:32 | 只看该作者
命令发送和接收之间要延时
上电和初始化TC35之间要有最好30S的延时

使用特权

评论回复
45
ewby|  楼主 | 2011-5-19 11:33 | 只看该作者
43# byhoo

我把GSM直接接计算机上,然后手动发送连续的指令,
第一次,发送41 54 0D 0A 41 54 45 0D 0A 41 54 2B 43 4E 4D 49 3D 31 2C 31 2C 32 0D 0A   //这是AT\r\nATE\r\nAT+CNMI=1,1,2\r\n
得到的返回是:AT OK ATE OK ERROR
这使我认为是系统内部初始化未完成,而我发送太快的原因(如42楼所说)
第二次,先发送41 54 0D 0A 41 54 45 0D 0A      //这是AT\r\nATE\r\n
得到返回是:AT OK ATE OK
间隔两三秒后,我再发送41 54 2B 43 4E 4D 49 3D 31 2C 31 2C 32 0D 0A   //这是AT+CNMI=1,1,2\r\n
得到返回是: OK

到这里,想必问题原因可能已经找出,就是要得带系统自动初始化的几秒钟然后才能发AT+CNMI=1,1,2指令

然后我在单片机里面发AT+CNMI=1,1,2指令前加了个延时,大概有20S的
但是!! 出来的结果仍然是:
AT

OK
ATE

OK

ERROR


。。。。。。

使用特权

评论回复
46
txwdota| | 2011-5-19 12:29 | 只看该作者
用串口调试助手的16进制显示模式查看你的命令尾缀是否正确

使用特权

评论回复
47
ewby|  楼主 | 2011-5-19 12:31 | 只看该作者
46# txwdota

是正确的, 0D 0A

使用特权

评论回复
48
lyndisco| | 2011-5-19 12:46 | 只看该作者
学习了

使用特权

评论回复
49
ewby|  楼主 | 2011-5-19 16:23 | 只看该作者
自己顶下,坐等建议……

使用特权

评论回复
50
mohanwei| | 2011-5-19 21:40 | 只看该作者
void main(void)
{//先不对模块应答做解析,纯粹按顺序逐个发指令……
        InitUart();
        GSM_PowerOn();//通过I/O发出开机脉冲
        delay_s(10);//延时n秒,等待开机初始化完成(自己找找手册,看看这个时间最大是多少)
        //字符串发送函数uartPutStr里自动添加上回车,因为这个是每条指令都有的;甚至可以把前面的"AT"也和谐了……
        uartPutStr("AT");//测试AT引擎是否已准备好
        delay_s(1);//正常情况下这个指令会立即响应,稍作延时就可以了
       
        uartPutStr("AT&F");//恢复出厂值(不是每次都必须)
        delay_s(5);
       
        uartPutStr("ATE0");//关闭回显。这样用串口监听线+串口助手可以监听到完整的通信收发数据
        delay_s(1);//正常情况下这个指令会立即响应,稍作延时就可以了
       
        uartPutStr("AT+CMGF=1");//文本模式
        delay_s(3);
       
        uartPutStr("AT+CMGS=\"139110110110\"");//你的手机号
        delay_s(5);
       
        uartPutStr("hello,world\x1A");//短信内容,以CTRL+Z结束(也就是0x1A)
        delay_s(15);
       
        while(1)
        {
                ;
        }
}

等你对GSM模块的操作流程有所体会再考虑其他的东西

使用特权

评论回复
51
ewby|  楼主 | 2011-5-19 22:30 | 只看该作者
50# mohanwei

类似您列举的这段发短信的代码,我在之前几天测试过,是可以通过的。只发命令,不处理返回信息,而通过延时函数来产生适当命令间隔。

串口监听线我已弄好,同时监听双方的发出信息。然而,监听到的信息却是如下:
^SYSSTART             //GSM模块发出系统开启信息
AT                          //单片机在收到SYSSTART信息后,发出AT指令
AT                          //GSM正常应答
OK                          //GSM正常应答
ATE                        //单片机发出ATE简化显示命令
ATE                          //GSM正常应答
OK                           //GSM正常应答
ERROR                    //此处为我疑惑所在。这里,我让单片机发送了一个CNMI_cmd[]={"AT+CNMI=1,1,2\r\n"};指令,可是,却监听不到我发送的指令,而返回一个错误信息。

使用特权

评论回复
52
mohanwei| | 2011-5-19 22:42 | 只看该作者
指令有误。在GMS模块对应的AT指令手册上搜你发出的指令,看看他们的格式是什么样的

使用特权

评论回复
53
ewby|  楼主 | 2011-5-19 22:47 | 只看该作者
52# mohanwei

指令没错的。
我现在直接计算机串口对接GSM模块。
我发出41 54 2B 43 4E 4D 49 3D 31 2C 31 2C 32 0D 0A  //AT+CNMI=1,1,2
模块响应0D 0A 4F 4B 0D 0A                                         //OK

而且如果指令有误,单片机通过串口发出的信息电脑应该也能监控的到的。可是却没有,只监控到GSM模块返回的ERROR。

使用特权

评论回复
54
ewby|  楼主 | 2011-5-19 23:43 | 只看该作者
现在的现象让我比较疑惑!!!
我设置了一个延时函数
void big_delay(unsigned char t)
{
        unsigned char i,j,k;
        for(k=0;i<t;i++)
        for(i=0;i<255;i++)
        for(j=0;j<255;j++);
}

用于加在出错指令(AT+CNMI=1,1,2)之前的。
当我设置延时big_delay(50);或者big_delay(255);的时候,我大概需要等20秒左右或以上,,会直接收到一个返回ERROR,而不会出现AT+CNMI=1,1,2命令。
当我设置延时big_delay(3); big_delay(10);的时候,我监听串口能马上看到指令AT+CNMI=1,1,2 (几乎是和之前AT ATE命令及相应的OK回复同时出来)。然后隔1S不到左右收到个ERROR返回信息。

使用特权

评论回复
55
chunyang| | 2011-5-20 00:27 | 只看该作者
延时是不需要的,重点是用程序分析模块的回应,找特征字和字长,可以就用回车换行的识别。

使用特权

评论回复
56
ewby|  楼主 | 2011-5-20 00:36 | 只看该作者
55# chunyang
对模块回应信息的分析,我就是按您所说的这么做的,例如:
  uartPutStr(ATE_cmd);          //发送简化显示要求信号
  while(!isOK)
  {
    if(ReceiveBuffer[count-1]=='\n' &&
       ReceiveBuffer[count-2]=='\r' &&
       ReceiveBuffer[count-3]=='K' &&
       ReceiveBuffer[count-4]=='O' )
  {
   isOK=1;  
   count=0;
    memset(ReceiveBuffer,'\0',512);
  }
  }
上面的程序是对ATE指令的返回信号进行关键字识别,识别到OK/r/n就通过,执行下一条指令。

使用特权

评论回复
57
chunyang| | 2011-5-20 00:39 | 只看该作者
那你仔细去对比一下MCU发出的指令和人工发出指令的区别吧,用16进制做比较,不排除低级错误。

使用特权

评论回复
58
zhaoyu2005| | 2011-5-20 10:40 | 只看该作者
LZ你模拟时弄反了吧,测试你的单片机程序应该是单片机发送AT,电脑返回OK,你电脑发AT,单片机返回OK,用单片机模拟GSM模块?什么目的
之前有友说了,先用单片发送AT命令,测试GSM模块返回是否正常,之一部通过了,后面的就好说了,这个就是验证波特率和链接的方法。这个通了,才可以进行其他很多指令的

使用特权

评论回复
59
ewby|  楼主 | 2011-5-20 11:28 | 只看该作者
可以了!
原因是:延时
TC35在发出^SYSSTART启动信号后,其实还在进行一些初始配置。这时候发送AT ATE这样的命令它能够正常回应,但是发出如AT+CMNI=X,x,x之类的某些命令,它就会返回ERROR。因此需要在这个命令之前加一小段延时才行。

使用特权

评论回复
60
dengtaoic| | 2011-5-27 23:32 | 只看该作者
我做的是通过手机数据线直接把手机和单片机相连,我用串口调试助手,可以通过电脑串口发指令控制手机,然后我将单片机通过串口和电脑相连,用电脑模拟手机返回数据,单片机运行正常,可是当把手机直接和单片机相连时手机一点反应没有,请各位大侠帮忙支个招吧!!!!

使用特权

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

本版积分规则