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

