Luat 功能开发教程(十五) 虚拟 AT

本文介绍了虚拟AT(VAT)技术,它是一种不依赖物理串口,通过软件接口实现AT指令通信的方法。内容包括VAT的实现方法,如设置回调函数ril.setrilcb和发送AT指令ril.request,以及示例代码展示如何处理和响应AT指令。此外,还提到了常见问题,例如LUAT不支持CIP开头的网络通信指令,并提供了相关开发板购买链接。
摘要由CSDN通过智能技术生成

简介

虚拟AT 也叫 VAT , ‘V’ 的英文就是 virtual 虚拟的意思; ,传统的AT 是上位机何下位机之间的通信指令,通常是通过物理串口进行交互;VAT 则不依赖具体的硬件串口,而是通过软件接口来实现等效功能,所以称它为虚拟AT.

实现方法

##命令一
ril.setrilcb(cb)
参数cb 是一个回调函数, 用于将底层AT 指令返回的内容通过cb 输出到指定通道(如示例中的:usb_write ),或者应用自己的处理函数
##命令二
ril.request(strcmd)
参数 strcmd 就是用户要发给底层的 AT指令字符串。

示例

--- 模块功能:MYVAT
-- @author JWL
-- @license MIT
-- @copyright HEZHOU
-- @release 2020.04.02

require"ril"
require "utils"
require "sys"
require "pm"
require "net"
require "record"
require "audio"
require "rtos"
require "misc"
require "common"

module(..., package.seeall)

--开机就关掉RNDIS 否则物联网卡流量会被网卡给消耗掉。
ril.request("AT+RNDISCALL=0,1")

--VAT是否打开 "1" 开 ,"0" 关
local flag_enatc = "1" 
-- 串口ID,串口读缓冲区
local  recvQueue =  {}
-- 串口超时,串口准备好后发布的消息
local uartimeout, recvReady,RECV_MAXCNT = 100, "UART_RECV_ID",1024

--向PC 写入数据,目的是将AT指令的返回数据呈现给电脑一方
local function usb_write(data)
    uart.write(uart.USB, data) 
end

--配置USB 的虚拟串口
uart.setup(uart.USB, 0, 0, uart.PAR_NONE, uart.STOP_1)
uart.on(uart.USB, "receive", function()
    table.insert(recvQueue, uart.read(uart.USB, RECV_MAXCNT))
    sys.timerStart(sys.publish, uartimeout, recvReady)
end)

--处理PC 发过来的AT 指令
function app_procmd(str_recv)
    log.info("str_recv------------",str_recv)

    local flag_handled=true    --用来判断AT指令是否已经被应用层处理,如果已经被处理的就不需要发到底层去了。
    local str_rsp =""          --临时存放应用层已经处理的AT指令返回字符串

    local prefix = string.match(str_recv, "[aA][tT](%+%u+)")
    if prefix ~=nil then
        
        if prefix == "+RIL?" then     --读取VAT标志开关标志
            str_rsp = "+RIL:"..flag_enatc
        elseif prefix == "+RIL" then  --设置VAT 开或者关     
            local temp_enatc = string.match( str_recv, "+RIL=(%d+)")
            if temp_enatc ~= nil then
                flag_enatc = temp_enatc
            end
            if flag_enatc == "0" then  ril.setrilcb(nil) end
            str_rsp = "+RIL:"..flag_enatc
        else
            flag_handled=false
        end
    else
        if  string.upper(str_recv) =="AT\r\n" then
            str_rsp ="OK\r\n"
        else
            flag_handled=false
        end
    end

    if str_rsp ~="" then
        usb_write(str_rsp)
    end

    if (not flag_handled) and (flag_enatc == "1") then
        log.info("send at cmd ==>" ,str_recv)
         ril.setrilcb(usb_write)
         ril.request(str_recv)
    end
end

--将从VAT 串口收到的内容进行拼接
sys.subscribe(recvReady, function()
    local str_recv = table.concat(recvQueue)
    recvQueue = {}
    app_procmd(str_recv)
end)


常见问题

1,VAT 的指令和标准AT 指令,大部分都相同,由于标准AT 指令里面的CIP 开头的网络通信指令在LUAT 中通过 socket 接口实现,所以LUAT 不支持CIP 的AT 指令。
2,PC 端输入的AT 指令需要大写,比如 AT+CSQ 不要写成 At+CsQ

相关资料以及购买链接

测试源码

myvat.lua

相关开发板购买链接

Air724UG开发板
Air724 开发板使用说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值