Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理
Posted 永相随1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua语言(stm32+2G/4G模块)和C语言(stm32+esp8266)从字符串中提取相关数据的方法-整理相关的知识,希望对你有一定的参考价值。
文章目录
一、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数据解析是完全没问题的。为了解决这个问题,所以使用字符串匹配和字符串提取方法来实现数值的提取
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)从字符串中提取相关数据的方法-整理