LTE-FAST-UART-AT+CMUX-CMUX

来源:互联网 发布:小鸟云计算 编辑:程序博客网 时间:2024/04/29 06:09

本文主要以记录为主.

这两天在LTE模块上面做了一个CMUX的功能.即多路复用.使用物理串口,通过CMUX协议,虚拟出多个逻辑通道.TS和MS可以在不同通道上面进行不同业务的通信及交互.

道先CMUX功能,是3GPP的标准协议,但是这个功能需要模块进行支持.


下面先放一段交互信息,再逐一解释各数据含义:

//Startor Enable MUX

AT+CMUX=0,0,5  ->start CMUX  (this commod is ascii string,not hex data)

AT+CMUX=0,0,5,30

OK

 

SABM,DLCI 0  //create dlci connection.this isthe channel 0,just for control information.

F9 03 3F 01 1C F9 -->

F9 03 73 01 D7 F9

 

SABM,DLCI 1 //create DLCI data connection 1

F9 07 3F 01 DE F9 -->

F9 07 73 01 15 F9

F9 01 EF 09 E3 05 07 0D 9A F9

F9 01 EF 09 E3 05 07 0D 9A F9

F9 01 EF 09 E3 05 07 0D 9A F9

 

1,AT\r\n    //Send “AT\r\n” by DLCI 1 channel.

F9 07 EF 09 41 54 0D 0A 39 F9 -->

F9 05 EF 07 41 54 0D B2 F9

F9 05 EF 05 0D 0A 51 F9

F9 05 EF 03 0D B5 F9 F9 05 EF 05 0D 0A 51 F9

F9 05 EF 07 4F 4B 0D B2 F9

F9 05 EF 05 0D 0A 51 F9

 

1,AT++CGMR\r\n   //Send “AT+CGMR\r\n” by DLCI 1 channel.

F9 07 EF 13 41 54 2B 43 47 4D 52 0D 0A C8 F9  -->

F9 05 EF 13 41 54 2B 43 47 4D 52 0D 0D A9 F9

F9 05 EF 05 0D 0A 51 F9

F9 05 EF 25 43 4D 5F 30 31 5F 30 30 5F 30 30 5F 30 30 5F38 31 0D 69 F9

F9 05 EF 05 0D 0A 51 F9

F9 05 EF 03 0D B5 F9

F9 05 EF 05 0D 0A 51 F9

F9 05 EF 07 4F 4B 0D B2 F9

F9 05 EF 05 0D 0A 51 F9

 

DISC,DLC1     //disconnect DLC1 ,If you havesend this commond ,when you send data by DLC1,it will response you :

F9 07 53 01 3F F9 -->

F9 07 73 01 15 F9

 

DISC,DLC0

F9 03 53 01 FD F9-->

F9 03 73 01 D7 F9



上面是一段交互信息,首先创建逻辑通道DLCI 0.这个是控制通道.不走数据.

然后建立DCLI 1 这个是数据通道,可以进行AT指令的传输.

之后通过DCL1发送AT指令."AT\r\n"

 会收到数据返回:类似这种:(我是将上面的HEX数据强行转化为字符串,显示下,其中有一些CMUX格式的控制字.但是也可以看到我们输入的AT回显及返回的OK.)

??AT
铲??
Q?
爹??
Q?OK
铲??
Q

这证明我们的DCL1路已经通了,可以进行数据交互了.上面的例子中我还发送了AT+CGMR\r\n,之后它返回了

?AT+CGMR
??
Q?CM_01_00_00_00_81
i?
Q?
爹??
Q?OK
铲??
Q

下面讲一下CMUX建立交互的过程.

我们的模块可以支持1个逻辑控制通道和4个逻辑数据通道.一般情况是,一路走AT,一路走PPP拨号,一路走短信.

首先要创建DCLI 0(逻辑控制通道) 然后创建DCLI 1/2/3/4 (逻辑数据通道)

这时就可以通过 address控制字进行对应的逻辑通道进行通信了.


下面拿一个创建DCLI 0来说明下数据格式.

FLAG 为标志位.basic 为0XF9 advance 为0x7E 我们一般用的全是F9.

ADDRESS 地址域(Address Field):默认E/A为1 C/R也一般为1 后成跟的是DLCI的逻辑通道号.比如 0通道.则为 0000 0011 结果为03 则为DCLI通道0.

                                    通道1则为0000 0111结果为07 通道2则为 0000 1011则为0B 通道3则为0000 1111 结果为0F 依次类推.

Bit No.

1

2

3

4

5

6

7

8

Signal

EA

C/R

DLCI

CONTROL:  这个是控制字了,比较重要.CMUX一共有几种消息格式,都是通过control来进行区别的.

SABM:3F/2F UA:73/53 DM:1F/0F UIH:EF/FF DISC:53/54 UI:13/03  具体是怎么算的,这个就需要啃一下CMUX协议了.百度文库有.可以看一下.                                                   

Frame Type

1

2

3

4

5

6

7

8

备注

SABM (Set Asynchronous Balanced Mode)

1

1

1

1

P/F

1

0

0

 

UA (Unnumbered Acknowledgement)

1

1

0

0

P/F

1

1

0

 

DM (Disconnected Mode)

1

1

1

1

P/F

0

0

0

 

DISC (Disconnect)

1

1

0

0

P/F

0

1

0

 

UIH(Unnumbered Information with Header check)

1

1

1

1

P/F

1

1

1

 

UI (Unnumbered Information)

1

1

0

0

P/F

0

0

0

可选


LENGTH :长度字,E/A位表示的是长度标志位是1字节还是2字节,如果数据超过127个字节.则E/A需要设为0.我们一般使用的时候不会用这么长的数据.都会被置为1.

比如发送"AT\r\n" 这是4个字节. 0000 1001 结果为 09 .再比如发送 "AT+CGMR\r\n" 为9个字节:  0001 0011 结果为13 

Bit No.

1

2

3

4

5

6

7

8

Signal

E/A

L1

L2

L3

L4

L5

L6

L7

 FCS:这个是检验位,正常发送SABM数据时,检验的就是 03 3F 01这三个字结,算一个CRC的值,填到FCS位就行了.计算结果为 1C.(FLAG位中的F9是不参与校验的)

其中UIH数据的时候,也是校验 address control length这三位.  比如归送AT的那条指令:F9 07 EF 09 41 54 0D 0A 39 F9(则只需要校验 07 EF 09 这三位,计算结果为 39)

计算CRC校验的时候,有个工具,叫GCRC.exe 叫格西CRC计算器.图片不显示.手动描术下吧.

算法:CRC8 

多项式:07 初始值:FF

数据反转:LSB first 异或值:FF

数据:HEX.



FLAG    ADDRESS    CONTROL   LENGTH    INFO                         FCS            FLAG

F9           03                   3F                     01                                              1C                F9


F9            07                   EF                    09           41 54 0D 0A             39                F9



可以根据这个格式对比一下就懂了.



如果想断开DLCI连接的时候.使用下面这条指令就是断开DLCI 1 .其他通道同理,替换下address 和 FCS 就好了.

DISC,DLC1     //disconnect DLC1 ,If you havesend this commond ,when you send data by DLC1,it will response you :

F9 07 53 01 3F F9 

如果想断开CMUX回到AT指令模式.则输入 

DISC, DLC0
F9 03 53 01 FD F9

断开逻辑控制通道.这样就可以输入AT指令啦.


如果有想交流的QQ:772016280

0 0