GSM串口多路复用协议

  1. 简介

       串口多路复用(以下简称多路复用)是在一条物理串行接口上实现多个数据链路连接(DLC),使得可以同时在一条串行接口上存在多个会话,比如语音、FAX、数据、SMS、GPRS、USSD等。帧结构类似HDLC。

       多路复用有三种操作模式:基本模式、带错误恢复功能的高级模式、不带错误恢复功能的高级模式(具体可以参见GSM 07.10协议),华为GTM900模块支持不带错误恢复功能的高级模式,与基本模式相比有如下特点:

  1. 可以在应用XON/XOFF流控的链接上使用
  2. 失去同步后恢复时间比较快

采用什么模式对于用户来说,影响不会很大,根据协议,基本模式与高级模式的处理过程非常类似,根据所提供的参考手册,用户很容易从一种模式转到另一种模式,比如从基本模式转到高级模式。

多路复用提供如下的业务接口:

  1. 启动业务
  2. DLC建立业务
  3. 数据业务
  4. DLC释放业务
  5. 关闭业务

       上述给出的业务在后面将会给出详细的介绍和应用举例。

  1. 帧结构
  1. 标记:基本模式时为0XF9,高级模式时为0X7E。
  1. 地址:   

1

2

3

4

5

6

7

8

EA

C/R

                       DLCI

EA:用于地址扩展,现在始终为1。

C/R:命令/响应

Command/response位用法如下:

Command/response

Direction

C/R value

Command

Initiator

­­­­      

Responder

1

Responder

         

Initiator

0

Response

Initiator

         

Responder

0

Responder

         

Initiator

1

DLCI:DLC标识,取值范围为0~63。

  1. 控制:定义帧类型

   

帧类型

BIT1

BIT2

BIT3

BIT4

BIT5

BIT6

BIT7

BIT8

SABM

1

1

1

1

P/F

1

0

0

UA

1

1

0

0

P/F

1

1

0

DM

1

1

1

1

P/F

0

0

0

DISC

1

1

0

0

P/F

0

1

0

UIH

1

1

1

1

P/F

1

1

1

UI

1

1

0

0

P/F

0

0

0

P/F:P/F位是依据该帧是命令帧/响应帧来确定是P功能还是F功能。如果是命令帧,则P/F位作为P功能;如果是响应帧,则P/F位作为F功能。如果一个命令希望应答,命令帧的P功能设置为1,响应帧(对该命令帧的应答)的F功能也应该设置为1。对于命令发送端来说,发送一个希望应答的命令后,必须等到对端应答或者超时,才能发送下一个希望应答的命令。超时可以进行重发或者相应的异常处理。

SABM(Set Asynchronous Balanced Mode):SABM命令帧用于建立一个DLC,接收端收到并且认可该命令后,用UA帧进行应答。如果对端没有准备好或者不愿意建立该DLC,则对端用DM帧进行应答,F位设置为1。如果T1时间内没有收到UA或者DM响应,发起者会重发DISC,直到重发次数达到设定值。

UA(Unnumbered Acknowledgement):UA响应帧用于接收端对收到并且认可的SABM帧或DISC帧的应答。

DM(Disconnected Mode):DM响应帧用于在链接还没有建立的状态下,接收端对接收到的DISC命令帧的响应。在链接还没有建立的状态下,接收端对于接收到的命令(除DISC外)不响应。F功能如果为1表示对接收的命令的响应。接收到非请求的DM响应帧时进行的处理,不考虑F位。

DISC(Disconnect):DISC命令帧用于通知对端拆除链接,对端用UA响应帧应答。如果在DLC0发送DISC命令帧,则等效于退出MUX功能。

  1. 长度

   

 BIT1

BIT2

  BIT3

  BIT4

   BIT5

  BIT6

  BIT7

   BIT8

EA

   L1

   L2

   L3

    L4

   L5

    L6

    L7

    EA用于扩展,本文取EA为1,表示长度域只有一个字节表示。

  1. 信息:信息域由若干字节组成。信息帧有 I 帧、UI 帧和UIH帧,GTM900模块支持UIH帧。
  2. 校验:

校验域只包括1个字节,生成多项式为:x8 + x2 + x + 1。

对于UIH帧,FCS的计算只包括地址和控制域。

对于命令/响应帧,FCS的计算包括地址、控制和长度。(高级模式没有长度域)

注:具体算法请参见GSM协议07.10。

 

   注:关于C/R及P/F位,补充几点:

  1. F功能如果为1表示对接收的命令的响应,F功能为0表示主动报告状态。
  2. 传输数据信息(比如“ATD1861;”)时,在PC-》GTM900方向(见后面应用举例部分),C/R位置为1;在GTM900-》PC方向,C/R位置为0;两个方向P位都位0。
    1. 基本模式的帧结构

      基本模式的帧结构如下:

     

标记

地址

控制

长度

信息

校验

标记

1字节

1字节

1字节

1或2字节

整数个字节

1字节

1字节

                                  图 X: 基本模式的帧结构

    1. 高级模式的帧结构

高级模式的帧结构如下:

     

标记 

地址 

控制 

信息 

校验  

标记  

1字节 

1字节 

1字节  

整数个字节

1字节 

1字节 

                                  图 X: 高级模式的帧结构

      注:没有长度域。

 

当中CRC8计算:

一、数组方式

const unsigned char  crctable[256] = {	//reversed, 8-bit, poly=0x07
	0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75,  0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
	0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69,  0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
	0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D,  0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
	0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51,  0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,

	0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05,  0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
	0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19,  0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
	0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D,  0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
	0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21,  0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,

	0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95,  0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
	0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89,  0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
	0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD,  0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
	0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1,  0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,

	0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5,  0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
	0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9,  0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
	0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD,  0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
	0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1,  0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
};


uint8_t transmitter_crc8_calculate(uint8_t  *pchBuffer,uint16_t hwSize)
{
    /*Init*/
    unsigned char FCS=0xFF;
    
    if(NULL == pchBuffer || !hwSize){
        return 0;
    }    
    
    /*len is the number of bytes in the message, p points to message*/
    while (hwSize--) {
        FCS=crctable[FCS^*pchBuffer++];
    }
    /*Ones complement*/
    FCS=0xFF-FCS;
    
    return  FCS;
}


bool receiver_crc8_calculate(uint8_t  *pchBuffer,uint16_t hwSize,uint8_t    chFCS)
{
    /*Init*/
    unsigned char FCS=0xFF;
    
    if(NULL == pchBuffer || !hwSize){
        return false;
    }
    
    /*len is the number of bytes in the message, p points to message*/
    while (hwSize--) {
        FCS=crctable[FCS^*pchBuffer++];
    }
    /*Ones complement*/
    FCS=crctable[FCS^chFCS];
    /*0xCF is the reversed order of 11110011.*/
    return (0xCF == FCS);
//    if (FCS==0xCF) {
//        /*FCS is OK*/
//        return true;
//    }
//    else {
//        /*FCS is not OK*/
//        return false;
//    }
}

二、计算方式

unsigned char crc8(unsigned char *ptr, unsigned char len)
{
	unsigned char i; 
	unsigned char crc=0xFF; 
	while(len--)   
	{
		for(i=1; i!=0; i*=2) 
		{
			if((crc&1)!=0)
			{
				crc >>= 1;
				crc ^= 0xE0;
			} 
			else 
			{
				crc >>= 1;
			} 
			if((*ptr&i)!=0) crc ^= 0xE0;     
		}   
		ptr++; 
	} 
	return(0xFF - crc); 
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值