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即可;

所以这样就实现了上位机针对不同传感器的数据处理!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/74438.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迁移学习(新人必看)

先说一下深度学习常见的问题&#xff1a; 1.数据集不够&#xff0c;通常用数据增强解决。 2.参数难以确定&#xff0c;训练时间长&#xff0c;这就需要用迁移学习来解决 什么叫迁移学习呢&#xff1a;比方说有一个对100w的自行车数据集&#xff0c;并用VGG模型训练好的网络&…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

第一百二十一天学习记录:线性代数:矩阵乘法运算(宋浩板书)

在编程和学习数据结构的过程中&#xff0c;发现有些算法会用到矩阵和矩阵的乘法运算&#xff0c;因此先将这一个知识点学习一下。 矩阵和行列式的区别 各种矩阵的概念 矩阵运算 乘法☆ 总结三条不满足

【前端|Javascript第1篇】一文搞懂Javascript的基本语法

欢迎来到JavaScript的奇妙世界&#xff01;作为前端开发的基石&#xff0c;JavaScript为网页增色不少&#xff0c;赋予了静态页面活力与交互性。如果你是一名前端小白&#xff0c;对编程一无所知&#xff0c;或者只是听说过JavaScript却从未涉足过&#xff0c;那么你来对了地方…

【二等奖方案】Web攻击检测与分类识别赛题「爆汁大橘少糖」团队解题思路

2022 CCF BDCI 数字安全公开赛 赛题「Web攻击检测与分类识别」 地址&#xff1a;http://go.datafountain.cn/4Zj 爆汁大橘少糖战队获奖方案 团队简介 团队成员来自海康威视研究院&#xff0c;目前从事大数据算法相关的工作&#xff0c;具有丰富的数据挖掘实践经验。曾获得过…

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 Python代码实现

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 1 题目 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、压力等…

MySQL操作命令详解:增删改查

文章目录 一、CRUD1.1 数据库操作1.2 表操作1.2.1 五大约束1.2.2 创建表1.2.3 修改表1.2.3 删除表1.2.4 表数据的增删改查1.2.5 去重方式 二、高级查询2.1 基础查询2.2 条件查询2.3 范围查询2.4 判空查询2.5 模糊查询2.6 分页查询2.7 查询后排序2.8 聚合查询2.9 分组查询2.10 联…

C高级DAY2

1.思维导图 2. 递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 递归实现&#xff0c;输入一个数&#xff0c;输出这个数的二进制c 写一个脚本&#xff0c;包含以下内容&#xff1a; 显示/etc/group文件中第五行的内容创建目录/home/ubuntu/copy切换工作路径到…

MySQL(一)基本架构、SQL语句操作、试图

MySQL系列文章 MySQL&#xff08;一&#xff09;基本架构、SQL语句操作、试图 MySQL&#xff08;二&#xff09;索引原理以及优化 MySQL&#xff08;三&#xff09;SQL优化、Buffer pool、Change buffer MySQL&#xff08;四&#xff09;事务原理及分析 MySQL&#xff08;五&a…

性能优化-react路由懒加载和组件懒加载

背景 随着项目越来越大&#xff0c;打包后的包体积也越来越大&#xff0c;严重影响了首屏加载速度&#xff0c;需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说&#xff0c;直接上干货 路由懒加载 核心代码 import React, { lazy, Suspens…

MySQL数据库——多表操作

文章目录 前言多表关系一对一关系一对多/多对一关系多对多关系 外键约束创建外键约束插入数据删除带有外键约束的表的数据删除外键约束 多表联合查询数据准备交叉连接查询内连接查询外连接查询左外连接查询右外连接查询满外连接查询 子查询子查询关键字ALL 关键字ANY 和 SOME 关…

MySQL 远程操作mysql

可以让别人在他们的电脑上操作我电脑上的数据库 create user admin identified with mysql_native_password by admin; //设置账号密码都为admingrant all on *.* to admin; //给admin账号授权 授权完成

RabbitMQ-API

这里写目录标题 Hello word 模式添加依赖生产者消费者获取信道工具类 Work Queues模式消费者代码 C1开启多线程运行启动 消费者代码 C2生产者代码 消息应答自动应答消息应答的方法Multiple 的解释消息自动重新入队消息手动应答代码消费者API 队列持久化消息持久化不公平分发消息…

MyBatis-基础操作-CRDU

前端页面展示提供对于数据的删除操作&#xff0c;后端为其实现 根据id删除数据&#xff08;D&#xff09; 具体的SQL语句 delete from emp where id 17; 接口方法 Delete("delete from emp where id #{id} ")public int DeleteByID(Integer id); 测试方法 Testpub…

【项目设计】MySQL 连接池的设计

目录 &#x1f449;关键技术点&#x1f448;&#x1f449;项目背景&#x1f448;&#x1f449;连接池功能点介绍&#x1f448;&#x1f449;MySQL Server 参数介绍&#x1f448;&#x1f449;功能实现设计&#x1f448;&#x1f449;开发平台选型&#x1f448;&#x1f449;MyS…

【力扣】 12. 整数转罗马数字 模拟

力扣 12. 整数转罗马数字 解题思路 当某个位数的某个数不为4或9时&#xff0c;高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时&#xff0c;低位对应的字符在高位前面。 根据这一特性&#xff0c;我们进行分类讨论。 1.当数为4时&#xff0c;则对应的罗马数为 10 …

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格&#xff0c;这里有几个简单的步骤&#xff0c;可以帮助您完成这个转换过程。以下是需要注意的事项。 首先&#xff0c;我们先了解OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。然后合理运用…

【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf

要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件&#xff0c;另&#xff1a; A线程循环打印buf字符串&#xff0c;B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321. 不…

C++内存管理

C语言内存管理方式在C中可以继续使用&#xff0c;但是存在一定的缺陷&#xff0c;如使用malloc动态开辟自定义类型对象的空间&#xff0c;无法自动调用构造函数&#xff0c;那就必须我们去显示的调用构造函数&#xff08;一般情况下&#xff0c;构造函数不可以显示调用&#xf…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…