You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从ESP32读取的十六进制序列号中提取每两位的第二位数字并组合

实现ESP32读取RS485序列号并通过JS上传服务器的方案

一、ESP32端处理RS485数据

先完成RS485数据读取和目标序列号的提取逻辑:

1. 硬件初始化

根据RS485模块的接线,初始化对应串口(优先用硬件串口保证稳定性):

#include <HardwareSerial.h>

// 定义RS485使用的串口引脚(根据实际接线调整)
HardwareSerial rs485Serial(2); // 示例:使用Serial2,RX=16, TX=17

void setup() {
  Serial.begin(115200); // 用于调试输出
  rs485Serial.begin(9600, SERIAL_8N1, 16, 17); // 波特率、格式需匹配RS485模块
}

2. 读取并提取目标序列号

读取9字节的RS485原始数据,将每个字节转为两位十六进制字符串后取第二位字符,拼接成最终的序列号:

void loop() {
  if (rs485Serial.available() >= 9) { // 确认收到完整的9字节数据
    uint8_t rawSerial[9];
    rs485Serial.readBytes(rawSerial, 9);
    
    String targetSerial = "";
    for (int i = 0; i < 9; i++) {
      char hexBuf[3];
      sprintf(hexBuf, "%02X", rawSerial[i]); // 转成两位大写十六进制字符串
      targetSerial += hexBuf[1]; // 提取第二位字符(如"01"取'1')
    }
    
    // 输出调试,同时供后续JS读取(可选:串口输出/通过WiFi接口返回)
    Serial.println(targetSerial);
  }
  delay(100);
}

二、通过JS上传至Web服务器

根据ESP32与前端的交互方式,分两种场景实现:

场景1:ESP32作为Web服务器,前端页面上传

给ESP32添加WiFi和Web服务器功能,提供接口返回处理后的序列号:

#include <WiFi.h>
#include <ESPAsyncWebServer.h>

const char* WIFI_SSID = "你的WiFi名称";
const char* WIFI_PWD = "你的WiFi密码";

AsyncWebServer server(80);
String currentSerial = "";

void setup() {
  // 前面的RS485初始化代码...
  
  // 连接WiFi
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("正在连接WiFi...");
  }
  Serial.print("WiFi已连接,IP:");
  Serial.println(WiFi.localIP());

  // 定义获取序列号的接口
  server.on("/get-serial", HTTP_GET, [](AsyncWebServerRequest *req) {
    req->send(200, "text/plain", currentSerial);
  });

  server.begin();
}

void loop() {
  // 前面的RS485读取处理代码,更新currentSerial:
  if (rs485Serial.available() >= 9) {
    // ... 读取处理逻辑 ...
    currentSerial = targetSerial; // 更新全局变量供接口返回
  }
}

编写前端HTML/JS,获取序列号后上传到目标服务器:

<!DOCTYPE html>
<html>
<body>
  <script>
    // 从ESP32获取序列号
    async function fetchSerial() {
      const resp = await fetch('http://ESP32的本地IP/get-serial');
      return await resp.text();
    }

    // 上传到目标服务器
    async function uploadToServer(serial) {
      try {
        const resp = await fetch('https://你的服务器上传接口地址', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ serialNumber: serial })
        });
        const result = await resp.json();
        console.log('上传成功:', result);
      } catch (err) {
        console.error('上传失败:', err);
      }
    }

    // 执行流程
    fetchSerial().then(serial => uploadToServer(serial));
  </script>
</body>
</html>

场景2:通过串口读取ESP32数据(Node.js脚本)

如果ESP32通过USB串口连接电脑,用Node.js读取串口数据后上传:

const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const fetch = require('node-fetch');

// 配置串口(端口号根据实际设备调整)
const port = new SerialPort('COM3', { baudRate: 115200 });
const parser = port.pipe(new Readline({ delimiter: '\n' }));

// 监听串口数据
parser.on('data', async (data) => {
  const serial = data.trim();
  // 验证是9位目标序列号
  if (/^\d{9}$/.test(serial)) {
    try {
      await fetch('https://你的服务器上传接口地址', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ serialNumber: serial })
      });
      console.log(`已上传序列号:${serial}`);
    } catch (err) {
      console.error(`上传失败:${err.message}`);
    }
  }
});

// 处理串口错误
port.on('error', (err) => {
  console.error('串口异常:', err);
});

安装依赖:npm install serialport @serialport/parser-readline node-fetch

内容的提问来源于stack exchange,提问作者Gareth Carr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:36:31