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

如何让MH-ET live扫描器无需按键自动扫描二维码/条形码?

问题描述

我们正在开展一个使用MH-ET live扫描器识别二维码的项目,目前该扫描器仅在按下侧边按钮时才会启动扫描。我们希望将其设置为持续扫描模式,以便工作人员无需每次扫码都按压按钮。现有基于ESP8266的代码如下:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

const char* ssid = "1234";
const char* password = "*********";

String apiEndpoint = "http://domain/api/read_qr_kds";

//const unsigned char Passive_buzzer = 2;

String raw_data = "";
bool new_data_available = false;

void setup() {
  Serial.begin(9600); // Make sure this matches the baud rate of your QR scanner

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

//  pinMode(Passive_buzzer, OUTPUT);
}

void loop() {
  while(WiFi.status() == WL_CONNECTED){
  // Read serial data and construct the raw_data string
    while (Serial.available()) {
      char input = Serial.read();
      
      // Check if the character is printable before adding it to raw_data
      if (isPrintable(input) || input == '\n') {
        raw_data += input;
      }
  
      // If we receive a newline character, set the flag
      if (input == '\n' && raw_data.length() > 1) {
        new_data_available = true;
      }
    }
  
    // If new data is available, process it
    if (new_data_available) {
      Serial.println(raw_data);
      
      // Encode the raw_data before sending
      String encodedData = urlencode(raw_data);
      sendQRDataToAPI(encodedData);
      
      raw_data = ""; // Reset raw_data after sending
      new_data_available = false; // Reset the flag
    }
  }
}

void sendQRDataToAPI(String data) {
    HTTPClient http;
    WiFiClient client;
    
    String link = apiEndpoint + "?raw_data=" + data;
    Serial.println(link);

    http.begin(client, link);
    int httpCode = http.GET();
  
    if (httpCode == HTTP_CODE_OK) {
      Serial.println(httpCode);
      String response = http.getString();
      Serial.println("API Response: " + response);

      // Parse the JSON response
      StaticJsonDocument<512> doc;
      DeserializationError error = deserializeJson(doc, response);
      
      if (!error) {
        int orderId = doc["qrData"]["OrderID"];
        Serial.print("OrderID: ");
        Serial.println(orderId);
        const char* status = doc["status"];
        Serial.print("Status: ");
        Serial.println(status);
      } else {
        Serial.print("JSON deserialization failed: ");
        Serial.println(error.c_str());
      }
    } else {
      Serial.print("HTTP Error code: ");
      Serial.println(httpCode);
    }
  
    http.end();
}

// Encoding the raw_data before sending it to the API
String urlencode(String str) {
    String encodedString = "";
    char c;
    char code0;
    char code1;
    
    for (unsigned int i = 0; i < str.length(); i++) {
        c = str.charAt(i);
        if (c == ' ') {
            encodedString += '+';
        } else if (isalnum(c)) {
            encodedString += c;
        } else {
            code1 = (c & 0xf) + '0';
            if ((c & 0xf) > 9) {
                code1 = (c & 0xf) - 10 + 'A';
            }
            c = (c >> 4) & 0xf;
            code0 = c + '0';
            if (c > 9) {
                code0 = c - 10 + 'A';
            }
            encodedString += '%';
            encodedString += code0;
            encodedString += code1;
        }
        yield();
    }
    return encodedString;
}
解决方案

一、设备配置调整(无需硬件改动)

MH-ET live扫描器支持通过串口指令切换扫描模式,步骤如下:

  • 将扫描器通过USB-TTL模块连接到电脑,打开串口助手(波特率设置为9600,与代码一致)
  • 发送配置指令:AT+TRIG=A,该指令用于设置自动连续扫描模式
  • 等待扫描器返回OK确认,随后重启扫描器,设备将进入持续扫描状态,无需按压侧边按钮

二、代码修改(解决重复扫码问题)

持续扫描模式下,扫描器会反复识别同一二维码,导致重复请求API。需要添加重复数据过滤逻辑,具体修改如下:

1. 添加全局变量

在代码开头的全局变量区域添加以下内容:

String last_scanned_data = "";
unsigned long last_scan_time = 0;
const unsigned int SCAN_DELAY = 2000; // 2秒内同一二维码不重复处理,可按需调整

2. 修改数据处理逻辑

找到loop函数中处理新数据的代码块,替换为以下内容:

if (new_data_available) {
  // 去除字符串两端的换行、空格等无效字符
  String cleaned_data = raw_data.trim();
  
  // 检查是否为新数据,或已超过设定的重复过滤时间
  if (cleaned_data != last_scanned_data || (millis() - last_scan_time) > SCAN_DELAY) {
    Serial.println(cleaned_data);
    
    // 编码并发送数据到API
    String encodedData = urlencode(cleaned_data);
    sendQRDataToAPI(encodedData);
    
    // 更新上次扫描的记录
    last_scanned_data = cleaned_data;
    last_scan_time = millis();
  }
  
  raw_data = "";
  new_data_available = false;
}

3. 优化串口数据读取(可选)

为避免扫描器发送的无效控制字符干扰,优化串口读取逻辑:

while (Serial.available()) {
  char input = Serial.read();
  
  // 仅保留可打印字符和换行符,忽略回车符
  if (isPrintable(input) || input == '\n') {
    if (input != '\r') {
      raw_data += input;
    }
  }

  // 仅当收到换行且有效内容不为空时,标记新数据可用
  if (input == '\n' && raw_data.trim().length() > 0) {
    new_data_available = true;
  }
}

内容的提问来源于stack exchange,提问作者C Program

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:12:10