基于WINCE6 USBSERIAL 和 LC6311 实现的 多通道复用层(mux)

1. 复用层的概述:

由于此前6311是采用多通道的模式来处理3g模块的一些并发业务的,他硬件里面有6个interface,这样可以通过对每个interface来模拟串口从而达到每个串口独立操作的目的,这些interface在上层看来时完全独立的,互相不收干扰。而由于客户的要求会要用到6311的前一个版本6211,所以需要对6211做一个很好的理解,6211从USBView上看来也是有6个interface的接口的,但是从试验中的到只有AT口能够发送AT命令并且6211和6311的AT手册有些流层还不一样,仔细看手册得到6211在硬件上是有个Mux层的,而我们需要实现一个mux层来和这个mux来握手,实际上我们底下只有一个真正的interface可用。这就是所谓的3gpp_420的那个协议,手册上说6211完全支持复用层协议,所以在上层需要按照420的复用层协议来做。就我的理解是那6个interface他也是能用的,但是必须你先得去激活MUX层,然后通过模块的MUX层来向各个interface来分发。而6311将协议层都做好的封装在硬件层(其实都是软件),而6211没有集成而已。

2.实现方案

 1).串口层和USB层之间方案


 COM3:这是实际暴露给APP的操作串口,是和应用交互的主要手段

CMUXUSBSERIAL:这个主要是一个USBSERIAL类主要是和串口MDD层交互的一个类。

CMUXMANAGER:这个类主要是协议层的管理类,处理DLCI的建立和释放,协议封装,协议解封装,超时处理,重发机制。

INTERFACE:这个类主要是和USBdevice交互的一个类。

初始化:在activedevice之前需要首先初始化整个CMUXMANAGER类,同时直接去利用interface来发送AT+CMUX来启动协议栈。

注意:由于需要利用串口的MDD层所以需要对串口MDD有充分的理解(会在另一篇文章中有分析串口的MDD),USBSERIAL是完全用来跟MDD这个体系来交互的专门的一个类,(在另一篇文章也会有类图的分析),我们不能随便改太多,动一处而牵全身。

    

  2).串口上层的方案

 

710MUX.dll

COM3:这是暴露给APP直接操作的的串口,是和应用交互的主要手段

CMUX:这里面主要是微软的一个DLL,710MUX.DLL.主要做了包括MUX的管理,DLCI的建立和释放,协议的封装和解封装,超时和重发机制的处理。

USER.dll

COM8:主要是一个USB转串口的驱动,使我们写好的一个单独的驱动。

 

3.MUX协议的理解

       多路复用就是将原有的一条物理通道虚拟成几条可并发的逻辑通道,同网络协议中的物理链路,逻辑链路有点类似.实现上也类似,将逻辑通道上的数据打包,加上包头包尾,再发到物理通道上.

                  

上图为建立逻辑通道,发送数据的例子.其中AT+CMUX=0是物理通道上的数据,告诉6211我要进到MUX模式了,6211响应OK.主机依次发送SAMB0,1,2,3,建立编号为0~3的逻辑通道.6211响应UA表示

 

1.包的类型

        规范07-10里一共定义了6种包(不保括Error Recovery Mode)
        Set Asynchronous Balanced Mode (SABM) command
        Disconnect (DISC) command
        这两个包是命令包,用来建立,取消逻辑通道
 
        Unnumbered Acknowledgement (UA) response
        Disconnected Mode (DM) response
        这两个是响应包,分别用来回应正确和错误
 
        Unnumbered information with header check (UIH)
        Unnumbered Information (UI)
这两个可以是命令包,也可以是状态包,区别就是前者不对包的数据部分生成校验码.
 
(2). 模式的类型
07-10支持三种模式,分别是Basic,Advanced,Advance with error recovery.
        其中前两种不支持错误纠正,这里我们也只讨论这两种模式.
 
        Basic模式包格式为
Flag(1B) Adderss (1B) Control(1B) Length(1~2B) Info(Length指定长度,可变) FCS(1B) Flag(1B)
各项含义如下
Flag固定为0xF9
Adderss 逻辑通道编号,类似于MAC地址.bit1 为 E/A,bit2 为 C/R,bit3~8为逻辑通道号.
E/A 为1表示当前字节是否是该项的最后一个字节,这里只能为1
C/R用来指示命令发送方是否是通道发起方,是则为1
如主机建立的逻辑通道1,往该通道上发命令包时,Adderss为0x7,猫响应Adderss也是0x7
Control 为上面说的包类型,其中bit5为P/F,大致可以这么理解,SAMB,DISC包及其响应时,P/F为1(响应为DM时,该位可以是0或1)
 
 
Length 为Info项长度,bit定义依次为 E/A,L1,L2,...,L7,(L8,...,L15),长度小于128时,E/A为1,不编码第二个字节
        Info 类容取决域包类型
 
FCS 为校验码,UIH,UI包的区别就在这里,UIH不对Info项编码,只编码Adderss,Control,Length
 
        Advanced模式包格式为
        Flag(1B) Adderss (1B) Control(1B) Info(不定长) FCS(1B) Flag(1B)
        其中Flag固定为0x7E
 
两种模式的区别就是Advanced模式没有Length一项,而是采取了特定格式编码,来决定包何时结束.
 
 
具体实现就是发包方对Flag除外其他项编码,碰到0x7E,0x7D等字符则在其前插入0x7D,接受方去掉相应0x7D.这样碰到单独的0x7E则表示包的结束和开始.
 
4.USB传串口的类分析图
 
 
 
5.串口MDD层的
如上图COM层就是MDD层。
COM_init.这个函数是在通过注册表加载或者通过activedevice这个函数开始加载时调用的,他主要的作用是为每个串口创建了一个非常重要的结构体HW_INDEP_INFO,,这个结构体中拥有一些我们非常关心的重要成员。
PHWOBJ, hTransmitEvent, hReadEvent, RX_BUFFER_INFO, TX_BUFFER_INFO.
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值