27
27
28
28
package com .tlcsdm .qe .tools ;
29
29
30
- import cn .hutool .core .util .StrUtil ;
31
30
import cn .hutool .log .StaticLog ;
32
31
import com .fazecast .jSerialComm .SerialPort ;
33
32
import com .fazecast .jSerialComm .SerialPortDataListener ;
34
33
import com .fazecast .jSerialComm .SerialPortEvent ;
35
- import com .tlcsdm .core .javafx .control .FxTextInput ;
36
34
import com .tlcsdm .core .javafx .helper .LayoutHelper ;
37
35
import com .tlcsdm .core .javafx .util .Config ;
38
36
import com .tlcsdm .core .javafx .util .FxmlUtil ;
37
+ import com .tlcsdm .core .util .CoreConstant ;
39
38
import com .tlcsdm .qe .QeSample ;
40
39
import com .tlcsdm .qe .util .I18nUtils ;
40
+ import javafx .animation .Timeline ;
41
41
import javafx .event .ActionEvent ;
42
42
import javafx .fxml .FXML ;
43
43
import javafx .fxml .FXMLLoader ;
57
57
58
58
import java .net .URL ;
59
59
import java .util .ArrayList ;
60
- import java .util .HashMap ;
61
60
import java .util .List ;
62
- import java .util .Map ;
63
61
import java .util .ResourceBundle ;
64
- import java .util .Timer ;
65
62
import java .util .stream .Collectors ;
66
63
67
64
/**
72
69
*/
73
70
public class SerialPortTool extends QeSample implements Initializable {
74
71
72
+ //串口名称选择器
75
73
@ FXML
76
74
private ComboBox <SerialPort > serPort ;
75
+ //波特率选择器
77
76
@ FXML
78
77
private ComboBox <String > serPortSpeed ;
78
+ //检验位选择器
79
79
@ FXML
80
80
private ComboBox <String > serPortCheckBit ;
81
+ //数据位选择器
81
82
@ FXML
82
83
private ComboBox <String > serPortDataBit ;
84
+ //停止位选择器
83
85
@ FXML
84
86
private ComboBox <String > serPortStopBit ;
87
+ //流控选择器
88
+ @ FXML
89
+ private ComboBox <String > serFlowControl ;
85
90
@ FXML
86
91
private Button serPortOpenBtn ;
92
+ //16进制接收显示开关
87
93
@ FXML
88
94
private CheckBox recvShowHex ;
95
+ //显示时间
89
96
@ FXML
90
97
private CheckBox recvShowTime ;
98
+ //暂停接收
91
99
@ FXML
92
100
private CheckBox recvStopShow ;
93
101
@ FXML
94
102
private Button recvClear ;
103
+ //16进制发送开关
95
104
@ FXML
96
105
private CheckBox sendHex ;
106
+ //定时发送开关
97
107
@ FXML
98
108
private CheckBox sendCycle ;
99
109
@ FXML
@@ -113,7 +123,8 @@ public class SerialPortTool extends QeSample implements Initializable {
113
123
@ FXML
114
124
private Button sendBtn ;
115
125
116
- private Timer t ;
126
+ private final Timeline circularSending = new Timeline ();
127
+ private volatile long waitTime = 1000 ;
117
128
118
129
@ Override
119
130
public Node getPanel (Stage stage ) {
@@ -149,7 +160,18 @@ public String getSampleDescription() {
149
160
150
161
@ Override
151
162
public String getSampleVersion () {
152
- return "1.0.1" ;
163
+ return "1.0.1-Beta" ;
164
+ }
165
+
166
+ @ Override
167
+ public boolean hasControlPanel () {
168
+ return false ;
169
+ }
170
+
171
+ @ Override
172
+ public boolean isVisible () {
173
+ String value = System .getProperty (CoreConstant .JVM_WORKENV );
174
+ return CoreConstant .JVM_WORKENV_DEV .equals (value ) || CoreConstant .JVM_WORKENV_TEST .equals (value );
153
175
}
154
176
155
177
@ Override
@@ -161,33 +183,6 @@ public void initialize(URL location, ResourceBundle resources) {
161
183
initializeUI ();
162
184
}
163
185
164
- @ Override
165
- public Node getControlPanel () {
166
- String content = """
167
- {note}
168
- {enableMunge}: {enableMungeDesc}
169
- {enableVerbose}: {enableVerboseDesc}
170
- {enableOptimizations}: {enableOptimizationsDesc}
171
- {enablePreserveAllSemiColons}: {enablePreserveAllSemiColonsDesc}
172
- {enableLinebreakpos}: {enableLinebreakposDesc}
173
- """ ;
174
-
175
- Map <String , String > map = new HashMap <>(32 );
176
- map .put ("note" , I18nUtils .get ("qe.tool.compress.description.note" ));
177
- map .put ("enableMunge" , I18nUtils .get ("qe.tool.compress.check.enableMunge" ));
178
- map .put ("enableVerbose" , I18nUtils .get ("qe.tool.compress.check.enableVerbose" ));
179
- map .put ("enableOptimizations" , I18nUtils .get ("qe.tool.compress.check.enableOptimizations" ));
180
- map .put ("enablePreserveAllSemiColons" , I18nUtils .get ("qe.tool.compress.check.enablePreserveAllSemiColons" ));
181
- map .put ("enableLinebreakpos" , I18nUtils .get ("qe.tool.compress.check.enableLinebreakpos" ));
182
- map .put ("enableMungeDesc" , I18nUtils .get ("qe.tool.compress.check.enableMunge.description" ));
183
- map .put ("enableVerboseDesc" , I18nUtils .get ("qe.tool.compress.check.enableVerbose.description" ));
184
- map .put ("enableOptimizationsDesc" , I18nUtils .get ("qe.tool.compress.check.enableOptimizations.description" ));
185
- map .put ("enablePreserveAllSemiColonsDesc" ,
186
- I18nUtils .get ("qe.tool.compress.check.enablePreserveAllSemiColons.description" ));
187
- map .put ("enableLinebreakposDesc" , I18nUtils .get ("qe.tool.compress.check.enableLinebreakpos.description" ));
188
- return FxTextInput .textArea (StrUtil .format (content , map ));
189
- }
190
-
191
186
/**
192
187
* 设置刷新串口信息按钮被点击时的事件处理器: 重新获取本机当前串口信息
193
188
*/
@@ -242,6 +237,12 @@ public ImageView getSampleImageIcon() {
242
237
// https://github.com/yiaoBang/SerialPortToolFX/blob/master/src/main/java/com/yiaoBang/serialPortToolFX/view/SerialPortView.java
243
238
244
239
public void initializeUI () {
240
+ //无限循环发送
241
+ circularSending .setCycleCount (Timeline .INDEFINITE );
242
+
243
+ // recvCount
244
+ // sendNumber.textProperty().bind(viewModel.getSEND_LONG_PROPERTY().asString());
245
+ // receiveNumber.textProperty().bind(viewModel.getRECEIVE_LONG_PROPERTY().asString());
245
246
246
247
// // 初始化常用波特率列表
247
248
// baudRateComboBox.getItems().addAll("9600", "4800", "2400", "1200");
@@ -308,6 +309,28 @@ public void initializeUI() {
308
309
}
309
310
serPortStopBit .setValue ("1" );
310
311
312
+ //流控
313
+ // String[] flowControl = new String[]{
314
+ // "100", "300", "600", "1200"
315
+ // };
316
+ // for (String s : speeds) {
317
+ // serPortSpeed.getItems().add(s);
318
+ // }
319
+ // serPortSpeed.setValue("9600");
320
+ //serFlowControl.getItems().addAll(SerialPort.FLOW_CONTROL_DISABLED);
321
+
322
+ //循环发送的等待时间(ms)
323
+ sendCycleRap .textProperty ().addListener ((o , oldValue , newValue ) -> {
324
+ try {
325
+ waitTime = Integer .parseInt (newValue );
326
+ if (waitTime < 1 ) {
327
+ waitTime = 1 ;
328
+ }
329
+ } catch (NumberFormatException e ) {
330
+ sendCycleRap .setText (oldValue );
331
+ }
332
+ });
333
+
311
334
serPortOpenBtn .setOnAction ((ActionEvent event ) -> {
312
335
SerialPort serialPort = serPort .getSelectionModel ().getSelectedItem ();
313
336
if (serialPort == null ) {
@@ -322,6 +345,8 @@ public void initializeUI() {
322
345
serPortDataBit .setDisable (false );
323
346
serPortStopBit .setDisable (false );
324
347
} else {
348
+ serialPortDataListener listener = new serialPortDataListener ();
349
+ serialPort .addDataListener (listener );
325
350
serialPort .openPort ();
326
351
//SerialPort.ONE_STOP_BIT
327
352
//SerialPort.NO_PARITY
@@ -333,7 +358,7 @@ public void initializeUI() {
333
358
serialPort .setFlowControl (SerialPort .FLOW_CONTROL_DISABLED );
334
359
serialPort .setComPortTimeouts (SerialPort .TIMEOUT_READ_BLOCKING | SerialPort .TIMEOUT_WRITE_BLOCKING ,
335
360
1000 , 1000 );
336
- //UsartRXEven();
361
+
337
362
serPortOpenBtn .setText ("关闭" );
338
363
serPort .setDisable (true );
339
364
serPortSpeed .setDisable (true );
@@ -342,48 +367,52 @@ public void initializeUI() {
342
367
serPortStopBit .setDisable (true );
343
368
}
344
369
});
345
- //
346
- // sendBtn.setOnAction(event -> {
347
- // if (null == serialPort || (!serialPort.isOpened())) {
348
- // // new AlertBox().display("错误", "请先打开串口");
349
- // return;
350
- // }
351
- // try {
352
- // if (sendHex.isSelected()) {
353
- // serialPort.writeBytes(hexStringToBytes(sendTextAear.getText()));
354
- // sendCount.setText(String.valueOf(
355
- // (Integer.parseInt(sendCount.getText()) + hexStringToBytes(sendTextAear.getText()).length)));
356
- // } else {
357
- // serialPort.writeBytes(sendTextAear.getText().getBytes());
358
- // sendCount.setText(String.valueOf(
359
- // (Integer.parseInt(sendCount.getText()) + sendTextAear.getText().getBytes().length)));
360
- // }
361
- //
362
- // } catch (Exception e) {
363
- // //new AlertBox().display("发送数据错误", e.getMessage());
364
- // }
365
- // });
366
- //
367
- // recvClear.setOnAction(event -> {
368
- // recvTextAear.setText("");
369
- // });
370
- // sendHex.setOnAction(event -> {
371
- // if (!sendHex.isSelected())
372
- // try {
373
- // sendTextAear.setText(new String(hexStringToBytes(sendTextAear.getText())));
374
- // } catch (Exception e) {
375
- // //new AlertBox().display("非法16进制字符", e.getMessage());
376
- // }
377
- // else
378
- // sendTextAear.setText(bytesToHexString(sendTextAear.getText().getBytes()));
379
- // });
380
- // sendClear.setOnAction(event -> {
381
- // sendTextAear.setText("");
382
- // });
383
- // CountReset.setOnAction(event -> {
384
- // sendCount.setText("0");
385
- // recvCount.setText("0");
386
- // });
370
+
371
+ sendBtn .setOnAction (event -> {
372
+ SerialPort serialPort = serPort .getSelectionModel ().getSelectedItem ();
373
+ if (null == serialPort || (!serialPort .isOpen ())) {
374
+ // new AlertBox().display("错误", "请先打开串口");
375
+ return ;
376
+ }
377
+ try {
378
+ if (sendHex .isSelected ()) {
379
+ byte [] bytes = hexStringToBytes (sendTextAear .getText ());
380
+ serialPort .writeBytes (bytes , bytes .length );
381
+ sendCount .setText (String .valueOf (
382
+ (Integer .parseInt (sendCount .getText ()) + hexStringToBytes (sendTextAear .getText ()).length )));
383
+ } else {
384
+ byte [] bytes = sendTextAear .getText ().getBytes ();
385
+ serialPort .writeBytes (bytes , bytes .length );
386
+ sendCount .setText (String .valueOf (
387
+ (Integer .parseInt (sendCount .getText ()) + sendTextAear .getText ().getBytes ().length )));
388
+ }
389
+
390
+ } catch (Exception e ) {
391
+ //new AlertBox().display("发送数据错误", e.getMessage());
392
+ }
393
+ });
394
+
395
+ recvClear .setOnAction (event -> {
396
+ recvTextAear .setText ("" );
397
+ });
398
+ sendHex .setOnAction (event -> {
399
+ if (!sendHex .isSelected ())
400
+ try {
401
+ sendTextAear .setText (new String (hexStringToBytes (sendTextAear .getText ())));
402
+ } catch (Exception e ) {
403
+ //new AlertBox().display("非法16进制字符", e.getMessage());
404
+ }
405
+ else {
406
+ sendTextAear .setText (bytesToHexString (sendTextAear .getText ().getBytes ()));
407
+ }
408
+ });
409
+ sendClear .setOnAction (event -> {
410
+ sendTextAear .setText ("" );
411
+ });
412
+ CountReset .setOnAction (event -> {
413
+ sendCount .setText ("0" );
414
+ recvCount .setText ("0" );
415
+ });
387
416
// sendCycle.setOnAction(event -> {
388
417
// if (null == serialPort || (!serialPort.isOpened())) {
389
418
// //new AlertBox().display("错误", "请先打开串口");
@@ -462,6 +491,17 @@ public void initializeUserDataBindings() {
462
491
// userData.put("txtCssLinebreakpos", txtCssLinebreakpos);
463
492
}
464
493
494
+ @ Override
495
+ public void dispose () {
496
+ SerialPort serialPort = serPort .getSelectionModel ().getSelectedItem ();
497
+ if (serialPort == null ) {
498
+ return ;
499
+ }
500
+ if (serialPort .isOpen ()) {
501
+ serialPort .closePort ();
502
+ }
503
+ }
504
+
465
505
/**
466
506
* 获得当前计算机所有的串口的名称列表
467
507
*
@@ -511,30 +551,6 @@ private SerialPort openPort(String portName, int baudRate) {
511
551
return serialPort ;
512
552
}
513
553
514
- /**
515
- * 关闭串口
516
- *
517
- * @param serialPort 待关闭的串口对象
518
- */
519
- private void closePort (SerialPort serialPort ) {
520
- if (serialPort != null && serialPort .isOpen ()) {
521
- serialPort .closePort ();
522
- }
523
- }
524
-
525
- /**
526
- * 往串口发送数据
527
- *
528
- * @param serialPort 串口对象
529
- * @param content 待发送数据
530
- */
531
- private void sendToPort (SerialPort serialPort , byte [] content ) {
532
- if (!serialPort .isOpen ()) {
533
- return ;
534
- }
535
- serialPort .writeBytes (content , content .length );
536
- }
537
-
538
554
/**
539
555
* 从串口读取数据
540
556
*
@@ -573,8 +589,9 @@ public int getListeningEvents() {
573
589
public void serialEvent (SerialPortEvent event ) {
574
590
byte [] newData = event .getReceivedData ();
575
591
System .out .println ("Received data of size: " + newData .length );
576
- for (int i = 0 ; i < newData .length ; ++i )
592
+ for (int i = 0 ; i < newData .length ; ++i ) {
577
593
System .out .print ((char ) newData [i ]);
594
+ }
578
595
System .out .println ("\n " );
579
596
}
580
597
}
0 commit comments