BROS. LAB. APPLICATION NOTE
AN02002
如何使用TC35-TC35T GSM MODEM进行数据通讯
作者:技术支持部 胡永健
一 介绍:
本文主要介绍如何编程实现TC35/TC35T GSM MODEM的数据通信功能。
TC35模块系SIEMENS公司为嵌入式设备设计的GSM双频通讯核心模块,TC35T内含TC35/SIM卡座/电源/天线/RS232接口,系可独立使用的通讯终端。本文中除特别说明外,所有关于TC35的说明也适用于TC35T。TC35不仅支持标准的AT命令集,SIEMENS公司还将AT命令进行了扩展,以便更有效的控制TC35。
MC2002可选GSM扩展板采用了-TC35模块,用户可以通过MC2002 Modem接口控制内置的TC35或通过上位机(如PC)RS232通讯口控制TC35T终端,使用AT命令,即可实现收发短信,以及语音以、数据拨号等相关操作。
GSM终端设备(包括TC35/TC35T)除了具有普通的语音通讯功能外,还有收发数据、短信息等功能。当终端设备(TE--Terminal Equipment)做为数据通信设备时,其功能相当于一台无线收发数据的调制解调器(Modem)。其实,九十年代主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP将原来用于普通调制解调器通信的AT命令集进行扩展,使得在应用中控制GSM终端进行数据通信与控制普通调制解调器通信的方法类似。所以,本文先介绍调制解调器进行通讯的工业标准—AT命令集,然后再介绍如何编程实现TC35-TC35T GSM Modem的数据通讯功能。
二 准备工作
使用TC35进行数据通信,用户必须准备一张已开通数据业务的SIM卡(需向电信运营
商申请),并将其插入MC2002之TC35扩展模块SIM卡座中或TC35T的SIM卡座中。 使用PC配合TC35T收发短信,用户需开启TC35T电源,通过串行数据线联接到PC, 并在PC端安装串口读写软件,如超级终端,Telix等。通过终端软件发送AT命令,察看返回数据。
使用MC2002GSM模块TC35时,用户需通过编程选用MODEM端口,TC35将自动上电,再通过编程发送AT命令和处理返回数据。MC2002在关闭TC35电源前,首先要向其发送”AT^SMSO\\r”命令,并确认返回为“OK”或0 (即中断与TC35网络连接)后,才可关闭MODEM端口。
三 调制解调器通信规则
前面已经介绍过TC35 GSM MODEM是一种特殊的调制解调器,对其控制操作与普通调制解调器类似。下面就对调制解调器通信规则,尤其是对AT命令进行介绍。
1相关AT命令
控制调制解调器可以使用Hayes标准AT命令集,该命令集是工业界广泛采用的标准。AT命令定义了如何配置调制解调器、如何连接以及如何测试调制解调器等相关命令。除”A/”和”+++”命令外,所有的AT命令都以”AT”或”at”打头, 在TC35应用中与数据通信应用相关的AT命令有:
A/ 重新执行前面的指令; ATZ 软复位; ATE0 关闭字符回显; ATE1 打开字符回显; ATV0 设置返回结果码为数字形式; ATV1 设置返回结果码为字符形式(缺省); ATDn; 拨出电话号码n(语音拨号); ATDn 拨出电话号码n(数据拨号); ATH 挂机; +++ 从数据状态切换至在线命令状态; ATO 从在线命令状态切换至数据状态; ATA 人工应答; ATSn=X 写S寄存器;ATS0=2自动应答 响铃2 ATSn? 读S寄存器; AT^SMSO 中断网络连接。
注:这里只列出与一些常用AT命令及TC35数据通讯相关AT命令,更详细内容请查阅相关资料。
2 AT命令返回形式及部分结果码
特别要注意TC35/TC35T的命令的返回形式为: 此外,还可以通过ATVn设置结果码(Response)返回字符串形式或数字形式。部分结果码如下: 代码 字符串 0 OK 1 CONNECT 2 RING 3 NO CARRIER 4 ERROR 5 CONNECT 1200 6 NO DIAL TONE 7 BUSY 10 CONNECT 2400 11 CONNECT 4800 12 CONNECT 9600 14 CONNECT 19200 含义 调制解调器接收命令正确; 连接建立; 检测到振铃信号; 没有检测到载波或载波丢失; 无效命令; 在1200Bit/S速率下建立连接; 没有检测到拨号音; 检测到忙音; 在2400Bit/S速率下建立连接; 在4800Bit/S速率下建立连接; 在9600Bit/S速率下建立连接; 在19200Bit/S速率下建立连接; 注:这里的连接速率指数据终端设备(DTE)的串口速率,而不是数据通讯设备(DCE)速率。 在编程控制TC35进行数据通信时建议将返回结果码设置为数字形式,这样便于处理返回结果码。 3 调制解调器的状态转换 调制解调器的状态可分为离线命令状态、在线状态命令状态和数据状态。除了拨号占短暂的时间外,调制解调器总是处于其中一种状态。当调制解调器启动之后,首先处于离线命令状态,连接后进入数据状态,此时若调制解调器接收到换码序列(+++)就会进入在线命令状态,当处于在线命令状态时执行挂机命令(ATH)就会进入离线命令状态。在命令状态下,调制解调器不是和远端通讯,而是接收并解释AT命令;在数据状态下调制解调器就可以发送和接收数据。状态转换关系如图: 建立连接 离线命令状 载波丢失 数据状态 ATH命令 ATO命令 在线命令状 换码序列+++ 四 编程实现TC35 数据通信功能步骤及注意事项 编程实现TC35数据通信功能与编程实现普通调制解调器通信功能方法完全相同,都是通过串口向其发送AT命令,并比对其返回结果码,以便进行正确的控制和操作。 但在对TC35编程时要更加注意命令响应延时,以及TC35是否处于网络连接状态。此外,如无特别说明,此部分所列举程序代码是在MC2002上调试通过,用户可根据实际情况进行修改。 1编程步骤 了解了TC35的命令接口后就可以进一步设计程序流程。编程实现TC35数据通信可分为以下六步: (1) TC35初始化 首先编程选用MODEM端口,使TC35上电,代码如下: UART_init(UART_MODEM_ON|UART_ON|UART_8_DATA_BITS|UART_BAUD_115200); UART_fcntl(UART_fcntl(UART_F_INQ)|UART_F_NO_CTS); 注:TC35具有自动识别串行接口速率的能力,但要求速率范围在1200Bps至115200Bps之间,并且设置为8Bit数据,无校验,1位停止位。 TC35 GSM模块上电后有一秒左右的初始化延迟,在此过程中TC35无法响应AT命令;另外,TC35上点后进入搜索网络状态,时间决定于信号质量,此时TC35不能正确执行拨号连接命令(ATDn)。 接下来要根据实际需要对TC35进行初始化设置,如: 要将TC35进行软复位的需执行”ATZ\\r”命令; 禁止命令回显需执行”ATE0\\r”命令; 要使返回结果码为数字形式则要执行”ATV0\\r”; 需要设置S寄存器的需执行”ATSn=X\\r”等等。 (2) TC35拨号连接 TC35拨号连接分语音拨号连接和数据拨好连接。语音拨号命令为”ATDn;\\r”(注意带分号);数据拨号命令为”ATDn\\r”(注意不带分号)。连接成功返回”\\r\\nCONNECT XXXX/RLP\\r\\n”,其中XXXX表示连接速率。在这里我们只讨论数据拨号连接。 要注意的是拨号连接需要一定的时间,编程时要根据实际情况进行适当的延时等待。 (3) 数据传输及处理 在建立起连接后用户就可通过TC35进行数据发送、接收及数据处理操作。这时发送数据就是简单的写串口,收数据是读串口,即使数据中含有AT命令字符串TC35也不会对其进行处理。在此部分可以建立TC35无线数据传输功能之上的高层应用,需要用户根据实际需要编程解决。 (4) 从数据状态切换至在线命令状态 数据收发结束后,就要使TC35从数据状态切换至在线命令状态。向TC35发送换码序列命令”+++”,并且前后各有至少一秒的延迟(不向TC35发数据),可使TC35从数据状态切换至在线命令状态,否则TC35会将”+++”当作数据发送出去。在离线命令状态时发送”ATO\\r”可回到数据状态。 (5) 挂断连接 挂断连接(即挂机)是向TC35发送”ATH\\r”命令,这时TC35将从在线命令状态切换至离线命令状态 (6) 断开TC35网络连接和关闭串口 若要断开TC35网络连接,则要向其发送”AT^SMSO\\r”命令。执行此命令,TC35将在断开网络连接后自动断电,只有在重新选通串口给TC35加以跳变电平后才能使其重新上电。另外,要注意的是只有在TC35处于网络连接状态才能正确执行”AT^SMSO\\r”命令,而当TC35处于搜索网络状态将无法正确执行此命令。 在使TC35断电后,必须及时关闭串行接口电路。代码如下: UART_init(UART_OFF); 2注意事项 编写TC35数据通信程序难点在于调试,下面就编程及调试时几点事项进行讨论。 (1) 在编程发送的每条AT命令(除”+++”及”A/”命令外)字符串后一定要加回车符(‘\\r’),否则TC35认为此命令行没有结束,将不会执行相关操作; (2) 由于信道干扰及TC35状态对TC35命令执行情况都会产生影响,所以非常有必要比对命令返回码,以确定命令是否正确执行,然后做出相应的处理。再次强调AT命令返回形式为 (3) 注意命令响应延时。在MC2002中只能通过查询方式得到串口数据,而不同的AT命令执行后其命令响应延时可能有所不同,即使同一条命令在TC35处于不同的状态下执行后命令响应延时也会不同;另外,我们还要保护程序能继续运行,在等待应一段合理时间时间后能使程序退出等待状态。 在这里有两种等待方式来解决此问题: 第一种是在向TC35发送AT命令后就处于响应等待状态,在合理的时间范围内接收到响应立即退出;若超出此时间范围就必须强行退出。下面一段代码可供参考: int read_comm_data(unsigned int delayunit) { typ_UART_stat_word Ustat; SPT_set(delayunit); do { Ustat.l_word = UART_stat(); if (Ustat.bits.buff_data_available) return UART_get_char(); } while(SPT_read()); return -1; } void get_responce(char * pbuff, unsigned int delayunit, unsigned int maxnum){ int ti; while ((ti = read_comm_data(delayunit)) != -1) { *pbuff++ = ti; if (--maxnum == 0) break; } *pbuff = 0; } 这里要注意函数get_responce(char * pbuff, unsigned int delayunit, unsigned int maxnum),它是在delayunit所规定的时间范围内得到最大maxnum个返回字符,并将返回字符串放入pbuff所指向的存储空间内。 第二种方法是在发送完AT命令延迟一段时间后再去读命令响应: void delay_n_ms(int mscnt) { for (;mscnt > 0; mscnt--) delay_1ms(); } 当然,这种方法有其局限性,因为无法知道命令响应到达的准确时间,但在某些需要较长延迟时间的场合 (如:拨号连接)配合前一种方法会更易调试程序。 至于命令响应的延迟时间则需要用户根据实际情况进行调试。 (4)为了节电,必须及时关断TC35和MODEM接口电路的电源。要注意的是TC35有其独立的电源供电,关闭MODEM接口电路并不等同于关闭TC35 GSM模块,所以在关闭MODEM接口电路前一定要先关闭TC35. 关闭TC35是向其发送”AT^SMSO\\r”命令;关闭MODEM接口电路则是执行代码:UART_init(UART_OFF); (5) 要注意TC35只有在网络连接状态才能正确执行”ATDn\\r”和”AT^SMSO\\r”等命令,所以在调试程序时要注意TC35状态指示灯所显示的状态。 五 参考资料 1. < 2. < 因篇幅问题不能全部显示,请点此查看更多更全内容