Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理

Posted 永栀哇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理相关的知识,希望对你有一定的参考价值。

文章目录

一、Lua语言中从字符串中提取想要的数据

Lua中正则表达式的使用方法链接

1、问题

lua语言字符串提取是在2G模块和4G模块的lua代码编写时用到的,主要是处理串口接收到的数据,然后提取出每个数值之后,赋值给对应的变量,组成新的键值对,将数据打包上传到阿里云

2、初步代码

STM32+AIR800关于温湿度采集上传阿里云以及进行云端下发指令简单的控制-链接
使用的字符串提取(对STM32发送过来的数据进行温湿度烟雾浓度的提取):虽然经常提取不到数据,但是功能可以实现,代码是下面这个鬼样子:

3、代码改善

前段时间偶然使用合宙的4G模块时,时隔2年又需要对串口接收到的数据进行提取,使用串口接收STM32发送来的数据,比如说有温度,湿度,二氧化碳浓度、各个开关的状态等,上面这样子肯定无法满足,所以抽时间对其进行改进

LUA语言中可以返回多个数据,但是在正则表达式的使用时他这里也有一个坑,就是返回的数据个数也是有限制的,超出限制的个数以后会莫名的出错;前期只提取四五个数据的时候一切正常,当我需要把每个开关的状态也通过串口发送给4g模块,全部写在一块时,是无法正常提取数据的,原本可以实现的数据上传也会出现问题,这个问题卡了一段时间才找到问题所在并得到解决,最终解决办法:那就是分两次进行数据提取达到自己想要的目的(下面代码)

//原始数据:
//temp:20,hum:30,co2:20,water_weight:100,food_weight:200.......
//目的时将对应的键所对应的数值提取出来

    data = uart.read(UART_ID,"*l")--串口接收到的数据
    a,b,c,d,e=string.match(data,'temp:(%d+),hum:(%d+),co2:(%d+),water_weight:(%d+),food_weight:(%d+)')
    f,g,h,i,j=string.match(data,'Led_switch_STA:(%d),Air_switch_STA:(%d),Water_switch_STA:(%d),Food_switch_STA:(%d),Temp_switch_STA:(%d)')
    if a~=nil and b~=nil and c~=nil and d~=nil and e~=nil then
		--执行对应语句
    end
    if f~=nil and g~=nil and i~=nil and j~=nil and h~=nil then
			--执行对应语句
    end

二、C语言-从字符串中提取自己想要的数据

1、遇到问题

3-STM32+ESP8266连接onenet上传数据+远程控制(MQTT)-链接
之所以用到这个字符串提取,是因为在用ESP8266订阅onenet云平台下发的数据进行数据解析时,如果使用json解析,编译的代码会超出内存,无法下载到STM32中(芯片STM32F103C6T6),如果使用STM32F103ZET6或C8T6主控芯片时,使用json数据解析是完全没问题的。为了解决这个问题,所以使用字符串匹配和字符串提取方法来实现数值的提取

sscanf在c语言中的用法-链接

2、解决问题灵感

下面代码将数字提取出来并进行打印:

#include <stdio.h>
#include<string.h>
int main()

	int a,b,c;
	sscanf("2015.04.05", "%d.%d.%d", &a,&b,&c); //取需要的字符串   
    printf("a=%d,b=%d,c=%d\\n",a,b,c);  //  a=2015,b=4,c=5

3、解决方法

提取字符串中某些数字(主要用于提取键值对中键对应的数值)
比如说订阅到的消息中,是以键值对的形式存在的,我们要判断指定的键所对应的数值
比如:
(1)数据 “LED1”:1 中 键 “LED”的 值 是 1(判断LED1根据这个指令执行打开还是关闭操作)
(2)数据 “PWM”:245 中键“PWM”的数值是245(用于调节占空比进而调节灯光亮度)

下面程序用于返回PWM所对应的数值,req所对应的数值并进行打印:使用两种方法进行提取(也许还有更合适的方法,有知道的可以在评论区补充)

#include <stdio.h>
#include<string.h>
int main()

	//char *st=""PWM":200,req:129";// 错误定义:在C语言中如果想要提前引号需要使用转义字符
	char *st="\\"PWM\\":200,req:129";//正确定义:定义一个字符串
	char a,b,c,d,e,f;//存储字符 
	int num1,num2,num3,num4;
	//方法一: 
	sscanf(st, "\\"%c%c%c\\":%d,%c%c%c:%d",&a,&b,&c,&num1,&d,&e,&f,&num2); //取需要的字符串 
	printf("num1=%d,num2=%d\\n",num1,num2);
	//方法二 
	sscanf(st, "\\"PWM\\":%d,req:%d", &num3,&num4); //直接取对应的数字 
	printf("num3=%d,num4=%d\\n",num3,num4);

STM32中使用原型:

订阅的数据:“PWM”:123,req:11
只需要提取PWM的数值即可

if(strstr((char *)req_payload, "PWM"))

		sscanf((char *)req_payload, "\\"%c%c%c\\":%d", &a,&b,&c,&PWM_value); //取需要的字符串 
		printf("pwm_get_value=%d\\r\\n",PWM_value);

以上是关于Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理的主要内容,如果未能解决你的问题,请参考以下文章

Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理

合宙Luat 2G/4G系列模块Lua版本串口功能汇总

自用纯C语言实现任务调度(可用于STM32C51等单片机)

1-STM32嵌入LUA开发(控制小灯闪耀)

stm32对c语言要求高吗?c语言什么水平可以学stm32?

关于stm32建立工程的c语言问题 主函数里面包含了stm32f10x.h和led.h, led.