Air系列模块Lua版本串口功能汇总

Lua版本串口、USB口如何使用

一、硬件概述

            本文描述了Air系列模块(2G4G模块)Lua版本上通用串口、调试串口、USB口的特性和使用方法,先看一张对比图:

        

2G模块

4G模块

通用串口

Ø   UART1UART2两个通用串口

Ø   通用串口电平2.8V;如果要和3.3VMCU通信,强烈建议加电平转换电路;如果要和5VMCU通信,必须要加电平转换电路

Ø   不支持流控

Ø   UART1UART2两个通用串口

Ø   串口电平1.8V;如果要和3.3V/5VMCU通信,必须要加电平转换电路

Ø   不支持流控

调试串口

Ø   主要用于烧录固件和抓取日志,波特率固定为921600

Ø   也可特殊处理实现通用串口的数据传输功能,但是不建议使用,因为调试串口数据传输不稳定,很容易丢失数据

不支持

USB

不支持

Ø   主要用于烧录固件和抓取日志

Ø   也可通过枚举出来的ASR Modem Devie AT口实现通用数据传输功能,可参考Lua版本usbdatademo

      若无特别说明,下文中描述的串口包括通用串口、调试串口、USB口三种,描述的串口通信的对端设备称作MCU

二、应用层数据收发原理

            注意:默认状态下,在合适的时间点(此时间点不可预知),系统会自动进入休眠状态;串口数据收发之前,必须通过pm.wake(...)接口使系统持续处于唤醒状态,才能保证收发功能正常;收发结束后,可以通过pm.sleep(...)接口允许系统自动休眠

2.1、数据接收

            core中的应用层,有一个1460字节的缓冲区,串口驱动接收到的数据插入此缓冲区;脚本有轮询和中断两种方式,通过uart.read(...)接口读取缓冲区中的数据;

         需要注意如下两点:

         1、脚本读取的速度要大于数据插入的速度,否则会造成缓冲区溢出,数据出错

         2MCU一次性发送给模块的数据,调用uart.read接口,并不一定能够一次性读取完整,必须使用“循环读取数据”+“数据拼接判断完整性”的方案来处理;例如MCU一次性发送1460字节的数据,模块使用轮询或者中断第一次读取数据时,缓冲器里面可能才接收到10字节的数据

       2.1.1uart.read接口详解

uart.read(id, format)

--- 读取串口数据(此接口不会阻塞,立即返回)

-- @number id 串口ID

-- @string or number format 读取串口数据的格式,有如下几种

-- number类型的数字:表示读取指定长度字节的数据

--     如果缓冲区中没有数据,则返回空字符串,返回值为string类型

--     如果缓冲区中的数据长度小于等于要读取的数据长度,则返回缓冲区中的所有数据,返回值为string类型

--     如果缓冲区中的数据长度大于要读取的数据长度,则返回要读取的长度的数据,返回值为string类型

-- string类型的*l  表示读取到换行符\n

--     如果缓冲区中没有数据,则返回空字符串,返回值为string类型

--     如果缓冲区中的数据没有\n,则返回缓冲区中的所有数据,返回值为string类型

--     如果缓冲区中的数据有\n,则返回到\n结束的所有数据(包括\n),返回值为string类型

-- string类型的*n  表示读取整型数据

--     如果缓冲区中没有数据,则返回0,返回值为number类型

--     如果缓冲区中的第一个字节的数据不是+-、数字,则返回0,返回值为number类型

--     如果缓冲区中的前几个字节满足整型数据格式[+-]%d+,则按照最长匹配返回数据,返回值为number类型

-- string类型的*s  表示读取到空格字符

--     如果缓冲区中没有数据,则返回空字符串,返回值为string类型

--     如果缓冲区中的数据没有空格,则返回缓冲区中的所有数据,返回值为string类型

--     如果缓冲区中的数据有空格,则返回到空格结束的所有数据(不包括空格),返回值为string类型

        

       2.1.2、轮询方式读取数据

         轮询方式比较简单,脚本定时调用uart.read接口读取数据、拼接数据、检查数据完整性、处理数据即可

         详细代码参考uartdemo

       2.1.3、中断方式读取数据

         中断方式处理逻辑如下:

         1、脚本调用uart.on(id, "receive", intFnc)注册中断处理函数intFnc

         2、脚本接收到core中产生的数据中断消息后,执行intFnc

         3、脚本在intFnc中循环调用uart.read接口读取数据、拼接数据、检查数据完整性、处理数据,直至没有数据可读

         什么情况下,core中才会产生数据中断消息呢?当缓冲区为空时,收到数据才会插入缓冲区,然后产生数据中断消息;如果缓冲区不为空,收到数据时仅仅插入缓冲区,并不会产生数据中断消息。所以第3步要把缓冲区中的数据读完,这样才能保证以后收到的数据,可以产生中断消息,脚本可以及时处理

         详细代码参考uartdemo

2.2、数据发送

       脚本使用uart.write接口发送数据,一次性最多支持发送1460字节的数据

         可以通过异步消息来通知脚本数据已经发送成功,参考uartdemo

三、常见问题

3.1api文档在哪里

         http://wiki.openluat.com/doc/luatApi/#uart

         代码详见uartdemo

3.2、休眠、唤醒和功耗控制

         默认状态下,在合适的时间点(此时间点不可预知),系统会自动进入休眠状态;串口数据收发之前,必须通过pm.wake(...)接口使系统持续处于唤醒状态,才能保证收发功能正常;收发结束后,可以通过pm.sleep(...)接口允许系统自动休眠

         如果项目不要求低功耗,为了编程方便,可以调用pm.wake使系统一直处于唤醒状态

         如果项目要求低功耗,除了动态控制休眠唤醒外,还要使用uart.close关闭串口,这样才能完全消除串口功能的功耗

3.32G模块的调试串口可以用来做普通数据传输使用吗

         可以用来做普通数据传输,但是不建议使用,原因有如下两点:

         1、调试串口数据传输不稳定,很容易丢失数据;必须在应用层之上增加重试和容错机制

         2、调试串口主要用于烧写固件和输出日志,有一套专用协议,如果要用做普通数据传输,必须按照这套协议开发对端程序

         有需要的话,参考hostUart的demo

3.44G模块的USB口可以和PC之间进行数据传输吗

         USBPC端映射出的ASR Modem Device AT口可以和PC进行数据传输

         代码详见usbdatademo

3.5RS485通信的收发方向控制

         可使用uart.set_rs485_oe接口配置此功能

         参考:http://wiki.openluat.com/doc/luatApi/#uartset_rs485_oe

3.6、串口无法数据通信

         检查一下串口电平是否匹配,波特率是否匹配,软件上是否进入了休眠

3.7、串口数据乱码

         检查下模块板和主控板的参考地是否有电势差,曾经有一个客户的板子如下图设计 ,通过主控板给模块供电,然后只通过上图排插针通插座的方式连接主板串口,导致地连接的阻抗增加,在弱信号下大功率发射时,会导致模块板和主控板的参考地有电势差,导致串口通信异常

  

3.8、串口接收数据丢失

1.      接收数据前,必须保证系统处于唤醒状态,参考3.2章节

2.      检查下代码接收处理逻辑是否有问题,重点检查如下代码逻辑

local function read()

    local data = ""

    --底层core中,串口收到数据时:

    --如果接收缓冲区为空,则会以中断方式通知Lua脚本收到了新数据;

    --如果接收缓冲器不为空,则不会通知Lua脚本

    --所以Lua脚本中收到中断读串口数据时,每次都要把接收缓冲区中的数据全部读出,这样才能保证底层core中的新数据中断上来,此read函数中的while语句中就保证了这一点

    while true do       

        data = uart.read(UART_ID,"*l")

        if not data or string.len(data) == 0 then break end

        --打开下面的打印会耗时

        log.info("testUart.read bin",data)

        log.info("testUart.read hex",data:toHex())

    end

end

uart.on(UART_ID,"receive",read)

 

3.      参考demo\uart\v1\testUart.lua写一个简单demo,仅仅接收和打印数据,不做其他任何处理,看看数据是否有丢失

4.      pc端通过sscom监控模块的rx管脚,对比看下sscom监控到的数据是否有丢失;同时用示波器监控rx管脚数据,确认下高电平和低电平电压是否正确

  • 发表于 2019-08-15 20:38
  • 阅读 ( 6439 )
  • 分类:默认分类

0 条评论

请先 登录 后评论
不写代码的码农
朱天华

软件工程师

19 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章