diff --git a/.idea/artifacts/javafxTool_qe_mac_jar.xml b/.idea/artifacts/javafxTool_qe_mac_jar.xml index 50bfcbca4..5a96abc5b 100644 --- a/.idea/artifacts/javafxTool_qe_mac_jar.xml +++ b/.idea/artifacts/javafxTool_qe_mac_jar.xml @@ -2,10 +2,10 @@ $PROJECT_DIR$/out/artifacts/javafxTool_qe_mac_jar - - - + + + @@ -17,6 +17,7 @@ + diff --git a/.idea/artifacts/javafxTool_qe_win_jar.xml b/.idea/artifacts/javafxTool_qe_win_jar.xml index 69b6f5c3a..f35178741 100644 --- a/.idea/artifacts/javafxTool_qe_win_jar.xml +++ b/.idea/artifacts/javafxTool_qe_win_jar.xml @@ -2,10 +2,10 @@ $PROJECT_DIR$/out/artifacts/javafxTool_qe_win_jar - - - + + + @@ -17,6 +17,7 @@ + @@ -75,4 +76,4 @@ - + \ No newline at end of file diff --git a/core/src/main/java/com/tlcsdm/core/util/DependencyInfo.java b/core/src/main/java/com/tlcsdm/core/util/DependencyInfo.java index 2d74d4e08..99e41288b 100644 --- a/core/src/main/java/com/tlcsdm/core/util/DependencyInfo.java +++ b/core/src/main/java/com/tlcsdm/core/util/DependencyInfo.java @@ -232,6 +232,10 @@ private static class SingletonInstance { "https://javaluator.fathzer.com", "Apache License, Version 2.0", "https://www.apache.org/licenses/LICENSE-2.0"), + new Dependency("com.fazecast", "jSerialComm", "2.11.0", false, + "https://fazecast.github.io/jSerialComm", "GNU LGPL", + "https://www.gnu.org/licenses/lgpl-3.0.html"), + new Dependency("com.github.gino0631", "icns-core", "1.2", false, "https://github.com/gino0631/icns", "GNU LGPL", "https://opensource.org/license/lgpl-3-0")); diff --git a/qe/src/main/java/com/tlcsdm/qe/tools/SerialPortTool.java b/qe/src/main/java/com/tlcsdm/qe/tools/SerialPortTool.java index b02f71879..11d698c6f 100644 --- a/qe/src/main/java/com/tlcsdm/qe/tools/SerialPortTool.java +++ b/qe/src/main/java/com/tlcsdm/qe/tools/SerialPortTool.java @@ -27,17 +27,16 @@ package com.tlcsdm.qe.tools; -import cn.hutool.core.util.StrUtil; import cn.hutool.log.StaticLog; import com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; -import com.tlcsdm.core.javafx.control.FxTextInput; import com.tlcsdm.core.javafx.helper.LayoutHelper; import com.tlcsdm.core.javafx.util.Config; import com.tlcsdm.core.javafx.util.FxmlUtil; import com.tlcsdm.qe.QeSample; import com.tlcsdm.qe.util.I18nUtils; +import javafx.animation.Timeline; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -57,11 +56,8 @@ import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.ResourceBundle; -import java.util.Timer; import java.util.stream.Collectors; /** @@ -72,28 +68,41 @@ */ public class SerialPortTool extends QeSample implements Initializable { + //串口名称选择器 @FXML private ComboBox serPort; + //波特率选择器 @FXML private ComboBox serPortSpeed; + //检验位选择器 @FXML private ComboBox serPortCheckBit; + //数据位选择器 @FXML private ComboBox serPortDataBit; + //停止位选择器 @FXML private ComboBox serPortStopBit; + //流控选择器 + @FXML + private ComboBox serFlowControl; @FXML private Button serPortOpenBtn; + //16进制接收显示开关 @FXML private CheckBox recvShowHex; + //显示时间 @FXML private CheckBox recvShowTime; + //暂停接收 @FXML private CheckBox recvStopShow; @FXML private Button recvClear; + //16进制发送开关 @FXML private CheckBox sendHex; + //定时发送开关 @FXML private CheckBox sendCycle; @FXML @@ -113,7 +122,8 @@ public class SerialPortTool extends QeSample implements Initializable { @FXML private Button sendBtn; - private Timer t; + private final Timeline circularSending = new Timeline(); + private volatile long waitTime = 1000; @Override public Node getPanel(Stage stage) { @@ -152,6 +162,11 @@ public String getSampleVersion() { return "1.0.1"; } + @Override + public boolean hasControlPanel() { + return false; + } + @Override public void initialize(URL location, ResourceBundle resources) { initializeUserDataBindings(); @@ -161,33 +176,6 @@ public void initialize(URL location, ResourceBundle resources) { initializeUI(); } - @Override - public Node getControlPanel() { - String content = """ - {note} - {enableMunge}: {enableMungeDesc} - {enableVerbose}: {enableVerboseDesc} - {enableOptimizations}: {enableOptimizationsDesc} - {enablePreserveAllSemiColons}: {enablePreserveAllSemiColonsDesc} - {enableLinebreakpos}: {enableLinebreakposDesc} - """; - - Map map = new HashMap<>(32); - map.put("note", I18nUtils.get("qe.tool.compress.description.note")); - map.put("enableMunge", I18nUtils.get("qe.tool.compress.check.enableMunge")); - map.put("enableVerbose", I18nUtils.get("qe.tool.compress.check.enableVerbose")); - map.put("enableOptimizations", I18nUtils.get("qe.tool.compress.check.enableOptimizations")); - map.put("enablePreserveAllSemiColons", I18nUtils.get("qe.tool.compress.check.enablePreserveAllSemiColons")); - map.put("enableLinebreakpos", I18nUtils.get("qe.tool.compress.check.enableLinebreakpos")); - map.put("enableMungeDesc", I18nUtils.get("qe.tool.compress.check.enableMunge.description")); - map.put("enableVerboseDesc", I18nUtils.get("qe.tool.compress.check.enableVerbose.description")); - map.put("enableOptimizationsDesc", I18nUtils.get("qe.tool.compress.check.enableOptimizations.description")); - map.put("enablePreserveAllSemiColonsDesc", - I18nUtils.get("qe.tool.compress.check.enablePreserveAllSemiColons.description")); - map.put("enableLinebreakposDesc", I18nUtils.get("qe.tool.compress.check.enableLinebreakpos.description")); - return FxTextInput.textArea(StrUtil.format(content, map)); - } - /** * 设置刷新串口信息按钮被点击时的事件处理器: 重新获取本机当前串口信息 */ @@ -242,6 +230,12 @@ public ImageView getSampleImageIcon() { // https://github.com/yiaoBang/SerialPortToolFX/blob/master/src/main/java/com/yiaoBang/serialPortToolFX/view/SerialPortView.java public void initializeUI() { + //无限循环发送 + circularSending.setCycleCount(Timeline.INDEFINITE); + + // recvCount + // sendNumber.textProperty().bind(viewModel.getSEND_LONG_PROPERTY().asString()); + // receiveNumber.textProperty().bind(viewModel.getRECEIVE_LONG_PROPERTY().asString()); // // 初始化常用波特率列表 // baudRateComboBox.getItems().addAll("9600", "4800", "2400", "1200"); @@ -308,6 +302,28 @@ public void initializeUI() { } serPortStopBit.setValue("1"); + //流控 + // String[] flowControl = new String[]{ + // "100", "300", "600", "1200" + // }; + // for (String s : speeds) { + // serPortSpeed.getItems().add(s); + // } + // serPortSpeed.setValue("9600"); + //serFlowControl.getItems().addAll(SerialPort.FLOW_CONTROL_DISABLED); + + //循环发送的等待时间(ms) + sendCycleRap.textProperty().addListener((o, oldValue, newValue) -> { + try { + waitTime = Integer.parseInt(newValue); + if (waitTime < 1) { + waitTime = 1; + } + } catch (NumberFormatException e) { + sendCycleRap.setText(oldValue); + } + }); + serPortOpenBtn.setOnAction((ActionEvent event) -> { SerialPort serialPort = serPort.getSelectionModel().getSelectedItem(); if (serialPort == null) { @@ -322,6 +338,8 @@ public void initializeUI() { serPortDataBit.setDisable(false); serPortStopBit.setDisable(false); } else { + serialPortDataListener listener = new serialPortDataListener(); + serialPort.addDataListener(listener); serialPort.openPort(); //SerialPort.ONE_STOP_BIT //SerialPort.NO_PARITY @@ -333,7 +351,7 @@ public void initializeUI() { serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED); serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000); - //UsartRXEven(); + serPortOpenBtn.setText("关闭"); serPort.setDisable(true); serPortSpeed.setDisable(true); @@ -342,48 +360,52 @@ public void initializeUI() { serPortStopBit.setDisable(true); } }); - // - // sendBtn.setOnAction(event -> { - // if (null == serialPort || (!serialPort.isOpened())) { - // // new AlertBox().display("错误", "请先打开串口"); - // return; - // } - // try { - // if (sendHex.isSelected()) { - // serialPort.writeBytes(hexStringToBytes(sendTextAear.getText())); - // sendCount.setText(String.valueOf( - // (Integer.parseInt(sendCount.getText()) + hexStringToBytes(sendTextAear.getText()).length))); - // } else { - // serialPort.writeBytes(sendTextAear.getText().getBytes()); - // sendCount.setText(String.valueOf( - // (Integer.parseInt(sendCount.getText()) + sendTextAear.getText().getBytes().length))); - // } - // - // } catch (Exception e) { - // //new AlertBox().display("发送数据错误", e.getMessage()); - // } - // }); - // - // recvClear.setOnAction(event -> { - // recvTextAear.setText(""); - // }); - // sendHex.setOnAction(event -> { - // if (!sendHex.isSelected()) - // try { - // sendTextAear.setText(new String(hexStringToBytes(sendTextAear.getText()))); - // } catch (Exception e) { - // //new AlertBox().display("非法16进制字符", e.getMessage()); - // } - // else - // sendTextAear.setText(bytesToHexString(sendTextAear.getText().getBytes())); - // }); - // sendClear.setOnAction(event -> { - // sendTextAear.setText(""); - // }); - // CountReset.setOnAction(event -> { - // sendCount.setText("0"); - // recvCount.setText("0"); - // }); + + sendBtn.setOnAction(event -> { + SerialPort serialPort = serPort.getSelectionModel().getSelectedItem(); + if (null == serialPort || (!serialPort.isOpen())) { + // new AlertBox().display("错误", "请先打开串口"); + return; + } + try { + if (sendHex.isSelected()) { + byte[] bytes = hexStringToBytes(sendTextAear.getText()); + serialPort.writeBytes(bytes, bytes.length); + sendCount.setText(String.valueOf( + (Integer.parseInt(sendCount.getText()) + hexStringToBytes(sendTextAear.getText()).length))); + } else { + byte[] bytes = sendTextAear.getText().getBytes(); + serialPort.writeBytes(bytes, bytes.length); + sendCount.setText(String.valueOf( + (Integer.parseInt(sendCount.getText()) + sendTextAear.getText().getBytes().length))); + } + + } catch (Exception e) { + //new AlertBox().display("发送数据错误", e.getMessage()); + } + }); + + recvClear.setOnAction(event -> { + recvTextAear.setText(""); + }); + sendHex.setOnAction(event -> { + if (!sendHex.isSelected()) + try { + sendTextAear.setText(new String(hexStringToBytes(sendTextAear.getText()))); + } catch (Exception e) { + //new AlertBox().display("非法16进制字符", e.getMessage()); + } + else { + sendTextAear.setText(bytesToHexString(sendTextAear.getText().getBytes())); + } + }); + sendClear.setOnAction(event -> { + sendTextAear.setText(""); + }); + CountReset.setOnAction(event -> { + sendCount.setText("0"); + recvCount.setText("0"); + }); // sendCycle.setOnAction(event -> { // if (null == serialPort || (!serialPort.isOpened())) { // //new AlertBox().display("错误", "请先打开串口"); @@ -462,6 +484,17 @@ public void initializeUserDataBindings() { // userData.put("txtCssLinebreakpos", txtCssLinebreakpos); } + @Override + public void dispose() { + SerialPort serialPort = serPort.getSelectionModel().getSelectedItem(); + if (serialPort == null) { + return; + } + if (serialPort.isOpen()) { + serialPort.closePort(); + } + } + /** * 获得当前计算机所有的串口的名称列表 * @@ -511,30 +544,6 @@ private SerialPort openPort(String portName, int baudRate) { return serialPort; } - /** - * 关闭串口 - * - * @param serialPort 待关闭的串口对象 - */ - private void closePort(SerialPort serialPort) { - if (serialPort != null && serialPort.isOpen()) { - serialPort.closePort(); - } - } - - /** - * 往串口发送数据 - * - * @param serialPort 串口对象 - * @param content 待发送数据 - */ - private void sendToPort(SerialPort serialPort, byte[] content) { - if (!serialPort.isOpen()) { - return; - } - serialPort.writeBytes(content, content.length); - } - /** * 从串口读取数据 * @@ -573,8 +582,9 @@ public int getListeningEvents() { public void serialEvent(SerialPortEvent event) { byte[] newData = event.getReceivedData(); System.out.println("Received data of size: " + newData.length); - for (int i = 0; i < newData.length; ++i) + for (int i = 0; i < newData.length; ++i) { System.out.print((char) newData[i]); + } System.out.println("\n"); } } diff --git a/qe/src/main/java/com/tlcsdm/qe/util/QeConstant.java b/qe/src/main/java/com/tlcsdm/qe/util/QeConstant.java index 873b3849d..d652a1b06 100644 --- a/qe/src/main/java/com/tlcsdm/qe/util/QeConstant.java +++ b/qe/src/main/java/com/tlcsdm/qe/util/QeConstant.java @@ -96,7 +96,7 @@ public class QeConstant { */ public static final List DEPENDENCY_LIST = List.of("poi", "freemarker", "dom4j", "java-diff-utils", "richtextfx", "thumbnailator", "jackson", "yuicompressor", "teenyhttpd", "image4j", "commons-imaging", - "icns-core", "preferencesfx"); + "icns-core", "preferencesfx", "jSerialComm"); private QeConstant() { } diff --git a/qe/src/main/resources/com/tlcsdm/qe/fxml/serialPortTool.fxml b/qe/src/main/resources/com/tlcsdm/qe/fxml/serialPortTool.fxml index 7d965351b..980f563d9 100644 --- a/qe/src/main/resources/com/tlcsdm/qe/fxml/serialPortTool.fxml +++ b/qe/src/main/resources/com/tlcsdm/qe/fxml/serialPortTool.fxml @@ -62,20 +62,23 @@ -