UART 和 N_GSM协议 及 linux设备驱动TTY关系

本文深入探讨CMUX(Connection Multiplexing)协议,一种允许在单一物理串口上虚拟多个独立通道的技术。适用于蜂窝模块通信,可在同一串口上同时传输AT命令、PPP数据等,有效解决资源限制问题。文中提供了基于Linux系统的实现方法及代码示例。
摘要由CSDN通过智能技术生成

UART

这个文章写得东西不少

  https://blog.csdn.net/daocaokafei/article/details/113664078?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

 我在结合我的理解和 经验说下。

     uart 是调试外设常用的 接口,他有自己的特点, 异步传输,简单校验,协议简单,所以广泛应用

     tty是linux driver里面一个比较大的子系统,涉及关联到 linux系统好多功能,通讯,网络,显示。

    代码位置一般在 linux/driver/tty/serial 里面是 串口uart的驱动,好多是

    一般平台都支持uart 功能,基本满足并沿用8250 driver, 有些没有用8250 驱动,、

有时间补上这个8250 驱动框架

 

 

 

gsm0710 和 n_gsm.c

一定要好好揣摩cmux的 协议 才能看懂 n_gsm,换句话说,n_gsm里面就实现了 cmux 的功能,

 

---------------------------------------------------------面这段是摘自其他网友的内容-----------------------------------------------------------------srart

1.CMUX( Connection Multiplexing ),即连接(串口)多路复用,其功能主要在一个真实的物理通道上虚拟多个通道,每个虚拟通道上的连接和数据通讯可独立进行。

CMUX 的设计需求来自于蜂窝模块:蜂窝模块作为一种基础通信模块,设计时就有电话,短信,上网等需求,但通常模块上的片上外设资源比较少,于是 GSMMUX 应运而生。

GSM0707/GSM0710 协议提供了解决问题的方法,在同一个串口上同时传输 AT, PPP, MODEM 等数据而互不干扰,也就是可以传输电话,上网,短信等数据。

2. 为什么使用 CMUX

GSMMUX 可以解决在一个串口上与蜂窝模块通信传输多种数据的场景,那 CMUX 就同样可以解决在两个 CMUX 上只使用一个物理串口传输多种 APP 数据的使用场景。

这就是我们 CMUX 软件包推出的目的,一方面可以兼容 GSMMUX ,实现 PPP 与 AT 模式同时进行,解决之前 PPP 数据单独占用物理串口,而无法实时查询模块状态的问题;另一方面,也可以由两块 MCU 在搭载 CMUX 的情况下仅使用一个物理串口实现多种传输场景的需求。

3. 软件包介绍

3.1 框架图

CMUX 是一种类似于传输层的协议,用户使用时无法感知该层;数据传输依赖一个真实串口传输,cmux 层负责解析数据用以分发到不同的 virtual uart ;从而实现一个真实串口虚拟出多个 UART 的目的

CMUX 在应用场景中多用于 UART, 如有必要也可以支持 SPI 方式

3.2 功能介绍

支持所有基于 GSM0707 / GSM0710 协议的蜂窝模块

兼容 PPP_DEVICE 软件包,实现 CMUX+PPP 场景,在一个串口上同时传输 AT 命令与 PPP 数据;解决PPP 通信独占一个物理串口的问题

CMUX 的 GSM 功能已经在 Luat Air720, SIM7600, SIM800C 模块测试通过

支持通过一个真实串口虚拟出多个串口

CMUX 协议限制,理论上一个物理串口最多可以虚拟出 63 个虚拟串口

虚拟出的串口使用与真实串口一致,拥有 open,write,read 操作,设置 rx_indicate 接收回调

两方的 MCU 接收时要注意 DLCI ( Data Link Connection Identifier ) 数据链路连接接标识,相同的 DLCI 才可以互相正常通信

 

---------------------------------------------------------面这段是摘自其他网友的内容-----------------------------------------------------------------end

大致意思是  我们要进行多个串口通讯,但是串口不够或者说通过其他方法 减少串口数量,也能完成串口通信而产生的一个但串口当做多串口服用的 协议。

下面是协议简约说明  

https://blog.csdn.net/jyqxerxes/article/details/78814119?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control&dist_request_id=1329187.21486.16179562540037837&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control

其他博友有两个文章 写的挺好,但是我要在补充协议,

https://blog.csdn.net/chenliang0224/article/details/79314105

https://blog.csdn.net/chenliang0224/article/details/79200862

要看懂上面的协议才能好理解 n_gsm,为啥要栋这个协议呢。我调试一个gsm 模块的的时候,需要此功能,前期需要建立 多通道的建立,通道一直建立不成功,那就要看下串口数据了。

我的逻辑分析仪 解析不了这个协议,那就要我自己看懂协议对比协议发现问题点。

linux document 目录下有个n_gsm.txt文件 

代码流程已经给出来了,我在安卓linux 测试过可用
 

    int ldisc = N_GSM0710;
    struct gsm_config c;
    struct termios configuration;

    /* open the serial port connected to the modem */
    fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);     //打开串口

    /* configure the serial port : speed, flow control ... */                            //配置串口 也许需要流控制属性,这就需要ap端有流控的gpio

    /* send the AT commands to switch the modem to CMUX mode
       and check that it's successful (should return OK) */
    write(fd, "AT+CMUX=0\r", 10);                                                                //通常会发 AT+CMUX=??????    这个????? 要 视模块自定义的协议而定 ,正常会回复OK信息

    /* experience showed that some modems need some time before
       being able to answer to the first MUX packet so a delay
       may be needed here in some case */
    sleep(3);                                                                                                  // 给模块个时间切换下 

    /* use n_gsm line discipline */
    ioctl(fd, TIOCSETD, &ldisc);                                                                  //  ldisc = N_GSM0710  ,此处开始linux tty向cmux 链路转换  会调用 gsmld_open 

                                                                                                                 

    /* get n_gsm configuration */
    ioctl(fd, GSMIOC_GETCONF, &c);                                                       
    /* we are initiator and need encoding 0 (basic) */
    c.initiator = 1;
    c.encapsulation = 0;
    /* our modem defaults to a maximum size of 127 bytes */
    c.mru = 127;
    c.mtu = 127;
    /* set the new configuration */
    ioctl(fd, GSMIOC_SETCONF, &c);                                           // 会  调用 数据链路 N_GSM0710的 gsmld_open ,如果这个函数跑过去基本上就ok了,这里面会进行第一次cmux通讯 

                                                                                                     // 这里面涉及到一些属性和模式     c.encapsulation 普通模式还是高级模式   c.mtu  c.mru默认收发包的数量 这些都看通讯模块

    /* and wait for ever to keep the line discipline enabled */        // 这里 需要让这个进程保持带后台不要关闭就行 
    daemon(0,0);
    pause();

4- create the devices corresponding to the "virtual" serial ports    // 可能是低版本需要自己创建设备节点吧 ,我用心4.x的内核不需要手动创建,上面如果tty数据链路建立成功代码会自动注gsmttyx   64个虚拟串口设备出来                                                                                                  

MAJOR=`cat /proc/devices |grep gsmtty | awk '{print $1}`
for i in `seq 1 4`; do
    mknod /dev/ttygsm$i c $MAJOR $i
done

如果没有创建出设备或者建立数据链路就是前面 第一次cmux通讯 出现问题,(很有可能是 ,模块没有回复ok 回来,这个时候要查下 串口内容 对下协议 ,具体要自行视情况分析了)

get n_gsm configuration   第一次通讯的时候先发的是advanced 模式的三次通信信息,  如果你的模块只支持模式是basic 

估计要等advanced 模式三次结束后才到 ,会发basic cmux 信息F9xxxxxxxxxx 串口信息,并收到应答信息。

 

如果上面都正常了接下来 ,发生正常的数据封装功能了 

----------------------------------------------------引用开始------------------------------------------------------------------------

 通过MUX虚拟串口1发送AT
 终端发送:gsm_data_kick: 00000000: f9 07 ef 03 41 d4 f9  //往 /dev/gsmtty1发送一个字符 ‘A’       
   gsm_data_kick: 00000000: f9 07 ef 03 54 d4 f9    //往 /dev/gsmtty1发送‘T’
 终端接收:gsmld_receive: 00000000: f9 05 ef 0d 0d 0a 4f 4b 0d 0a 5f f9 //接收”ok“---有的模块要多个一个\r\n 才会收到 OK \r\n

------------------------------------------------------引用结束----------------------------------------------------------------------

我没有留下之前在抓的波形图,但是意思和上面一样  ,就是串口数据,f9 07 ef 03 41 d4 f9  中41 是数据内容 'A' ,其他字段是协议规定的 例如 模式 通道 长度 校验  等信息

 

 

 

 

 

 

 

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值