数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发
2 Wavecom GSM/GPRS模块Multiplexing协议介绍
笔者选用了Wavecom的Q2403A,这是一款E-GSM/GPRS 900/1800的双频模块。这个模块支持大部分常用的AT命令,但不支持标准的TS27.010协议。为了能够数据/命令复用,Wavecom定义了自己的multiplex协议。
Wavecom的复用协议允许一条串行链路上同时进行两个会话(即虚连接):一个AT命令的会话和一个数据通信的会话。AT+WMUX=1将激活模块的复用模式。在这种模式下,AT命令和数据都被封装成数据包。通过包头,可以区分是数据包还是AT命令包。
2.1 AT命令包格式
AT命令包帧格式如图2所示。第一个字节(0xAA)用于标识这是一个命令包,第二个字节是AT命令长度的低八位。第三个字节由两部分组成:低3位是AT命令长度的高3位;高3位用于标识一个AT命令。AT命令的最大长度可以为2047字节。校验和?穴checksum?雪是包中所有字节(包括头和AT命令)之和对256取模。
图4 Linux下串行通信数据流和函数调用示意图
2.2 数据包格式
数据包各个字段(除packet type外)意义与AT命令包相同,其帧格式如图3所示。数据包有以下几种类型:
·Type=0——DATA 包:这个包是发送到无线链路上或者从无线链路上接收到的数据
·Type=1——STATUS包:这个包给出了SA、SB、X和中断条件编码的信息。
状态包的长度总为1字节。任何一个状态(除了break)改变时,所有的状态位都要发送出去。缺省情况下,所有的状态位都是关闭的(因此DTR、RTS都是关闭的),所以在打开复用开关准备传送数据之前,一定要发送一个状态包。
·Type=2——READY包:这个包表示发送READY包的一方可以接收数据了。包中没有数据,所以长度字段为0。
·Type=3——BUSY 包:这个包表示发送READY包的一方忙,无法接收数据。包中没有数据。
3 Linux下串口通信系统的组成
要在Linux系统上实现TS27.010协议,就必须了解Linux下串口驱动软件模块的结构。
图4不但给出了Linux kernel中串口通信模块的组成结构,还形象地表示出了数据是如何在用户和硬件接口之间流动的(笔者使用Linux 2.4.19的内核)。从图4可以看到串口通信模块可在逻辑上分为三层:TTY层、line discipline层和底层驱动层。TTY层是用户空间和内核空间的桥梁,用户程序和内核需要通过tty层交换数据;Low-level driver则负责硬件的交互,它对硬件进行控制和读写操作;line discipline层是整个串行通信模块中最灵活、设计最巧妙的一层,它要为一个串行口的使用定下数据交互的“规程”,在Linux内核中已经存在了许多line discipline,例如PPP、SLIP、TTY等。缺省使用TTY line discipline。可以根据需要将line discipline替换成Linux已经定义的line discipline结构,甚至替换为自己的line discipline结构。
在图4中,向硬件接口写数据的过程是显而易见的。但是,用户程序从硬件读取数据的过程却要复杂一些,这是因为硬件与用户空间之间没有直接的联系。解决的办法就是使用缓冲技术,硬件接收数据存储于kernel buffer中,等待用户程序请求这些数据;如果用户程序请求数据时,这个buffer是空的,那么用户程序就会被挂起,直到buffer中有数据时,它才被唤醒。实际上,TTY相关的缓冲是由两级构成的:一个“常规”buffer(数据等待着line discpline取走,缺省情况下传到用户空间)和一个“flip”buffer(硬件驱动函数将底层进来的数据尽可能快地存入这个缓冲,而不必考虑并发存取问题,因为这个buffer是每个硬件驱动专有的)。flip buffer由两个物理的缓冲实现,并被交替地写入,这样中断处理函数就会总有一个缓冲可用。
Linux下串口软件的这种分层结构虽然增加了复杂性,但是它带来的好处是多方面的。第一,串口模块更加灵活,在为新的串口硬件编写驱动程序时,只需修改和增加最底层的软件即可;第二,上层应用程序可以根据需要改变line discipline的处理软件,在使用PPP、SLIP等协议进行拨号连接时,都需要将原有的line discipline替换为PPP或
《数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发(第2页)》