您当前的位置:五五电子网电子知识单片机-工控设备单片机通信基于lua虚拟机脚本语言的嵌入式UART通信方案设计 正文
基于lua虚拟机脚本语言的嵌入式UART通信方案设计

基于lua虚拟机脚本语言的嵌入式UART通信方案设计

点击数:7924 次   录入时间:03-04 11:52:16   整理:http://www.55dianzi.com   单片机通信

    内容摘要:针对变电站中采用UART串口通信规约进行信息传递的各种外围设备,在需要与其进行通信的IED智能装置的开发中,设计了一种基于Lua脚本语言的嵌入式通信方案。通过该方案,可将具体串口报文规约的组建和解析交给Lua脚本进行处理,使设计者在具体装置的软件开发中,仅关注其与外围设备以及Lua脚本间交互接口的设计,而不用关心具体的串口通信规约,从而提供了一种装置串口通信的现场可配置化方案,提高了装置应用的灵活性。
    关键词:Lua;UART;串口通信;智能电子设备

    引言
    随着变电站智能化程度的逐步提高,对温度、湿度等现场状态参量的采集需求也越来越多。就目前而言,在现场应用中,此类设备多采用RS232或RS485等UART串行通信方式和IED(Intelligent EleCTRonIC Device,智能电子设备)装置进行交瓦。一般来说,不同的设备采用的通信数据帧格式并不相同。各式各样的串口数据帧格式,对IED装置的软件定型造成一定的困难。传统的做法一般是由装置生产厂家指定和其配套的外围设备,装置的灵活性不够理想。本文针对此类问题,提出了一种基于Lua脚本语言的解决方案,可有效地提高IED装置对各种类型
串口数据报文帧格式的适应性。该方案将具体串口报文规约的组建和解析交给Lua脚本进行处理,从而使设计者在装置的软件开发中,可仅关注于相关接口的设计,而不用关心具体的串口通信规约,从而方便软件的定型,并提高了装置自身在应用中的灵活性。

1 Lua脚本语言介绍
    Lua是一种源码开放的、免费的、轻量级的嵌入式脚本语言,源码完全采用ANSI(ISO)C。这一点使它非常适合融入目前以C语言为主的嵌入式开发环境之中。两者之间实现交互的关键在于一个虚拟的栈,通过该虚拟栈和Lua提供的可对该栈进行操作的相关接口函数,可以很方便地在它们之间实现各种类型数据的传递。
    与其他脚本语言(如Perl、Tcl、Python等)相比,Lua表现出了足够的简单性以及非常高的执行效率,结合其与平台的高度无关以及充分的可扩展性,这使得它越来越多地得到大家的关注。因此,在本文的方案中优先选用Lua脚本来进行设计。

2 系统方案概述
    本方案主要是围绕着IED装置和外围串口设备之间的通信来进行设计的,系统框架如图1所示。

a.JPG

   
    当IED装置开始运行时,将创建一个用于UART通信的读写调度任务。在该任务中,首先通过Lua提供的接口函数来启动其脚本引擎,并创建Lua虚拟机。然后即可将用户编写的C函数注册到Lua虚拟机中去,并将存在于Flash文件系统巾独立于装置C程序的Lua脚本文件加载到虚拟机中,从而建立起Lua和C的交互环境。在系统应用中,将需要发送到外围设备的具体数据内容都放在Lua脚本文件中。当装置C程序需要发送数据时,通过通信读写调度程序及虚拟机的配合,将这部分数据取出,并调用串口驱动程序发送给外围设备。当收到外围设备发给IED装置的报文时,再将相应数据传给虚拟机中运行的脚小程序进行处理,并由Lua根据数据处理结果来调用已注册的C函数进行相关业务处理。

b.JPG

   



www.55dianzi.com


    本系统的程序流程如图2所示。其中,串口通信芯片采用T1公司的带64字节FIFO的4通道可编程UART芯片TL16C754B来实现。它的4个通道可分别独立编程,在3.3 V的操作电压下,数据传输速率可高达2 Mbps,适合多种UART通信环境中的应用。基于装置的应用环境,本文采用RS485的问答机制并结合查询方式来对该串口通信方案进行设计。在方案实现中,装置将每隔一定时间通过串口芯片发送一次查询报文,当查询到外围没备发送的正确响应报文后,再进行相关业务处理。

3 功能实现
    在嵌入式应用领域,串口通信的应用比较成熟,因此,本文将着重介绍Lua是如何服务于这一应用的。从图2可以看出,Lua的使用主要体现在如下几个方面:
    ◆Lua与C交互环境的建立;
    ◆提取脚本中的串口配置数据;
    ◆调用Lua函数设置发送缓冲区;
    ◆通过Lua函数处理接收缓冲区数据。
3.1 Lua与C交互环境的建立
    要建立交互环境,首先要启动Lua脚本引擎,并创建虚拟机。其机制虽然相对复杂,但对应用来说却比较简单,通过“L=lua_opcn(NUL L);”即可实现。其中,L是一个指向结构类型为lua_State的指针变量,该结构将负责对Lua的运行状态进行维护。
    为了实现Lua脚本函数对系统程序中串口发送和接收缓存区的数据进行访问,定义了几个C函数供脚本调用,即用于设置串口发送缓冲区的函数set_tx_buf、读取串口接收缓冲区的函数get_rx_buf,以及在Lua脚本中判断串口数据交互正常时调用的结果处理函数uart_ok_del。
    在Lua脚本中,要成功调用以上函数,必须将其加载到Lua虚拟机中去,本文采用Lua提供的一种注册C函数库的方法来实现。具体加载过程如下:
    ①按以下格式定义调用函数:
    statIC int set tx buf(lua State *L);
    static int get rx_buf(lua State *L);
    static int uart_ok_del(lua State*L);
    ②声明一个结构数组,每个数组元素分别为C函数在Lua脚本中的渊用名字及对应的C函数,即以“namefunction”对的形式出现,如下所示:
    static const struct luaL_reg uartLib[]={
    {“set_tx_buf”,set_tx_buf},
    {“get_tx_buf”,get_tx_buf),
    {“uart_ok_del”,uart_ok_de},
    {NULL,NULL}
    };
    ③调用以下函数对C函数库进行注册:
    luaL register(L.“ied”,uartLib);
    其中,参数L即为创建虚拟机时的函数返回值(以下同),字符串“ied”为注册到虚拟机中的库名称。第3个参数uartLib即为前面声明的结构数组,对应需要注册的库函数表。
    通过以上步骤,即可完成Lua脚本中需要调用的3个C函数的注册过程,从而就可以在Lua脚本中通过“库名称,库函数”的形式来对其进行调用,如“ied.set_tx_buf(函数参数)”。
    脚本文件本身的加载则相对简单,只需通过如下函数调用即可:
    luaL_dofile(L,“uart script.lua”);
    其中,参数L和以上的函数调用相同,第2个参数则为脚本文件在Flash中的具体存储路径。
    至此,就成功建立了一个Lua与C的交互环境。
3.2 提取脚本中的串口配置数据
    要正确地进行Lua和C的交互过程,首先必须对Lua和C交互时所采用虚拟栈的作用和操作有比较深入的了解。在Lua和C的交互中,它们彼此之间函数参数以及返回值都将由该栈来负责传递。Lua和C在栈的操作方式上稍有不同,在Lua中采用严格的LIFO方式,而C则还可以通过索引的方式进行。以3个参数为例,参数1首先入栈,参数2、3随后顺次入栈,Lua虚拟栈存储结构及索引对应关系如图3所示。

e.JPG

   



www.55dianzi.com


    如需在C中访问参数1,则既可以通过索引号1进行,也可通过索引号-3进行。其中,正索引按入栈顺序从1依次递增,负索引按出栈顺序从-1依次递减。
    通常情况下,串口的配置主要有以下几项:是否使能、数据位数、停止位数、奇偶校验标志位和波特率。因此,在Lua脚本中,本文采用Lua的表结构对其进行设置,示例如下(本文中斜体代码表示为Lua脚本,以下同):
    f.JPG
    该例表示对UART芯片的P0 口进行使能,并且采用8位数据位、1位停止位、偶校验(本文定义parityBit的值取0为无校验,取1为奇校验,取2为偶校验)的帧格式,波特率为9 600 bps。
    在C语言中,要获取表中enable属性字段的值,可采用以下步骤:
    ①调用接口函数并以表名称作为参数,将该表入栈:
    lua_getglobal(L,“uart_p0”);
    ②调用接口函数将enable属性字段的属性名称入栈:
    lua_pushstring(L,“enable”);

[1] [2]  下一页


本文关键字:通信  嵌入式  虚拟机  单片机通信单片机-工控设备 - 单片机通信

《基于lua虚拟机脚本语言的嵌入式UART通信方案设计》相关文章>>>