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("调试模式已启用"); } }