• 欢迎大家分享资料!前往留言板评论即可!

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

合宙 模组资料网 2年前 (2021-05-15) 362次浏览 0个评论 扫描二维码
                        <div style="border-top: none; border-right: none; border-left: none; border-image: initial; border-bottom: 1pt solid rgb(238, 238, 238); padding: 0cm 0cm 4pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">

一、硬件概述

            本文描述了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、串口数据乱码

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

  

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

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管脚数据,确认下高电平和低电平电压是否正确


转载请注明原文链接:Air系列模块Lua版本串口功能汇总
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址