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