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

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

例如: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',等数据解析出来,形成整形数据,替换数组中相应的数据,最终将数组发送给串口屏,形成一系列指令。

ardiuno代码如下:

#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 = "";                                 //清空上次接收到的字符串数据
}

### 使用ArduinoESP32驱动ST7789显示屏 #### 库安装 为了使Arduino IDE能够支持ST7789显示屏的操作,需先下载并安装`TFT_eSPI`库以及用于解码JPEG图像的`JPEGDecoder`库。这可以通过进入Arduino IDE中的菜单栏选择项目->加载库->管理库来完成。 #### 设置配置文件 编辑`User_Setup.h`文件以适应特定硬件需求。对于采用ST7789作为显示器的情况,应定义如下参数: - `#define ST7789_DRIVER`: 指定使用的LCD控制器型号为ST7789。 - 设定屏幕分辨率:`#define TFT_WIDTH 240` 和 `#define TFT_HEIGHT 240` 表明该实例中所用到的是分辨率为240×240像素的小型彩色液晶面板[^1]。 针对不同版本的开发板连接方式可能有所差异,在这里提供两种常见情况下的引脚分配方案供参考: - **当使用带有D系列编号GPIO接口的传统NodeMCU设备时**: ```c++ #define TFT_CS D8 // 芯片选通信号控制端口设为D8 #define TFT_DC D3 // 数据/命令切换信号控制端口设为D3 #define TFT_RST D4 // 复位信号控制端口可选地连至NodeMCU自身的复位键上;此处指定为D4 #define TFT_BL D1 // 如果存在背光调节功能,则将其关联到D1 GPIO管脚上去 ``` - **而如果是在ESP32-S3这类较新型号单片机平台上工作的话**: ```c++ #define TFT_MOSI 13 // MOSI数据线通常对应于第十三个通用输入输出针脚 #define TFT_SCLK 11 // SCLK串行时钟同步脉冲由第十一个IO负责传输 #define TFT_CS -1 // 对于此款微处理器而言,CS可以不被实际占用(-1表示自动处理),除非特别需要手动设定 #define TFT_DC 12 // DC区分指令还是数据信息的作用,通过十二号位置上的触点实现 #define TFT_RST 10 // 同样地,复位操作经由十号通道执行 #define TFT_BL 9 // 若有LED背景灯强度调整的需求,九号引脚可用于此目的 ``` 以上两组定义分别适用于不同的硬件平台,并且可以根据具体电路设计灵活调整各条线路的具体物理连接关系[^2]。 #### 初始化与显示逻辑编写 下面给出了一段简单的程序框架用来初始化屏幕并将一幅预存好的BMP格式图形渲染出来。这段代码片段展示了如何调用`tft.init()`来进行必要的启动准备工作,接着利用`tft.setSwapBytes(true)`确保字节顺序正确无误之后再填充整个画布颜色以便清除之前残留的内容最后借助`tft.pushImage(x,y,w,h,data)`函数把目标图案放置在指定坐标处[^3]。 ```cpp #include <TFT_eSPI.h> // 假设已按照前述说明完成了相应的宏定义... void setup() { tft.init(); tft.setRotation(1); // 可选项:旋转方向设置 tft.setSwapBytes(true); tft.fillScreen(TFT_BLACK); } void loop() { static const uint16_t bmpWidth = 240; static const uint16_t bmpHeight = 240; extern uint16_t bmp1[]; // 图像数组声明 tft.pushImage(0, 0, bmpWidth, bmpHeight, bmp1); delay(5000); // 显示一段时间后刷新或等待其他动作触发... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值