esp32单片机在arduino环境下,串口接收解码

这篇具有很好参考价值的文章主要介绍了esp32单片机在arduino环境下,串口接收解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结

前言

当主控芯片发送一串数据,但此数据为一串字符串,需要将此字符串翻译成整型数组,以形成指令,控制串口屏。

例如:esp32单片机接收到字符串:{"action_type":2,"tem_in":35,"tem_in_warn":50,"tem_out":23,"tem_out_warn":50,"data_type":1},就将里面的'2','35','50','23',等数据解析出来,形成整形数据,替换数组中相应的数据,最终将数组发送给串口屏,形成一系列指令。
 

一、串口是什么?

串行接口简称串口,也称串行通信接口或串行通讯接口,是采用串行通信方式的扩展接口。串行接口是指数据一位一位地顺序传送。

二、使用步骤

1.引入库

代码如下:

#include <HardwareSerial.h>    //导入ESP32串口操作库,使用这个库我们可以把串口映射到其他的引脚上使用

2.解码函数

代码如下:

#include <HardwareSerial.h>    //导入ESP32串口操作库,使用这个库我们可以把串口映射到其他的引脚上使用
#include <ArduinoJson.h>

HardwareSerial MySerial_724UG(1);    //使用串口时一定要考虑端口重映射
String comdata = "";
uint8_t DataReceive[10];
uint8_t data1[]={0xAA,0x01,0x13,0x00,0x06,0xff,0x40,0xfe,0x0a,0xfd,0x02,0x00};                       //转化效率显示页面
uint8_t data2[]={0xAA,0x01,0x14,0x00,0x0a,0xff,0x40,0xfe,0x45,0xfd,0x32,0xfc,0x40,0xfb,0x02,0x00};   //水温值显示页面
uint8_t data3[]={0xAA,0x01,0x15,0x00,0x06,0xff,0x01,0xfe,0x32,0xfd,0x02,0x00};                       //

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  MySerial_724UG.begin(115200,SERIAL_8N1,19,21);          //端口重映射
  
}


void loop() {
    // put your main code here, to run repeatedly:
    while (MySerial_724UG.available() > 0)  
    {
        comdata += char(MySerial_724UG.read());
        delay(2);
    }
    
    DynamicJsonDocument doc(1024);                
    
    deserializeJson(doc, comdata);                //解码函数

    // You can use a String as a key to get a member from JsonDocument
    // No duplication is done.
    long num = doc[String("action_type")];       //解析数据,将字符串后面的数据解析出来


    switch(num)
    {
      case 1:
      //{"action_type":1,"sw_rate":60,"sw_rate_warn":10,"data_type":1}
        data1[6]=doc[String("sw_rate")];
        data1[8]=doc[String("sw_rate_warn")];
        data1[10]=doc[String("data_type")];
        //Serial.println(data1[8]);
        Serial.write(data1,sizeof(data1));
        delay(50);
        Serial.write(data1,sizeof(data1));
        break;

      case 2:
      //{"action_type":2,"tem_in":35,"tem_in_warn":50,"tem_out":23,"tem_out_warn":50,"data_type":1}
        data2[6]=doc[String("tem_in")];
        data2[8]=doc[String("tem_in_warn")];
        data2[10]=doc[String("tem_out")];
        data2[12]=doc[String("tem_out_warn")];
        data2[14]=doc[String("data_type")];
        Serial.write(data2,sizeof(data2));
        delay(50);
        Serial.write(data2,sizeof(data2));
        break;
      case 3:
      //{"action_type":3,"resin_type":1,"resin_progress":50,"data_type":1}
        data3[6]=doc[String("resin_type")];
        data3[8]=doc[String("resin_progress")];
        data3[10]=doc[String("data_type")];
        Serial.write(data3,sizeof(data3));
        delay(50);
        Serial.write(data3,sizeof(data3));
        break;
            
      default:break;     
    }
  comdata = "";
}

#include <HardwareSerial.h>    //导入ESP32串口操作库,使用这个库我们可以把串口映射到其他的引脚上使用
HardwareSerial MySerial_stm32(0);
String comdata = "";
uint8_t DataReceive[10];
uint8_t data1[]={0xAA,0x01,0x13,0x00,0x06,0xff,0x40,0xfe,0x0a,0xfd,0x02,0x00};                       //发送给串口屏的数据
uint8_t data2[]={0xAA,0x01,0x14,0x00,0x0a,0xff,0x40,0xfe,0x45,0xfd,0x32,0xfc,0x40,0xfb,0x02,0x00};   //水温值显示页面
uint8_t data3[]={0xAA,0x01,0x15,0x00,0x06,0xff,0x01,0xfe,0x32,0xfd,0x02,0x00};                       //
 
 
//解码函数
void Decode(String str){
  int ret = 16;      //记录冒号的位置 
  int reg = 0;       //记录逗号的位置
  int i=0;
  String str_num=""; //接收解码的数据
  while(1)
  {
    ret = comdata.indexOf(":",ret);  //寻找从ret位置开始,第一个冒号的位置               
    reg = comdata.indexOf(",",ret);  //寻找从ret位置开始,第一个逗号的位置
    if(ret==-1)
    {
      break;
    }
    if(reg==-1)
    {
      reg = comdata.indexOf("}",ret);
    }
    //Serial.println(ret);
    //Serial.println(reg);
 
    str_num=str.substring(ret + 1, reg);     //截取字符串中有效数据
    
    //Serial.println(str_num);                     
    DataReceive[i] = str_num.toInt();        //将字符串转为整形数据存于数组中           
    i++;
    ret = reg +1; 
  }
   
}
 
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);                      //设置串口波特率
  
}
 
 
void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available() > 0)  
  {
      comdata += char(Serial.read());
      delay(2);
  }
  
 
  //Serial.println(comdata);
 
  // 在字符串中间查找子字符串
  if (comdata.substring(2, 13) == "action_type") {
    //Serial.println("It's a text-based file");
    int num = comdata.charAt(15) - '0';
    //Serial.println(num);
 
    Decode(comdata);
 
    switch(num)
    {
      case 1:
        data1[6]=DataReceive[0];
        data1[8]=DataReceive[1];
        data1[10]=DataReceive[2];
        //Serial.println(data1[8]);
        Serial.write(data1,sizeof(data1));         //将数据发送给串口屏
        delay(50);
        Serial.write(data1,sizeof(data1));
        break;
 
      case 2:
        data2[6]=DataReceive[0];
        data2[8]=DataReceive[1];
        data2[10]=DataReceive[2];
        data2[12]=DataReceive[3];
        data2[14]=DataReceive[4];
        Serial.write(data2,sizeof(data2));
        delay(50);
        Serial.write(data2,sizeof(data2));
        break;
      case 3:
        data3[6]=DataReceive[0];
        data3[8]=DataReceive[1];
        data3[10]=DataReceive[2];
        Serial.write(data3,sizeof(data3));
        delay(50);
        Serial.write(data3,sizeof(data3));
        break;
            
      default:break;     
    }
    
  }
  comdata = "";                                 //清空上次接收到的字符串数据
}


总结


例如:以上即是串口接收解析代码,经验证,已经可以使用。文章来源地址https://www.toymoban.com/news/detail-708073.html

到了这里,关于esp32单片机在arduino环境下,串口接收解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • APM32F072单片机进入STOP模式,并通过RTC Wakeup Timer和USART1串口接收事件唤醒

    串口初始化(注意USART1时钟源要选择HSI): 使用power_init函数初始化RTC,然后调用power_enter_stop_mode(n)函数进入STOP模式,n秒后自动唤醒,或由USART1接收唤醒:

    2024年02月13日
    浏览(52)
  • c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

         单片机一般采用中断方式接受数据,这样便于及时处理 其中发送数据段采用的是查询方式,接收端采用了中断方式, 要注意的地方有: 在中断处理函数int_0()内,处理数据前要先关闭中断,否则中断可能会不断传过来, EA=0; 然后退出中断处理函数前恢复中断处理能力:

    2024年02月13日
    浏览(65)
  • (软件03)单片机串口处理思路,超时接收的方法

        软件学习前言     代码思路     实操练习         最近写了两篇硬件分享文章,要做的一个通过485串口接收指令,从而控制电机转速的内容。里面涉及到了串口的处理,于是便想写一下关于串口处理的相关经验分享,串口也是非常重要的,不管是printf打印log信息,

    2024年02月01日
    浏览(37)
  • 单片机串口——如何判定接收一帧数据的完成

    单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种: 1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完成;2.在数据中加入帧头、帧尾,通过在程序中判断是否接收到

    2024年02月12日
    浏览(47)
  • 51单片机UART串口通信实现接收PC的字符串

            基本思路是触发串口接收中断之后,在串口中断服务函数中处理接收到的字节并将其连接成字符串存入全局变量中。 隐含的额外工作有: 1.区分是发送中断还是接收中断,两者都会进入同一个中断服务子函数; 2.判断已接收到了句末,暂停接收,并通过标志位告知

    2023年04月20日
    浏览(96)
  • 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

    想要更多项目私wo!!! 室内环境智能监测系统 主要功能:         1.检测空气温湿度         2.检测光照强度         3.检测烟雾浓度         4.数据显示在手机端和设备OLED屏幕上         5.当空气温度高于设定的阈值时,风扇开启         6.当空气湿度低于

    2024年02月09日
    浏览(68)
  • OpenMV接收stm32单片机数据

    本篇文章将会分享如何用OpenMV接收到stm32单片机传来的数据。 OpenMV stm32 p4 PA3 p5 PA2 GND GND 代码如下(示例): 代码如下(示例): 本篇文章分享了博主在准备电赛期间所写的OpenMV接收stm32单片机传来的数据OpenMV程序和stm32单片机程序,有不足之处,还请斧正! 完整工程源码

    2024年02月15日
    浏览(47)
  • ESP32单片机入门篇

    目录 一、ESP32单片机的基本概念 1.双核架构 2. Wi-Fi和蓝牙功能 3. 集成多种外设 4. 支持多种操作系统 二、开发环境 1. Arduino IDE 2. ESP-IDF 三、开发语言 四、注意事项 五、代码例程 (1)点亮LED灯 1. 电路图 2. 代码 3. 代码注释 4. 注意事项 (2)控制继电器 1. 电路图 2. 代码 3. 代码

    2024年02月08日
    浏览(55)
  • 【个人笔记】51单片机串口通信的字符串接收和发送,串口通信调节数码管显示时钟(串口通信,定时器,数码管)

           目的:利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议,单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操作。 基本功能: 1.时分秒的动态显示。

    2024年02月11日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包