打印

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

[复制链接]
13590|67
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ewby|  楼主 | 2011-5-18 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用atmega128控制GSM模块TC35收短信。程序上我保证至少99%是没错的~

我在计算机上用串口调试助手测试GSM模块是没问题的。我把AT命令发给GSM模块,然后记录下它的返回信息。并且用其他手机发短信到GSM模块上的卡,其返回信息也没问题!!

然后我又在计算机上用串口调试助手对单片机进行测试。手动响应单片机发来的AT命令。比且还模拟短信到的那个+CMTI: "SM",XX命令,单片机也能马上识别出短信到而发出AT+CMGR=XX命令,并且对我其后输入的模拟短信代码,如:+CMGR: 1,,26
0891683108808305F0040D91685188433431F8000811506102341323065E724EC04E48 也能够正确识别并进行处理!!


但是,当我把单片机和GSM模块连接在一起使用的时候,就是不行……没有反应……。
我单片机和GSM都是通过MAX232通信的。据说GSM的TTL电平和单片机的好像不太对得上,所有我就一直是使用232通信了。

就这部分,至少苦思冥想十几个小时了,,依然没有任何进展……求高手帮忙分析下是为什么呢。。非常感谢

如果可以的话,加我QQ395935996或邮箱ewby@qq.com联系,非常感谢!!

相关帖子

沙发
chunyang| | 2011-5-18 15:52 | 只看该作者
首先注意连接方式,GSM模块的串口与主控设备的串口是一顺连接的,不能交叉连接,其次,AT指令要以“回车”和“换行”符作为结束。

使用特权

评论回复
板凳
ewby|  楼主 | 2011-5-18 16:02 | 只看该作者
串口的输入输出没有问题的,~
比如我是单片机的2口连电脑3口,单片机的3口连电脑2口,这样是正常通信
         GSM的2口连电脑2口,GSM的3口连电脑的3口,这样也是正常通信!
然后我的单片机的2口连GSM的2口,单片机的3口连GSM的3口。这样没错把?

交叉连接是指什么?

AT指令我应该也没错的,比如:
unsigned char AT_cmd[]={"AT\r\n"};                                                        //握手信号
unsigned char ATE_cmd[]={"ATE\r\n"};                                                  //简化显示
unsigned char CNMI_cmd[]={"AT+CNMI=1,1,2\r\n"};                    //设置收到短消息提示
unsigned char CMGR_a_cmd[]={"AT+CMGR="};                                        //读取第X条短信,前半部分
unsigned char CMGR_b_cmd[2]={'\0','\0'};                                                //第X条短信,中间部分
unsigned char CMGR_c_cmd[]={"\r\n"};                                                //后半部分

使用特权

评论回复
地板
chunyang| | 2011-5-18 16:03 | 只看该作者
2-3这叫交叉,2-2这叫顺接,你的连法没错,注意回车换行符。

使用特权

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

使用特权

评论回复
6
ewby|  楼主 | 2011-5-18 16:04 | 只看该作者
我的每句指令都有回车换行符呢。。"\r\n"

使用特权

评论回复
7
chunyang| | 2011-5-18 16:06 | 只看该作者
检查了再说,将PC串口也接上,断开发送端,用接收端监看。

使用特权

评论回复
8
ewby|  楼主 | 2011-5-18 16:11 | 只看该作者
41 54 0D 0A                      //AT

41 54 45 0D 0A                //ATE

41 54 2B 43 4E 4D 49 3D 31 2C 31 2C 32 0D 0A             //AT+CNMI=1,1,2

41 54 2B 43 4D 47 52 3D 31 37 0D 0A 0D 0A                 //AT+CMGR=17

上面这些是我刚刚把PC串口和单片机连上,手动模拟GSM回答单片机的AT询问的信息

都没什么问题吧

使用特权

评论回复
9
chunyang| | 2011-5-18 16:15 | 只看该作者
绕开232接口芯片再试

使用特权

评论回复
10
ewby|  楼主 | 2011-5-18 16:17 | 只看该作者
是指直接单片机IO口接GSM的TTL电平接口上吗?

使用特权

评论回复
11
chunyang| | 2011-5-18 16:22 | 只看该作者
是的,小概率上不排除伪劣232接口芯片的影响。

使用特权

评论回复
12
ewby|  楼主 | 2011-5-18 16:38 | 只看该作者
我直接绕开232接IO口,一点反应都没有

之前二者用232对接的时候,单片机还能完成AT\ATE等待初始化指令发送与识别,然后进入到主函数的while循环里等待短信到(通过外部反应判断至少是把SIMInit函数执行完毕了进入主函数)。绕开232后,感觉还等待在初始化函数里头……

是二者电平不配对吗

使用特权

评论回复
13
chunyang| | 2011-5-18 16:44 | 只看该作者
你漏掉了重要信息,如果有一个指令可以被响应,那说明硬件接口并无问题,错在你的软件上,诸如AT指令流程不对、编程错误等,至于绕开232,232接口芯片必须与MCU断开,否则会发生电平竞争。

使用特权

评论回复
14
ewby|  楼主 | 2011-5-18 17:02 | 只看该作者
如您所说,如果有一个指令可以被响应,那说明硬件接口并无问题。单片机和计算机串口能够正常通信,GSM和计算机串口也能够正常通信,这不也能说明硬件接口无问题吗。
程序上我实在是很难找到单独的程序错误了……单片机发送的AT指令我都是用串口调试助手在电脑上正确测试,然后平搬过来的;并且读下GSM的正确返回信息,写在程序里让单片机验证的。
刚才绕开232的我大概没做好,我只把单片机上的max232卸下来了却没把GSM上的232焊下来,这大概会导致其无法收或者发信息。但是我想232能和计算机通信的这么好,让这两个模块相互通信这应该也不会有什么问题把。还有我买GSM的商家告诉我直接TTL电平引脚调试易烧坏tc35芯片~,所以我就没有再做进一步的测试了。



void SIMInit(void)
{          
         //ReadBPB();//
         while(!SYSSTART)
         {
             if(ReceiveBuffer[count-1]=='\n' &&
                     ReceiveBuffer[count-2]=='\r' &&
                     ReceiveBuffer[count-3]=='T' &&
                     ReceiveBuffer[count-4]=='R' &&
                     ReceiveBuffer[count-5]=='A' &&
                     ReceiveBuffer[count-6]=='T' &&
                     ReceiveBuffer[count-7]=='S' &&
                     ReceiveBuffer[count-8]=='S' &&
                     ReceiveBuffer[count-9]=='Y' &&
                     ReceiveBuffer[count-10]=='S'  )
            {
                          SYSSTART=1;
                        count=0;
                         memset(ReceiveBuffer,'\0',250);
            }
         }
         
         uartPutStr(AT_cmd);                                                                                //发送握手信号
         while(!isOK)
         {
                  if(ReceiveBuffer[count-1]=='\n' &&
                     ReceiveBuffer[count-2]=='\r' &&
                     ReceiveBuffer[count-3]=='K' &&
                     ReceiveBuffer[count-4]=='O' )                                                        //验证返回信号是否为"OK"
                {
                        isOK=1;
                        count=0;
                         memset(ReceiveBuffer,'\0',512);                                                                                                //再次验证返回信号是否为"OK"
                }
         }
         
         isOK=0;
         
         
         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);
                }
         }
         
         isOK=0;
         
         
         uartPutStr(CNMI_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);       
                }
         }
         
         isOK=0;
         
}


上面这个是我的初始化函数,然后就发现也是连接GSM到单片机的时候,单片机也是完全无法通过这个初始化的。这是我下午改了之后的。我之前没有准却判断GSM返回信息是否为“OK”之类的准确字符,而是直接判断其返回几个字符,比如:
uartPutStr(AT_cmd);                                                                                //发送握手信号
         while(!isOK)
         {
                  if(strlen(ReceiveBuffer)==9)                                                        //验证返回信号是否为"OK"
                {
                         delay(10);                                                                                        //延时消除误差
                        if(strlen(ReceiveBuffer)==9)
                        isOK=1;
                        count=0;
                        //OperateFile2(1 ,"TTTTTTTTTXT", 512, 512, ReceiveBuffer);
                         memset(ReceiveBuffer,'\0',512);                                                                                                //再次验证返回信号是否为"OK"
                }
         }

如此设置,单片机往往能够通过这个初始化函数而进入主函数。


之前我也在电脑上分别模拟GSM和单片机 对单片机和GSM发送返回信息或者指令,来调试,都没问题,二者一连起来使用,就不行了。

这使我非常困惑,不知问题出在哪。

使用特权

评论回复
15
mohanwei| | 2011-5-18 17:17 | 只看该作者
用电脑同时监听串口线上的TXD和RXD,把进入GSM模块的字符和GSM发出的字符都抓取下来……
用单片机去控制,你需要对模块的工作流程有所了解,比如怎么发出开机信号,发完需要多久模块才能初始化完成,进而能响应你发出的AT指令……

使用特权

评论回复
16
ewby|  楼主 | 2011-5-18 17:54 | 只看该作者
本帖最后由 ewby 于 2011-5-18 18:10 编辑

15# mohanwei



我刚才在单片机和GSM相连接的收发两条线上连上另外两条线到电脑的串口上。好像会产生电平竞争还是什么的。
当我监视单片机输出的时候,我要手动模拟GSM发出的信息,才能使单片机正常工作发出AT指令。
当我监视GSM输出的时候,需要我手动模拟单片机发送AT指令才能正常通信。但是如果我用AT指令调出一条短信,单片机能马上处理这条短信!

使用特权

评论回复
17
ewby|  楼主 | 2011-5-18 18:05 | 只看该作者
13# chunyang


chunyang版主还在吗,,有什么好的办法或者其他建议的吗

使用特权

评论回复
18
ewby|  楼主 | 2011-5-18 19:44 | 只看该作者
坐等高手ing……

使用特权

评论回复
19
gx_huang| | 2011-5-18 20:01 | 只看该作者
看样子,LZ对软件很熟悉,对硬件就不懂似的。
串口调试其实很容易的,实在不行,示波器看看波形。

使用特权

评论回复
20
ewby|  楼主 | 2011-5-18 20:58 | 只看该作者
19# gx_huang

唉,,确实不熟啊。

因为这两个模块分别和电脑通信都没问题,所以我感觉他们串口收发信息应该没错把~~

使用特权

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

本版积分规则

0

主题

37

帖子

1

粉丝