首页 > 其他分享 >STM32F407 LUA 串口代码传输进行功能热更新

STM32F407 LUA 串口代码传输进行功能热更新

时间:2023-11-09 16:15:07浏览次数:39  
标签:LUA lua Lua Step ENV 串口 STM32F407

STM32F407 LUA 串口代码传输进行功能热更新

1.首先放上LUA资源

LUA

img

2.整体思路

创建keil工程--->移植lua--->补充相应功能

3.移植Lua

Step 1

正常解压即可
只有这个文件有用
img


Step 2

在这个文件夹里搜索,删掉这两个文件(这两个文件在stm32中不使用)
img
剩余的文件按照添加BSP的流程添加即可

Step 3

打开工程,添加完毕后应该是这个样子的,如果不一样,可以跟着改一下
img


Step 4

修改Stack_Size 找到这个文件
img
Stack_Size必须修改 Heap_Size根据情况进行修改
img


Step 5

创建LUA所需函数
img

//随便找个文件丢进去就行(建议创建一个特定存放lua函数的c文件)
time_t time(time_t * time){
	return 0;
}

void exit(int status){

}

int system(const char * string){
	return 0;
}



Step 6

编译一下,没报错,就OK了!


4.LUA的基本使用

Step 1 基本LUA函数的创建

 int Lua_LED(lua_State *L)
{
	uint8_t flag = lua_tointeger(L,1);					//	读取传入函数的参数,数字是传入的所有数据的第几个
	if(flag){
		switch (flag)
		{
			case 1:{LED0_TOGGLE();}break;               //LED0_TOGGLE()是写好的c语言函数
			case 2:{LED1_TOGGLE();};break;
			case 3:{LED0_TOGGLE();};break;
		};
			
	}
	return 1;                                           //返回的是个数 不是参数
}



Step 2 关于Lua函数的注册

只有注册过的Lua函数 才能被Lua解释器识别

const struct luaL_Reg mylib[] ={
{"Lua_LED",Lua_LED},//字符串自己随便定义,我的习惯是定义成一样的,不需要加()
{"Lua_delay_ms",Lua_delay_ms},
{"Lua_ADC",Lua_ADC},
{NULL,NULL}
};



Step 3 关于Lua语句

首先要创建一个符合Lua语法规则的字符串
Lua_LED(1)见Step 1


 char  lua_test[] = {
    "print(\"LUA 启动\")\nLua_LED(1)\nLua_delay_ms(1000)\n",

};



Step 4 关于Lua解释器的创建

没啥可说的,都是死的,这是个最简易的,还有一些启动lua库一类的东西,有兴趣和需要可以自己查查

lua_State *LUA_ENV;
int LUA_Start(){
	
	LUA_ENV = luaL_newstate(); 			//	创建Lua编译器
	luaopen_base(LUA_ENV);				//	注册基本函数
	luaL_setfuncs(LUA_ENV, mylib, 0);

	return 0;
};



Step 5 关于Lua的启动

我直接写在主循环里了,有大佬有好的想法可以教一下XD;

    while(1)
    {
			
			usart_code_Get();//我写的串口指令接收

			
			if(receive_code_complete == 1)
			{	
				
					int a = luaL_dostring(LUA_ENV,lua_test); 	//	执行脚本语句
					if(a == 1)
					{
						printf("Lua-Code Running Error!\r\n");
						printf("Error: %s\n", lua_tostring(LUA_ENV, -1));//如果出错了,Lua解释器会把报错压入栈中,直接读取就行
						
						receive_code_complete = 0;
					}
					//
					//receive_code_complete = 0;
			}
			else
			{LED0_TOGGLE();
				delay_ms(3000);}			
		}



Step 6 关于串口传输语句的规则

串口传输语句还是按照lua语法直接传输就可以,但是要注意的是,你自己串口协议和串口助手的不同,很多例程里以\r\n作为串口接收的结束,如果你在串口传输的时候,在串口助手中依靠回车换行,请务必转换成16进制,查看是否为0D 0A或是单独的0A,有条件的最好可以自己写一个上位机.
针对程序更新后,如果重新上电丢失的问题,可以使用flash(毕竟字符串才多大啊



Step 7 总结

Lua的移植并不是很困难,个人来看,Lua移植到嵌入式环境下,能更好的热更新一些功能,但是前提是要封装好自己的BSP部分,这种通过串口(或其他通信方式)的更新程序的方式,还是比较有意思的(づ ̄3 ̄)づ╭❤~

标签:LUA,lua,Lua,Step,ENV,串口,STM32F407
From: https://www.cnblogs.com/tiandaowang/p/17821699.html

相关文章

  • RS485串口介绍和演示
    RS485是一种常见的串行通信协议,广泛用于工业自动化、仪表和远程监控等领域。本文将介绍RS485串口的基本原理,并通过代码演示如何在嵌入式系统中使用RS485进行通信。RS485串口概述RS485是一种差分信号的串行通信协议,它使用两个信号线进行数据传输:一个是非常态(非反相)信号A,另一个是反相......
  • CAST电子部单片机方向授课——串口通信 预习文档
    CAST电子部单片机方向授课——串口通信预习文档课前小准备安装串口调试助手第一步:进入MicrosoftStore第二步:在MicrosoftStore中搜索“串口调试助手”第三步:点击获取,按要求安装即可下载完成后,桌面上可能没有快捷方式,需要在win里搜索一下,然后拖到桌面上。注:其他安装方......
  • licheepi 4a串口通信
    licheepi4a串口通信(usb串口)博主使用usb串口原因是博主的是内测版本,虽然购买了1.8转3v3的usb转ttl模块,但是板载的UART1还是1.8V电平。所以本博客记录博主使用usb转串口进行串口通信。博主环境:debian20231023镜像licheepi4a8+8G(1)安装pyserial库并查看usb串口模块端口......
  • Lua,ILRuntime, HybridCLR(wolong)/huatuo热更对比分析
    这两年,各种Unity热更新方案如雨后春笋般出来了,今天来写篇文章来对比一下Unity各大热更新方案的优缺点。目前主流的Unity热更新的方案有:Lua系解决方案:内置一个Lua虚拟机,做好UnityEngine与C#框架的Lua导出。典型的框架有xLua,uLua,大体都差不多。ILRuntime解决方案:内置一个......
  • USB转串口芯片对比选秀---推荐CP2102和CH340C
    参考应用文章:《USB转串口芯片你看好哪个(USB转串口芯片介绍)》简短不看版:建议选择这2款芯片:CP2102/CP2104和CH340C。稳定性较好。 1.FT232优势:最常用缺点:假货多,并不是不能用,而是稳定性差。串口容易丢。规格书:https://atta.szlcsc.com/upload/public/pdf/source/20130221/14......
  • esp32s3使用多串口
    esp32s3使用多串口我按照别人博客中设置串口2,串口打印有问题,因为没有看到esp32s3多串口,就总结了一下自己的经验下图为esp32的引脚图下图为esp32s3的引脚图ESP32-S3有三个UART(通用异步收发器)控制器,即UART0、UART1、UART2,支持异步通信(RS232和RS485)和IrDA,通信速率可达......
  • springboot第44集:Kafka集群和Lua脚本
    servers:Kafka服务器的地址。这是Kafka集群的地址,生产者将使用它来发送消息。retries:在消息发送失败时,生产者将尝试重新发送消息的次数。这个属性指定了重试次数。batchSize:指定了生产者在发送消息之前累积的消息大小(以字节为单位)。一次性发送多个消息可以提高性能。linger:指定了生......
  • vscode开发一个luaIDE插件
    基础知识环境准备node.js下载后下一步下一步即可安装成功,推荐LTS版本yeoman脚手架工具,也就是快速帮你新建一个插件所需的目录的工具,在工作目录下cmd,输入下列命令即可安装npminstall-gyogenerate-code,生成扩展文件等,和yeoman配合使用npminstall-ggenerator-code......
  • Linux 下使用串口的简易教程
    1、检查串口的配置。查看串口的波特率、数据位、校验位等可以使用以下命令: $stty-F/dev/ttyS02、修改串口的配置。使用stty命令可以修改串口的波特率、数据位、校验位等选项,例如,将串口波特率修改为115200,按如下方式操作:$stty-F/dev/ttyS01152003、stty命令功......
  • angie nginx_lua 模块使用
    angie包含了不少社区模块,docker镜像更加方便,都已经安装了,以下是一个测试lua模式的使用因为默认官方构建的是一个动态扩展模块,对于三方lua模块安装不是很方便,我参考了openresty对于luarocks的支持,这样我们自己安装三方lua模块就比较方便的构建支持luarocks的dcoker镜......