搜索
bottom↓
回复: 5
打印 上一主题 下一主题

发现ESP8266收到的数据到晚上就丢了,必须将数据存储到变量里面

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-7-24 00:46:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在使用ESP8266,用arduino语言编程。为了方便,很多时候使用字符串变量,如下:

const char *phone = "";
const char *NameDevice = "";
String T_phone = "";
String DeviceName = "";

void callback(char *topic, byte *payload, unsigned int length)
{
  String msg = "";
  for (int i = 0; i < length; i++)
  {
    msg += (char)payload[i];
  }
      
  T_phone = msg.substring(msg.indexOf("data_phone\":") + 12, msg.indexOf(",\"userName"));
  DeviceName = msg.substring(msg.indexOf("userName\":") + 10, msg.indexOf("}"));
  phone= T_phone.c_str();
  NameDevice = DeviceName.c_str();
   
}


void send_sms( )
{
  Serial.println("send sms.........");
  char param[256] = {0};
  sprintf(param, "{\"phone\": \"%s\",\"store\": \"%s\",\"temp\":%.2f,\"hum\":%.2f}\0", phone,  NameDevice, T_Device_temp, T_Device_hump);
  client.publish(Mqtt_sms_topic, param);
}

发现ESP8266收到的phone和NameDevice数据到晚上就丢了。
后来看了些资料,必须将数据存储到变量里面去,于是改成下面的程序:

const char *phone= "";
const char *NameDevice = "";
String T_phone = "";
String DeviceName = "";
char arr_phone[50]={0};
char arr_NameDevice[50]={0};



void callback(char *topic, byte *payload, unsigned int length)
{
  String msg = "";
  for (int i = 0; i < length; i++)
  {
    msg += (char)payload[i];
  }
      
  T_phone = msg.substring(msg.indexOf("data_phone\":") + 12, msg.indexOf(",\"userName"));
  DeviceName = msg.substring(msg.indexOf("userName\":") + 10, msg.indexOf("}"));
  phone= T_phone.c_str();
  strncpy(arr_phone,phone,strlen(phone));// phone存入数组
  NameDevice = DeviceName.c_str();
  strncpy(arr_NameDevice,NameDevice,strlen(NameDevice));//NameDevice 存入数组
   
}

void send_sms( )
{
  char param[256] = {0};
  phone=arr_phone;//从数组取出数据 phone
  NameDevice=arr_NameDevice;//从数组取出数据NameDevice
  sprintf(param, "{\"phone\": \"%s\",\"store\": \"%s\",\"temp\":%.2f,\"hum\":%.2f}\0", phone,  NameDevice, T_Device_temp, T_Device_hump);
  client.publish(Mqtt_sms_topic, param);
}

现在运行很好,再也没有丢失数据 phone和数据NameDevice

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出200入2554汤圆

2
发表于 2022-7-24 03:26:51 | 只看该作者
本帖最后由 t3486784401 于 2022-7-24 03:27 编辑

1. 作为一个全局的 String 对象,过早地返回 c_str( ) 并保存,很显然一个修改/重分配内存就会搞坏,应该用到再调用




2. 都用到 strncpy 了,还要配合 strlen 这就不优雅了: strncpy(d, s, strlen(s))  等同  strcpy(d, s)


这代码要是哪里粘贴的也就算了,要是 LZ 自己写的,建议好好复习 C 语言

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

3
 楼主| 发表于 2022-7-24 05:53:27 来自手机 | 只看该作者
谢谢楼上大侠!

出0入0汤圆

4
发表于 2022-7-24 13:59:12 | 只看该作者
t3486784401 发表于 2022-7-24 03:26
1. 作为一个全局的 String 对象,过早地返回 c_str( ) 并保存,很显然一个修改/重分配内存就会搞坏,应该用 ...
(引用自2楼)

这句话怎么理解,可以详细说一下吗?

出200入2554汤圆

5
发表于 2022-7-24 14:17:44 来自手机 | 只看该作者
solojimes 发表于 2022-7-24 13:59
这句话怎么理解,可以详细说一下吗?
(引用自4楼)

String 作为广义字串类,会自动维护内存。你返回的c_str 指针只要字串维护一次就失效了。

应该随用随取

出16170入6148汤圆

6
发表于 2022-8-12 09:32:27 | 只看该作者
“C++中string、char[]、const char*的转换”标题不合格。已经帮你修改(注意:主题发出24小时后就不能修改帖子)

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 00:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表