基于Lua脚本语言的嵌入式UART通信方案设计

时间:2012-05-03来源:网络

本系统的程序流程如图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

1 2 3 4

关键词: UART 通信 方案设计 嵌入式 语言 Lua 脚本 基于

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版