张世豪
昨天 43bd281a47eeac52e649ef79ea25c0dd4d61af7d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package chuankou;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * 串口消息发送工具类
 * 提供高性能的串口消息发送功能,适合高频调用
 */
public class Sendmsg {
    // 静态串口服务实例
    private static volatile SerialPortService serialService = null;
    private static volatile boolean isPortOpen = false;
    
    // 调试模式开关
    private static final boolean DEBUG_MODE = false;
    
    // 日期格式化
    private static final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
    
    /**
     * 设置串口服务实例
     * @param service 串口服务实例
     * @param open 串口是否打开
     */
    public static void setSerialService(SerialPortService service, boolean open) {
        serialService = service;
        isPortOpen = open;
    }
    
    /**
     * 获取串口服务实例
     */
    public static SerialPortService getSerialService() {
        return serialService;
    }
    
    /**
     * 发送消息到串口
     * @param message 要发送的HEX格式消息
     * @return 发送成功返回true,失败返回false
     */
    public static boolean sendMessage(String message) {
        if (!isPortOpen || serialService == null) {
            if (DEBUG_MODE) {
                System.err.println("[" + getCurrentTime() + "] 串口未打开,无法发送数据");
            }
            return false;
        }
        
        if (message == null || message.trim().isEmpty()) {
            if (DEBUG_MODE) {
                System.err.println("[" + getCurrentTime() + "] 发送数据为空");
            }
            return false;
        }
        
        String text = message.trim();
        
        try {
            // HEX格式发送
            byte[] data = hexStringToByteArray(text);
            if (data != null && serialService.send(data)) {
                // 高频调用时避免频繁的日志输出,只在调试时记录
                if (DEBUG_MODE) {
                    System.out.println("[" + getCurrentTime() + "] 发送: " + text.toUpperCase());
                }
                return true;
            } else {
                if (DEBUG_MODE) {
                    System.err.println("[" + getCurrentTime() + "] 数据发送失败");
                }
                return false;
            }
        } catch (Exception e) {
            if (DEBUG_MODE) {
                System.err.println("[" + getCurrentTime() + "] 数据格式错误: " + e.getMessage());
            }
            return false;
        }
    }
    
    /**
     * 检查串口是否已打开
     * @return 串口打开状态
     */
    public static boolean isPortOpen() {
        return isPortOpen && serialService != null;
    }
    
    /**
     * HEX字符串转字节数组
     * @param s HEX字符串
     * @return 字节数组
     */
    private static byte[] hexStringToByteArray(String s) {
        if (s == null || s.isEmpty()) {
            return new byte[0];
        }
        
        s = s.replaceAll("\\s+", ""); // 移除空格
        int len = s.length();
        if (len % 2 != 0) {
            throw new IllegalArgumentException("HEX字符串长度必须为偶数");
        }
        
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            int high = Character.digit(s.charAt(i), 16);
            int low = Character.digit(s.charAt(i + 1), 16);
            
            if (high == -1 || low == -1) {
                throw new IllegalArgumentException("无效的HEX字符: " + s.charAt(i) + s.charAt(i + 1));
            }
            
            data[i / 2] = (byte) ((high << 4) + low);
        }
        return data;
    }
    
    /**
     * 字节数组转HEX字符串
     * @param bytes 字节数组
     * @return HEX字符串
     */
    public static String bytesToHex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return "";
        }
        
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
    
    /**
     * 获取当前时间字符串
     * @return 时间字符串
     */
    private static String getCurrentTime() {
        return timeFormat.format(new Date());
    }
    
    /**
     * 启用调试模式
     * 注意:这会修改静态final变量,实际项目中不建议这样做
     * 这里只是演示,实际应该通过配置文件控制
     */
    public static void enableDebugMode() {
        // 在实际项目中,应该使用可配置的方式而不是修改final变量
        // 这里只是示意,实际使用时需要重新设计
        System.out.println("调试模式已启用");
    }
}