Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
- Chapter1. Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
- 1、LUA简介
- 2、LUA脚本的解释器和编译器
- 3、C环境中内嵌LUA执行LUA函数调用
- 4、Qt内嵌LUA执行LUA函数调用
- 5、运行结果
- 6、内嵌LUA脚本在实际项目中的案例应用
Chapter1. Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
参考链接1:https://blog.51cto.com/u_15950551/6031885
参考链接2: https://blog.csdn.net/qq_23345187/article/details/112710677?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-112710677-blog-87274903.235%5Ev38%5Epc_relevant_sort_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-112710677-blog-87274903.235%5Ev38%5Epc_relevant_sort_base3&utm_relevant_index=7
1、LUA简介
LUA是一个脚本语言,由标准C编写而成,几乎在所有操作系统和平台上都可以编译、运行,可以很方便的嵌入到其他C/C++环境中,如Qt、VS2012等。
一般的lua脚本文件的后缀为.lua,移植lua源码异常的简单,下载源码包后,直接编译即可,因为上面我们说过了LUA是用标准C编写的,所以几乎你常见的编程环境它都能编译LUA。
LUA源码下载地址: http://www.lua.org/ftp/
下载lua-5.1.5.tar.gz然后解压。
将以上这些文件除了lua.c和luac.c加入到你的开发环境中进行编译,就算移植完成了!
lua.c和luac.c中都有main函数,需要分别编译这两个我文件,其中,lua.c编译出来是解析器,luac.c编译出来是编译器。
2、LUA脚本的解释器和编译器
Q:什么是解释器和编译器?
A:
解释器:顾名思义,就是对LUA进行解释说明,能够认识出LUA脚本并运行
编译器:对LUA脚本文件进行编译,生成可以供解释器运行的LUA可执行程序
我使用lua源码包版本在windows下编译出了可执行文件,其中:lua.exe为解释器,luac.exe为编译器。
3、C环境中内嵌LUA执行LUA函数调用
这里我使用的C开发环境是:Eclipse C/C++配合MinGW。
移植很简单的,将lua源码除了lua.c和luac.c之外,其他源码加入到工程即可。
4、Qt内嵌LUA执行LUA函数调用
移植很简单的,将lua源码文件除了lua.c和luac.c之外,加入到Qt工程即可。
我为了方便管理,将lua源码放到了一个目录里,然后放到mainwindow.cpp同文件夹下:
然后编译工程即可。
5、运行结果
lua文件
test.lua
function sum(x,y)return x + y + 61
end
test2.lua
local num=testfuction(10);
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>#include <stdio.h>extern "C"
{
#include "lua/lua.h"
#include "lua/lauxlib.h"
#include "lua/lualib.h"
}lua_State *L;
int countsum(int x,int y)
{int sum;lua_getglobal(L,"sum");//指向需要调用的lua函数//压入参数lua_pushnumber(L,x);//压入第一个参数lua_pushnumber(L,y);//压入第二个参数//调用函数lua_pcall(L,2,1,0); //压入两个参数,返回一个结果//取得结果sum = (int)lua_tonumber(L,-1); //取得栈顶元素lua_pop(L,1); //清理栈return sum;
}int setnum(int num){return 100-num;
}static int testfuction(lua_State* L)
{int num = (int)lua_tonumber(L, -1); //从lua中取得一个数lua_pushnumber(L, setnum(num));qDebug()<<"fuction start!!!!!\n";qDebug()<<"lua input number is"<<num;return 1;
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{L = luaL_newstate();//新建lua虚拟机luaL_openlibs(L);//加载lua的string math等库luaL_dofile(L,"test.lua");//绝对路径 执行脚本文件int sum = countsum(100,200);qDebug()<<"test result is"<<sum;lua_close(L); //关闭lua文件lua_State* L = lua_open();luaopen_base(L);// C++的函数和封装函数都必须是静态的,不可以是非静态的lua_register(L, "testfuction", testfuction);luaL_dofile(L, "test2.lua"); //绝对路径lua_close(L);}
6、内嵌LUA脚本在实际项目中的案例应用
上面已经介绍了LUA脚本及内嵌入C/C++环境,那么实际的使用场景是怎样的呢?
下面就举一个实际的使用案例。
现在有一个嵌入式相关项目,使用Qt做一款上位机软件,通过串口和下位机进行通信,通信协议为modbus,下位机为各类485型传感器。
目前有一个温度传感器需要接入上位机、一个水浸入检测传感器需要接入;
水浸传感器是开关量传感器,只有0和1两种状态;
温度传感器是数字量传感器,厂家为了迎合modbus协议并且为了数据好处理,将浮点格式的温度值扩大了10倍进行传输,例如28.5度扩大10倍是285,将285通过modbus进行传输。
那么现在问题就来了,温度传感器和水浸传感器虽然通信协议是一致的,上位机通过modbus接收到传感器数据后:
如果是温度传感器的,那么需要除以10倍才能得到正确的温度值;
但是如果是水浸传感器就不用除以10倍;
而此时如果还有一个VOC传感器需要接入,并且上位机需要将读取到的VOC数值进行一个复杂的公式转换成THC后在显示;
这时候你就会发现,每一个传感器都有不一样的最终值计算方式,难道要将所有传感器的计算格式方式都包含进上位机中吗?
简单的加减乘除还可以包含进上位机中,如果是VOC转THC这种复杂计算公式的,你怎么包含进去呢?
所以,这就体现了LUA的用处!
办法如下:
在上位机中嵌入LUA,编写一个mylua.lua脚本文件,里面就一个getValue函数。
当上位机接收到传感器数值时,通过LUA提供的API函数,将该数值传入getValue.lua脚本中的getValue函数,然后在获得getValue的返回值,
而在getValue中实现了数值的转换或计算,由于getValue.lua脚本文件是独立于上位机的,可以随便更改函数体,当传感器是水浸时,getValue直接返回输入的值即可,当传感器是温度时,getValue返回输入的值除以10即可;
所以这样就实现了上位机针对不同传感器的数据处理!
相关文章:

Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行 Chapter1. Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行1、LUA简介2、LUA脚本的解释器和编译器3、C环境中内嵌LUA执行LUA函数调用4、Qt内嵌LUA执行LUA函数调用5、运行结果6、内嵌LUA脚本在实际项目中的案例应用 Chapter1…...

超详细 | 模拟退火算法及其MATLAB实现
模拟退火算法(simulated annealing,SA)是20世纪80年代初期发展起来的一种求解大规模组合优化问题的随机性方法。它以优化问题的求解与物理系统退火过程的相似性为基础,利用Metropolis算法并适当地控制温度的下降过程实现模拟退火,从而达到求解…...

在线餐饮油烟实时监测系统的设计与实现
安科瑞 华楠 摘 要:为了解决传统油烟检测方法中成本高、效率低、实时性差等问题,设计开发了一种在线油烟实时监测系统;系统由采集、通讯、服务器和用户交互四个模块组成;采集模块采集油烟数据,通过GPRS通讯技术将数据发…...
7-2 凯撒密码 (20分)
7-2 凯撒密码 (20分) 为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单…...
LeetCode_贪心算法_中等_763.划分字母区间
目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍…...

【算法提高:动态规划】1.5 状态压缩DP TODO
文章目录 状态压缩DP例题列表棋盘式1064. 小国王⭐🐂(好题!)做题套路总结 327. 玉米田(好题!🐂 和1064. 小国王差不多的题目)292. 炮兵阵地(和上面两道题差不多ÿ…...

建网站一般使用Windows还是liunx好?
建网站一般使用Windows还是liunx好? 1;服务器配置比较低时,最好使用linux系统。 对于一个电脑新手,刚开始做网站时,都会选择入门级的服务器,我刚开始做网站时,就是这样的。我购买了一台入门级服…...

NodeJs后端项目使用docker打包部署
docker安装看之前的文章 默认已经安装好docker并且配置没有问题 拉取项目 https://gitee.com/coder-msc/docker-node 本地跑一个看看 pnpm install pnpm start 本地访问 http://localhost:1301/getname?name%E5%93%88%E5%88%A9%E6%B3%A2%E7%89%B9项目整个上传服务器 查看…...

ARM单片机中断处理过程解析
前言 中断,在单片机开发中再常见不过了。当然对于中断的原理和执行流程都了然于胸,那么对于ARM单片机中断的具体处理行为,你真的搞清楚了吗? 今天来简单聊一聊,ARM单片机中断处理过程中的具体行为是什么样的…...
关于SEDEX会员与平台的相关问题汇总
【关于SEDEX会员与平台的相关问题汇总】 01.会员资格有效期是多久? Sedex会员资格有效期为12个月,您也可以选择更长期的会员资格。您支付会员年费时,在“订阅信息”框下的“延长订阅期限”中输入年数,即可获得更长的会员资格时效。…...

解读Spring-context的property-placeholder
在spring中,如果要给程序定义一些参数,可以放在application.properties中,通过<context:property-placeholder>加载这个属性文件,然后就可以通过value给我们的变量自动赋值,如果你们的程序可能运行在多个环境中&…...

【Rust】枚举类型创建单链表以及常见的链表操作方法
目录 单链表 用枚举表达链表 枚举enum Box容器 创建节点 1. 创建并打印 2. match 匹配 3. 节点初始化 4.节点嵌套 追加节点 1. 尾插法 2. 链表追加方法 3. 头插法 4. 改写成单链表方法 遍历链表 1. 递归法 2. 递推法 3. 改写成单链表方法 自定义Display tr…...

Excel 两列数据中相同的数据进行同行显示
一、要求 假设您有两个列,分别是A列和B列,需要在C列中找出A列对应的B列的值。 二、方案 方法1:寻常思路 凸显重复项对A列单独进行筛选–按颜色进行排序,然后升序对B列重复上述操作即可 方法2:两个公式 VLOOKUP 纵向查找…...

Windows本地安装配置Qcadoo MES系统
简介 Qcadoo MES是一款功能强大且灵活的开源MES(制造执行系统),旨在为制造业务提供全面的管理和监控解决方案。本篇博客将教您如何在Windows操作系统上安装和配置Qcadoo MES系统,以便您能够轻松管理和监控制造过程。 环境要求 …...

涛思数据与拾贝云达成战略合作,携手赋能工业数字化转型
2023 年 7 月 27 日,北京涛思数据科技有限公司(以下简称“涛思数据”)与广州拾贝云科技有限公司(以下简称“拾贝云”)于广州签署战略合作协议。双方围绕电力行业的需求与痛点展开积极讨论,就如何量身打造最…...

nginx 配置多域名多站点 Ubuntu
nginx 配置多域名多站点 Ubuntu 一、安装 nginx apt install nginx二、配置文件说明 nginx 的配置文件在 /etc/nginx 目录下,它的默认内容是这样的 root2bd0:/etc/nginx# ll total 72 drwxr-xr-x 8 root root 4096 Jul 31 15:21 ./ drwxr-xr-x 104 root root …...
Docker实践:使用Docker搭建个人开发环境(极简版)
文章目录 说明教程1. 编写 Dockerfile2. 编写 docker-compose.yml3. 使用容器创建容器启动容器进入容器命令行VSCode 4. 关闭容器5. 备份容器导出导入 6. 重置容器 相关资料文章合集详细了解本文在个人电脑上安装 Docker容器使用 NVIDIA 显卡托管镜像运行GUI程序 说明 本文是在…...

SQL从三个表中根据时间分别查询并汇总数量一行展示
需求:如果您要从三个表中根据时间分别查询并汇总数量,然后将结果以时间和数量一行展示,可以使用子查询和条件聚合。 入库主表 入库明细表 出库主表 出库明细表 退货主表 退货明细表 SQL代码 SELECT time,sum(a.inQty) as inQty,sum(a.outQty…...

同样是跨端框架,React会不会被VUE取代?
看到知乎上有比较多的类似问题,正好这两个框架在以往的一些项目中都有实践过,就借着本篇文章说说我个人的看法。 先摆个结论:不会,毕竟各有千秋,除非跨端框架有被更好的概念所替代,又或者App已经彻底过气了…...

Excel·VBA定量装箱、凑数值金额、组合求和问题
如图:对图中A-C列数据,根据C列数量按照一定的取值范围,组成一个分组装箱,要求如下: 1,每箱数量最好凑足50,否则为47-56之间; 2,图中每行数据不得拆分; 3&…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果发送和接收都必须准备好࿰…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...