esp32集成lua

发布时间:2026/9/12 4:40:08

esp32集成lua 参考lua在线运行.luatoslua菜鸟教程.runoob嵌入式终端AtShell的精简版.csdn工程目录要下载 lua-5.4.2.tar.gzlib/ └──lua-5.4.2/src/* └──src └──── LuaEngine.h └──── LuaEngine.cpp └──── LuaGPIO.h └──── LuaGPIO.cpp └──── main.cpp platformio.ini源码platformio.ini[platformio]src_dir.[env:pico32]platformespressif32 boardpico32 frameworkarduino monitor_speed115200monitor_portCOM3 upload_portCOM3 upload_speed921600build_flags-Isrc-Ilib/lua-5.4.2/src-DLUA_32BITSbuild_src_filtersrc/lib/lua-5.4.2/src/-lib/lua-5.4.2/src/lua.c-lib/lua-5.4.2/src/luac.cmain.cpp#includeArduino.h#includeLuaEngine.h#includeLuaGPIO.hstructMotor{intspeed;floatvoltage;bool enable;};Motor motor;intg_mode;floatg_vol;LuaField motorFields[]{{speed,LUA_FIELD_INT,offsetof(Motor,speed),0},{voltage,LUA_FIELD_FLOAT,offsetof(Motor,voltage),0},{enable,LUA_FIELD_BOOL,offsetof(Motor,enable),0}};staticintshowMotorInfo(lua_State*L){printf(g_mode%d\r\n,g_mode);printf(g_vol%f\r\n,g_vol);printf(motor.speed%d\r\n,motor.speed);printf(motor.voltage%f\r\n,motor.voltage);printf(motor.enable%d\r\n,motor.enable);return0;}voidsetup(){Serial.begin(115200);Lua.init();luaRegisterGPIO();//绑定变量LUA_BIND_INT(g_mode);LUA_BIND_FLOAT(g_vol);LUA_BIND_STRUCT(motor,motorFields,3);//绑定函数LUA_BIND_FUNC(showMotorInfo);Serial.println(Lua Ready);}String script;voidloop(){while(Serial.available()){String lineSerial.readStringUntil(\n);line.trim();if(lineEND){Lua.run(script.c_str());script;}else{scriptline;script\n;}}}LuaEngine.h#ifndefLUA_ENGINE_H#defineLUA_ENGINE_HexternC{#includelua.h#includelauxlib.h#includelualib.h}#includestddef.henumLuaFieldType{LUA_FIELD_INT,LUA_FIELD_FLOAT,LUA_FIELD_BOOL,LUA_FIELD_STRING};structLuaField{constchar*name;LuaFieldType type;size_toffset;size_tsize;};class LuaEngine{public:lua_State*L;voidinit();voidrun(constchar*code);// 添加普通函数voidregisterFunction(constchar*name,lua_CFunction func);// 创建模块voidbeginModule(constchar*name);// 添加模块函数voidaddFunction(constchar*name,lua_CFunction func);// 结束模块voidendModule(constchar*name);//变量绑定voidbindInt(constchar*name,int*ptr);voidbindFloat(constchar*name,float*ptr);voidbindStruct(constchar*name,void*ptr,constLuaField*fields,intcount);private:staticintintIndex(lua_State*L);staticintintNewIndex(lua_State*L);staticintfloatIndex(lua_State*L);staticintfloatNewIndex(lua_State*L);staticintboolIndex(lua_State*L);staticintboolNewIndex(lua_State*L);staticintstructIndex(lua_State*L);staticintstructNewIndex(lua_State*L);};//绑定#defineLUA_BIND_FUNC(func)Lua.registerFunction(#func,func)#defineLUA_BIND_INT(v)Lua.bindInt(#v,v)#defineLUA_BIND_FLOAT(v)Lua.bindFloat(#v,v)#defineLUA_BIND_STRUCT(v,fields,count)Lua.bindStruct(#v,v,fields,count)externLuaEngine Lua;#endifLuaEngine.cpp#includeLuaEngine.h#includeArduino.hLuaEngine Lua;// 当前模块名字voidLuaEngine::init(){LluaL_newstate();luaL_openlibs(L);}voidLuaEngine::run(constchar*code){intretluaL_dostring(L,code);if(ret!LUA_OK){Serial.print(Lua Error:);Serial.println(lua_tostring(L,-1));lua_pop(L,1);}}voidLuaEngine::registerFunction(constchar*name,lua_CFunction func){lua_register(L,name,func);}voidLuaEngine::beginModule(constchar*name){lua_newtable(L);}voidLuaEngine::addFunction(constchar*name,lua_CFunction func){lua_pushcfunction(L,func);lua_setfield(L,-2,name);}voidLuaEngine::endModule(constchar*name){lua_setglobal(L,name);}//int绑定structLuaIntObject{int*ptr;};intLuaEngine::intIndex(lua_State*L){LuaIntObject*obj(LuaIntObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);if(strcmp(key,value)0){lua_pushinteger(L,*(obj-ptr));return1;}return0;}intLuaEngine::intNewIndex(lua_State*L){LuaIntObject*obj(LuaIntObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);if(strcmp(key,value)0){*(obj-ptr)luaL_checkinteger(L,3);}return0;}voidLuaEngine::bindInt(constchar*name,int*ptr){LuaIntObject*obj(LuaIntObject*)lua_newuserdata(L,sizeof(LuaIntObject));obj-ptrptr;lua_newtable(L);lua_pushcfunction(L,intIndex);lua_setfield(L,-2,__index);lua_pushcfunction(L,intNewIndex);lua_setfield(L,-2,__newindex);lua_setmetatable(L,-2);lua_setglobal(L,name);}//float绑定structLuaFloatObject{float*ptr;};intLuaEngine::floatIndex(lua_State*L){LuaFloatObject*obj(LuaFloatObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);if(strcmp(key,value)0){lua_pushnumber(L,*(obj-ptr));return1;}return0;}intLuaEngine::floatNewIndex(lua_State*L){LuaFloatObject*obj(LuaFloatObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);if(strcmp(key,value)0){*(obj-ptr)luaL_checknumber(L,3);}return0;}voidLuaEngine::bindFloat(constchar*name,float*ptr){LuaFloatObject*obj(LuaFloatObject*)lua_newuserdata(L,sizeof(LuaFloatObject));obj-ptrptr;lua_newtable(L);lua_pushcfunction(L,floatIndex);lua_setfield(L,-2,__index);lua_pushcfunction(L,floatNewIndex);lua_setfield(L,-2,__newindex);lua_setmetatable(L,-2);lua_setglobal(L,name);}structLuaStructObject{void*ptr;constLuaField*fields;intcount;};staticLuaField*findField(LuaStructObject*obj,constchar*name){for(inti0;iobj-count;i){if(strcmp(obj-fields[i].name,name)0){return(LuaField*)obj-fields[i];}}returnNULL;}intLuaEngine::structIndex(lua_State*L){LuaStructObject*obj(LuaStructObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);LuaField*fieldfindField(obj,key);if(fieldNULL)return0;uint8_t*addr(uint8_t*)obj-ptrfield-offset;switch(field-type){caseLUA_FIELD_INT:lua_pushinteger(L,*(int*)addr);break;caseLUA_FIELD_FLOAT:lua_pushnumber(L,*(float*)addr);break;caseLUA_FIELD_BOOL:lua_pushboolean(L,*(bool*)addr);break;caseLUA_FIELD_STRING:lua_pushstring(L,(char*)addr);break;}return1;}intLuaEngine::structNewIndex(lua_State*L){LuaStructObject*obj(LuaStructObject*)lua_touserdata(L,1);constchar*keylua_tostring(L,2);LuaField*fieldfindField(obj,key);if(fieldNULL)return0;uint8_t*addr(uint8_t*)obj-ptrfield-offset;switch(field-type){caseLUA_FIELD_INT:*(int*)addrluaL_checkinteger(L,3);break;caseLUA_FIELD_FLOAT:*(float*)addrluaL_checknumber(L,3);break;caseLUA_FIELD_BOOL:*(bool*)addrlua_toboolean(L,3);break;caseLUA_FIELD_STRING:strncpy((char*)addr,luaL_checkstring(L,3),field-size-1);break;}return0;}voidLuaEngine::bindStruct(constchar*name,void*ptr,constLuaField*fields,intcount){LuaStructObject*obj;obj(LuaStructObject*)lua_newuserdata(L,sizeof(LuaStructObject));obj-ptrptr;obj-fieldsfields;obj-countcount;lua_newtable(L);lua_pushcfunction(L,structIndex);lua_setfield(L,-2,__index);lua_pushcfunction(L,structNewIndex);lua_setfield(L,-2,__newindex);lua_setmetatable(L,-2);lua_setglobal(L,name);}LuaGPIO.h#ifndefLUA_GPIO_H#defineLUA_GPIO_HvoidluaRegisterGPIO();#endifLuaGPIO.cpp#includeArduino.h#includeLuaEngine.h#includeLuaGPIO.hstaticintlua_gpio_write(lua_State*L){intpinluaL_checkinteger(L,1);intvalueluaL_checkinteger(L,2);pinMode(pin,OUTPUT);digitalWrite(pin,value);return0;}staticintlua_gpio_read(lua_State*L){intpinluaL_checkinteger(L,1);pinMode(pin,INPUT);lua_pushinteger(L,digitalRead(pin));return1;}voidluaRegisterGPIO(){Lua.beginModule(gpio);//gpio.write(pin, value)Lua.addFunction(write,lua_gpio_write);// gpio.read(pin)Lua.addFunction(read,lua_gpio_read);Lua.endModule(gpio);}测试读写全局变量[20:47:29.752]发→◇g_mode.value7;g_vol.value1.5;motor.speed5;motor.voltage5.3;motor.enable1;showMotorInfo()END □[20:47:29.765]收←◆g_mode7g_vol1.500000motor.speed5motor.voltage5.300000motor.enable1读按键[18:25:11.359]发→◇s1gpio.read(0)print(s1);END □[18:25:11.367]收←◆1算术运算[18:27:31.432]发→◇s112 print(s1);END □[18:27:31.438]收←◆3开灯[18:29:51.824]发→◇gpio.write(2,1)END关灯[18:30:17.479]发→◇gpio.write(2,0)END
延伸阅读

更多相关文章

2026/9/9 2:43:35

TMS320C6472 DSP PLL时钟配置详解:从寄存器操作到系统稳定实战

1. 项目概述与PLL核心价值在嵌入式系统,尤其是像TMS320C6472这样的高性能多核DSP设计中,时钟系统是整个芯片的“心跳”。它决定了处理器内核、高速外设以及内存接口能否协调、稳定且高效地运行。而锁相环(PLL)正是这颗“心脏”的起…

2026/9/10 16:34:06

CC2480 ADC与RNG模块深度解析:嵌入式无线传感网络设计实战

1. 项目概述:深入解析CC2480的模拟与随机数核心在嵌入式无线传感网络的设计中,我们常常面临一个核心矛盾:如何让一个以数字逻辑和无线通信为核心的节点,去感知和理解这个充满连续模拟量的物理世界。电池电压在缓慢下降、环境温度在…

2026/9/12 4:39:48

Python tkinter Text组件选择事件深度解析与应用

1. 深入理解tkinter的Text组件与虚拟事件机制在Python GUI开发领域&#xff0c;tkinter作为标准库中的"常青树"&#xff0c;其Text组件堪称构建文本编辑功能的瑞士军刀。而<<Selection>>这个看似简单的虚拟事件&#xff0c;实则是处理文本选择操作的关键…

2026/9/12 4:39:48

Spring Boot集成asyncTool实现高并发任务编排

1. 项目概述在当今高并发的业务场景下&#xff0c;复杂任务的异步处理与编排能力已经成为后端开发的刚需。Spring Boot作为Java生态中最流行的应用框架&#xff0c;其默认的异步处理机制在面对多级依赖任务时往往显得力不从心。这正是asyncTool这类专业任务编排框架大显身手的场…

2026/9/12 4:39:47

用Grix把Codex变成群聊机器人:口袋里的技术专家

上个月我在外面出差&#xff0c;正好赶上团队群里有人贴了一段报错&#xff0c;问谁能看看。我盯着手机屏幕&#xff0c;脑子里已经排除了两个可能&#xff0c;但手边没有电脑&#xff0c;总不能靠语音给人家背代码。那天晚上我就决定&#xff0c;必须把手上这套 Codex 工作流搬…

2026/9/12 4:39:47

Rocky Linux部署ELK+Redis构建高可用日志收集系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 4:34:47

Java StringEntry接口设计与实现最佳实践

1. StringEntry接口的设计背景与核心诉求在软件开发中&#xff0c;数据结构的抽象与封装一直是提升代码复用性和可维护性的关键手段。StringEntry这个接口概念的提出&#xff0c;本质上是为了解决字符串类型数据在多种场景下的统一操作问题。我最近在重构一个历史遗留系统时&am…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊&#xff01;#雷神 #复联”这类调侃式短标题&#xff0c;第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里&#xff0c;但细想一下就能发现&#xff0c;它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊&#xff0c;可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”&#xff0c;你会发现&#xff0c;这场比较本质上是两个不同 IP 策略的长期结果对比&#xff1a;超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介&#xff1a;本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案&#xff0c;聚焦调制信号自动检测与识别这一典型无线通信任务&#xff0c;解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件&#xff08;10.73MB&#xff09;&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介&#xff1a;本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包&#xff0c;聚焦于长鼻浣熊优化算法&#xff08;COA&#xff09;的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题&#xff0c;作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码