原创 使用TC35AT命令进行数据通讯(芯片应用)

2007-1-1 11:52 3924 6 6 分类: 通信

一 介绍:
   本文主要介绍如何编程实现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-TC35TGSM 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 命令集,该命令集是工业界广泛采用的标准。


1. 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 的命令的返回形式为:<CR><LF>Response<CR><LF>。切记TC35 命令响应结果码中含有这些字符,这对于编写程序来处理TC35 结果码以确定TC35工作是否正常非常重要。在本文中:
  <CR> 代表ASCII 中回车字符,值为0x0D;”\r”
  <LF> 代表ASCII 中换行字符,值为0x0A;”\n”
  此外,还可以通过ATVn 设置结果码(Response)返回字符串形式或数字形式。部分结果码如下:


  代码 字符串 含义
  0 OK 调制解调器接收命令正确;
  1 CONNECT 连接建立;
  2 RING 检测到振铃信号;
  3 NO CARRIER 没有检测到载波或载波丢失;
  4 ERROR 无效命令;
  5 CONNECT 1200 在1200Bit/S 速率下建立连接;
  6 NO DIAL TONE 没有检测到拨号音;
  7 BUSY 检测到忙音;
  10 CONNECT 2400 在2400Bit/S 速率下建立连接;
  11 CONNECT 4800 在4800Bit/S 速率下建立连接;
  12 CONNECT 9600 在9600Bit/S 速率下建立连接;
  14 CONNECT 19200 在19200Bit/S 速率下建立连接;
注:这里的连接速率指数据终端设备(DTE)的串口速率,而不是数据通讯设备(DCE)速率。在编程控制TC35 进行数据通信时建议将返回结果码设置为数字形式,这样便于处理返回结果码。


3 调制解调器的状态转换




  调制解调器的状态可分为离线命令状态、在线状态命令状态和数据状态。除了拨号占短暂的时间外,调制解调器总是处于其中一种状态。当调制解调器启动之后,首先处于离线命令状态,连接后进入数据状态,此时若调制解调器接收到换码序列(+++)就会进入在线命令状态,当处于在线命令状态时执行挂机命令(ATH) 就会进入离线命令状态。在命令状态下,调制解调器不是和远端通讯,而是接收并解释AT 命令;在数据状态下调制解调器就可以发送和接收数据。状态转换关系如图:


四 编程实现TC35 数据通信功能步骤及注意事项


  编程实现TC35 数据通信功能与编程实现普通调制解调器通信功能方法完全相同,都是通过串口向其发送AT 命令,并比对其返回结果码,以进行正确的控制和操作。 但在对TC35编程时要更加注意命令响应延时,以及TC35 是否处于网络连接状态。此外,如无特别说明,此部分所列举程序代码是在MC2002 上调试通过,用户可根据实际情况进行修改。


1 编程步骤
  离线命令状
  在线命令状
  数据状态
  建立连接
  载波丢失
  ATO 命令
  换码序列+++
  ATH 命令


  了解了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\nCONNECTXXXX/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 命令返回形式为<CR><LF>Response<CR><LF>;
 (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, unsignedint 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. <<MODEM 应用技术>>-------电子工业出版社;
 2. <<RS-232 和调制解调器高级通讯编程>>-------人民邮电出版社;
 3. <<AT Command Set -– Siemens Cellular Engines

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条