From 82a9bd15d94f7ce55e099a856f9dfcf14a245041 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Fri, 22 May 2026 17:59:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=A7=A4=E5=9C=B0=E5=9D=8010?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E6=97=A0=E6=B3=95=E6=B8=85=E9=9B=B6=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dish/match/utils/FixedSensorScale.java | 91 +++++++++++++++++++ .../com/shuwei/dish/match/utils/Weigher2.java | 36 +++++--- .../com/shuwei/dish/match/utils/WeightUtil.kt | 1 + 3 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/shuwei/dish/match/utils/FixedSensorScale.java diff --git a/app/src/main/java/com/shuwei/dish/match/utils/FixedSensorScale.java b/app/src/main/java/com/shuwei/dish/match/utils/FixedSensorScale.java new file mode 100644 index 0000000..655aa45 --- /dev/null +++ b/app/src/main/java/com/shuwei/dish/match/utils/FixedSensorScale.java @@ -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); + } + } +} diff --git a/app/src/main/java/com/shuwei/dish/match/utils/Weigher2.java b/app/src/main/java/com/shuwei/dish/match/utils/Weigher2.java index c25bdf9..d9e13b7 100644 --- a/app/src/main/java/com/shuwei/dish/match/utils/Weigher2.java +++ b/app/src/main/java/com/shuwei/dish/match/utils/Weigher2.java @@ -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 { } }; //.(); - 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); diff --git a/app/src/main/java/com/shuwei/dish/match/utils/WeightUtil.kt b/app/src/main/java/com/shuwei/dish/match/utils/WeightUtil.kt index 82b84e2..5b160b1 100644 --- a/app/src/main/java/com/shuwei/dish/match/utils/WeightUtil.kt +++ b/app/src/main/java/com/shuwei/dish/match/utils/WeightUtil.kt @@ -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}")