如何从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
相关产品推荐
相关产品推荐

