ESP32向Firebase实时数据库发送条码数据报错:无法解析JSON
解决Firebase实时数据库写入条码数据时的JSON解析错误
问题根源是扫描器返回的条码字符串包含隐藏的换行/回车字符(比如\r),这些字符导致Firebase无法正确解析JSON格式的数据,而你测试的固定字符串"Hello"没有这类多余字符,所以可以正常写入。
修复步骤
对读取到的条码字符串进行修剪,移除首尾的空白字符(包括换行、回车、空格等),直接使用String类的trim()方法即可:
修改代码中读取条码的行:
String barcodeData = scannerSerial.readStringUntil('\n').trim();
调试验证(可选)
如果想确认字符串中是否存在隐藏字符,可以添加以下代码打印字符串长度和每个字符的ASCII值:
Serial.println("Barcode length: " + String(barcodeData.length())); for (int i = 0; i < barcodeData.length(); i++) { Serial.print("Char " + String(i) + ": "); Serial.println((int)barcodeData[i]); }
正常的条码字符ASCII值应该在可打印范围内(32~126),如果出现13(回车\r)或10(换行\n),就说明是这些字符导致的问题。
修改后的完整loop函数
void loop(){ if (scannerSerial.available() > 0) { String barcodeData = scannerSerial.readStringUntil('\n').trim(); Serial.println(barcodeData); Serial.println("Barcode: " + barcodeData); if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)){ sendDataPrevMillis = millis(); // Write on the database path test/int if (Firebase.RTDB.setString(&fbdo, "test/int", barcodeData)){ Serial.println("PASSED"); Serial.println("PATH: " + fbdo.dataPath()); Serial.println("TYPE: " + fbdo.dataType()); Serial.println("Barcode: " + barcodeData); digitalWrite(ledPinGreen, HIGH); delay(2000); digitalWrite(ledPinGreen, LOW); } else { Serial.println("FAILED"); Serial.println("REASON: " + fbdo.errorReason()); digitalWrite(ledPinRed, HIGH); delay(2000); digitalWrite(ledPinRed, LOW); } } } }
内容的提问来源于stack exchange,提问作者user21007637
相关产品推荐
相关产品推荐

