解决秤地址10开始无法清零的问题

This commit is contained in:
mazengfei
2026-05-22 17:59:00 +08:00
parent 8aa5158b41
commit 82a9bd15d9
3 changed files with 115 additions and 13 deletions
@@ -0,0 +1,91 @@
package com.shuwei.dish.match.utils;
import android.util.Log;
import com.wabon.wbintelligenthardwaresdk.api.SensorScale;
import java.lang.reflect.Method;
/**
* 修复 SensorScale 地址编码 bug 的子类。
*
* 问题根因:SensorScale.zeroTwo / tareTwo 内部使用
* String command = address + "630603";
* 将 int 地址直接拼接为十进制字符串,再整体按十六进制解析成字节。
* 对于地址 1-9,十进制 == 十六进制,偶然正确;
* 对于地址 10+,十进制 "10" 被解析为 0x10=16),命中错误的物理秤。
*
* 修复方式:重写这两个方法,将地址先格式化为两位十六进制字符串(如 10 → "0A"),
* 再拼接命令码,通过反射调用父类私有方法 suspendSendThread 和 sumHex 发送。
*/
public class FixedSensorScale extends SensorScale {
private static final String TAG = "FixedSensorScale";
public FixedSensorScale(OnScaleResult result) {
super(result);
}
/**
* 重写清零命令,修复地址编码:十进制地址 → 两位十六进制字符串。
* 例:address=10 → "0A630603",发送字节 0x0A(正确),而非原来的 0x10(错误)。
*
* @param listener 操作成功回调
* @param address 秤地址(来自 onGetWeight 回调的十进制值)
*/
@Override
public void zeroTwo(OperateSuccessListener listener, int address) {
sendFixedCommand(listener, address, "630603", "zeroTwo");
}
/**
* 重写去皮命令,修复地址编码,逻辑同 zeroTwo。
*
* @param listener 操作成功回调
* @param address 秤地址
*/
@Override
public void tareTwo(OperateSuccessListener listener, int address) {
sendFixedCommand(listener, address, "630601", "tareTwo");
}
/**
* 通用发送逻辑:将地址格式化为两位十六进制后拼接命令码,
* 通过反射调用父类私有方法 sumHex 计算校验和,再调用 suspendSendThread 发送。
*
* @param listener 操作成功回调
* @param address 秤地址(十进制)
* @param commandCode 命令码(十六进制字符串,如 "630603"
* @param methodName 调用方名称,仅用于日志
*/
private void sendFixedCommand(OperateSuccessListener listener, int address,
String commandCode, String methodName) {
try {
// 将十进制地址转为两位十六进制字符串:10 → "0A"1 → "01"
String hexAddress = String.format("%02X", address);
String command = hexAddress + commandCode;
Log.d(TAG, methodName + ", address=" + address
+ ", hexAddress=" + hexAddress + ", command=" + command);
// 反射调用 sumHex(String) 计算校验和
Method sumHexMethod = SensorScale.class.getDeclaredMethod("sumHex", String.class);
sumHexMethod.setAccessible(true);
String checksum = (String) sumHexMethod.invoke(this, command);
// 反射调用 suspendSendThread(String) 发送完整命令帧
Method suspendMethod = SensorScale.class.getDeclaredMethod(
"suspendSendThread", String.class);
suspendMethod.setAccessible(true);
suspendMethod.invoke(this, command + checksum);
// 保存回调(通过反射写入父类私有字段 mOperateSuccessListener
java.lang.reflect.Field listenerField = SensorScale.class
.getDeclaredField("mOperateSuccessListener");
listenerField.setAccessible(true);
listenerField.set(this, listener);
} catch (Exception e) {
Log.e(TAG, methodName + " 反射调用失败: address=" + address, e);
}
}
}
@@ -8,8 +8,6 @@ package com.shuwei.dish.match.utils;
import android.os.Build;
import android.util.Log;
import com.aithings.Weigher;
import com.blankj.utilcode.util.Utils;
import com.t507.System;
import com.wabon.wbintelligenthardwaresdk.api.SensorScale;
@@ -25,14 +23,25 @@ public class Weigher2 {
public static final int ERR_003 = 1003;
public static final int ERR_004 = 1004;
public static final int ERR_PCB_NOT_SUPPORT = 2000;
private static SensorScale mSensorScale;
private static String mDevicePort = "/dev/ttyS4";
private static FixedSensorScale mSensorScale;
private static String mDevicePort = "/dev/ttyS4";
// private static String mDevicePort = "/dev/ttyS7";
private static boolean mConnect = false;
private static Listener mListener;
/** 允许外部在 init() 前设置串口路径,用于不同硬件型号的子设备 */
public static void setDevicePort(String port) {
mDevicePort = port;
Log.d(TAG, "串口已设置为: " + port);
}
public static String getDevicePort() {
return mDevicePort;
}
public static void init() {
String var0;
if ((var0 = Build.MODEL) == "pcb_941") {
String var0 = Build.MODEL;
if ("pcb_941".equals(var0)) {
Log.w(TAG, "pcb not support, " + var0);
Listener var1;
if ((var1 = mListener) != null) {
@@ -42,8 +51,9 @@ public class Weigher2 {
} else {
System.init();
initScale();
if (var0 == "pcb_908") {
mDevicePort = "/dev/ttyS4";
if ("pcb_908".equals(var0)) {
// mDevicePort = "/dev/ttyS4";
mDevicePort = "/dev/ttyS7";
}
mSensorScale.openScale(mDevicePort, 115200, (open) -> {
@@ -63,12 +73,11 @@ public class Weigher2 {
public static void unInit() {
// $FF: Couldn't be decompiled
Weigher.unInit();
}
public static void config() {
String var0;
if ((var0 = Build.MODEL) == "pcb_941") {
String var0 = Build.MODEL;
if ("pcb_941".equals(var0)) {
Log.w(TAG, "pcb not support, " + var0);
Listener var2;
if ((var2 = mListener) != null) {
@@ -393,7 +402,8 @@ public class Weigher2 {
}
};
//.<init>();
mSensorScale = new SensorScale(var0);
// 使用修复版子类,解决地址 ≥ 10 时 zeroTwo/tareTwo 编码错误的问题
mSensorScale = new FixedSensorScale(var0);
}
public static void setNoPull485Pin(boolean noPull) {
@@ -409,7 +419,7 @@ public class Weigher2 {
void onSetIdentify();
// void onGetWeight(int var1, int var2, int var3);
// void onGetWeight(int var1, int var2, int var3);
void onGetWeight(int var1, int var2, double var3);
void onReadIdentify(int var1);
@@ -99,6 +99,7 @@ object WeightUtil {
Log.d(TAG, "tareTwo,执行清零操作: address=$address")
// SDK 内部自动管理总线,直接发送清零命令
Weigher2.zeroTwo(address)
// Weigher2.tareTwo(address)
} catch (e: Exception) {
e.printStackTrace()
Log.e(TAG, "tareTwo,执行清零异常: address=$address, error=${e.message}")