图4 提取表中属性值时的虚拟栈操作示意图
3.3 调用Lua函数设置发送缓冲区
为通过Lua脚本对串口发送缓冲区进行设置,在脚本中定义了如下函数:
data ={0x11, 0x22, 0x33, 0x44, 0x55 };
function uart_p0_set_txBuf()
local port=0;
local p0_send_num=5;
for i=1, p0_send_num do
ied.set_tx_buf(port,i-1, data[i])
end
return p0_send_num
end
从脚本内容可以看出,在此采用了一个Lua中的循环结构对发送缓冲区进行设置,并返回设置的数据个数。其中,全局变量data是Lua脚本中的表,类似于数组,在此表示需要设置的缓冲区内容;ied.set_tx_buf()为在3.1节中提到的已注册到虚拟机中的C函数库中的一个函数。其参数port表示端口号,i-1表示缓冲区索引号,data[i]表示具体的数据内容。在应用中需要注意的是,在Lua中,数组索引默认从1开始,而不像C中从0开始。另外,在C中定义set_tx_buf函数时并未设置参数,这主要是因为参数的提取必须借助于虚拟栈才能实现。在脚本中调用时,对其参数将按照从左到右的顺序依次入栈,在C中要取出参数时,按照其在栈中相应的索引号取出即可。在Lua中对每个函数的调用都有一个独立的栈,因此,若以i取2时调用情况为例,在C函数set_tx_buf中看到的栈内容将如图5所示。