From 7857a444de69124e9f7fb45f98b0ae818b107f23 Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期一, 06 一月 2025 14:37:01 +0800
Subject: [PATCH] 国产UWB扫描器上位机V1.1 首次提交

---
 image/warn.png                                 |    0 
 src/ymodem/getFilesDataBytes.java              |  127 +
 .gitignore                                     |    2 
 src/Anchor/Anchor.java                         |   22 
 src/baowen/Dell_udpReceive.java                |  114 +
 src/tools/Judge/JugeNumber.java                |  136 +
 src/index/JPanelMoudle/versionUpgradeComp.java |  228 +++
 src/baowen/YuanshiByt.java                     |   73 
 src/tools/GetNowTime.java                      |   56 
 src/baowen/Dell_55AA03.java                    |   51 
 src/index/JPanelMoudle/readParamsComp.java     |  361 ++++
 src/index/JPanelMoudle/ComMoudleComp.java      |  216 ++
 src/tools/ShowMessage.java                     |   21 
 src/index/JPanelMoudle/showDataComp.java       |  158 ++
 src/baowen/Dell_55AA34.java                    |   60 
 src/ymodem/netWorkUpgradeThread.java           |  201 ++
 src/ymodem/YModemUpgradeThread.java            |  145 +
 image/scan.png                                 |    0 
 src/tools/Tools.java                           |  223 ++
 src/baowen/Dell_Baowen.java                    |   79 +
 src/tools/ChuanKou/Xmodem.java                 |  257 +++
 src/ymodem/CRC16.java                          |   76 +
 src/baowen/Dell_55AA40.java                    |   65 
 src/baowen/WriteReadAnchor.java                |  137 +
 src/tools/ChuanKou/SerialPortUtil.java         |  306 ++++
 src/tools/Judge/JugeIn.java                    |   24 
 src/tools/AutoCloseDialog.java                 |   63 
 src/tools/Jiaoyan.java                         |  109 +
 src/index/GCUWBreadIndex.java                  |  220 ++
 src/tools/ChuanKou/SerialPortManager.java      |   52 
 src/tools/CustomProgressBar.java               |   45 
 src/index/homeMain.java                        |   15 
 src/ymodem/ymodem.java                         |   10 
 lib/RXTXcomm.jar                               |    0 
 src/Anchor/anchor_Dell.java                    |   44 
 src/index/JPanelMoudle/anchorListComp.java     |  199 ++
 src/index/Timer100.java                        |   40 
 src/baowen/Dell_uanshi_byt.java                |  187 ++
 src/tools/ChuanKou/CRC16.java                  |   51 
 src/tools/ChuanKou/SerialPortParameter.java    |   98 +
 src/META-INF/MANIFEST.MF                       |    3 
 src/baowen/Baowen.java                         |   49 
 src/baowen/Dell_55AA39.java                    |  129 +
 43 files changed, 4,452 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
index f112f7f..d68b9cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@
 # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
 # should NOT be excluded as they contain compiler settings and other important
 # information for Eclipse / Flash Builder.
+/.idea
+/out
diff --git a/image/scan.png b/image/scan.png
new file mode 100644
index 0000000..4aecd7b
--- /dev/null
+++ b/image/scan.png
Binary files differ
diff --git a/image/warn.png b/image/warn.png
new file mode 100644
index 0000000..4eb83f9
--- /dev/null
+++ b/image/warn.png
Binary files differ
diff --git a/lib/RXTXcomm.jar b/lib/RXTXcomm.jar
new file mode 100644
index 0000000..e1e7503
--- /dev/null
+++ b/lib/RXTXcomm.jar
Binary files differ
diff --git a/src/Anchor/Anchor.java b/src/Anchor/Anchor.java
new file mode 100644
index 0000000..37b0651
--- /dev/null
+++ b/src/Anchor/Anchor.java
@@ -0,0 +1,22 @@
+package Anchor;
+
+public class Anchor {
+    String anchorId;//淇℃爣ID
+    String distance;//娴嬭窛璺濈
+
+    public String getAnchorId() {
+        return anchorId;
+    }
+
+    public String getDistance() {
+        return distance;
+    }
+
+    public void setAnchorId(String anchorId) {
+        this.anchorId = anchorId;
+    }
+
+    public void setDistance(String distance) {
+        this.distance = distance;
+    }
+}
diff --git a/src/Anchor/anchor_Dell.java b/src/Anchor/anchor_Dell.java
new file mode 100644
index 0000000..da1fc23
--- /dev/null
+++ b/src/Anchor/anchor_Dell.java
@@ -0,0 +1,44 @@
+package Anchor;
+
+import java.util.Vector;
+
+public class anchor_Dell {
+     static Vector<Anchor> anchors=new Vector<>();
+    static int id=1001;
+    static int dis=1001;
+
+     public anchor_Dell(){
+         for (int i = 0; i < 50; i++) {
+             id++;
+             dis++;
+             addAnchor(id+"",dis+"");
+         }
+     }
+
+
+     public static Anchor findAnchor(String anchorId){
+         for (Anchor anchor : anchors) {
+             String anchorId1 = anchor.getAnchorId();
+             if (anchorId1.equals(anchorId)){
+                 return anchor;
+             }
+         }
+         return null;
+     }
+
+     public static void addAnchor(String anchorId,String Distance){
+         Anchor anchor = findAnchor(anchorId);
+         if (anchor==null){
+             Anchor anchor1=new Anchor();
+             anchor1.setAnchorId(anchorId);
+             anchor1.setDistance(Distance);
+             anchors.add(anchor1);
+         }else {
+             anchor.setDistance(Distance);
+         }
+     }
+
+    public static Vector<Anchor> getAnchors() {
+        return anchors;
+    }
+}
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9902dd5
--- /dev/null
+++ b/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: index.homeMain
+
diff --git a/src/baowen/Baowen.java b/src/baowen/Baowen.java
new file mode 100644
index 0000000..f0405a8
--- /dev/null
+++ b/src/baowen/Baowen.java
@@ -0,0 +1,49 @@
+package baowen;
+
+public class Baowen {
+String hex;
+String ip;
+String addtime;
+int port;
+String dataFrom;//鏁版嵁鏉ユ簮    0:鍘熷鏁版嵁锛�1锛氭媶鍖呮暟鎹紝-1锛氭湭鐭�
+
+	public String getDataFrom() {
+		return dataFrom;
+	}
+
+	public void setDataFrom(String dataFrom) {
+		this.dataFrom = dataFrom;
+	}
+
+	public int getPort() {
+	return port;
+}
+public void setPort(int port) {
+	this.port = port;
+}
+int  timestamp;
+public String getHex() {
+	return hex;
+}
+public String getIp() {
+	return ip;
+}
+public String getAddtime() {
+	return addtime;
+}
+public int getTimestamp() {
+	return timestamp;
+}
+public void setHex(String hex) {
+	this.hex = hex;
+}
+public void setIp(String ip) {
+	this.ip = ip;
+}
+public void setAddtime(String addtime) {
+	this.addtime = addtime;
+}
+public void setTimestamp(int timestamp) {
+	this.timestamp = timestamp;
+}
+}
diff --git a/src/baowen/Dell_55AA03.java b/src/baowen/Dell_55AA03.java
new file mode 100644
index 0000000..abbaa24
--- /dev/null
+++ b/src/baowen/Dell_55AA03.java
@@ -0,0 +1,51 @@
+package baowen;
+
+
+import index.JPanelMoudle.versionUpgradeComp;
+
+import tools.Tools;
+
+
+
+public class Dell_55AA03 {
+    private static String[] hex = null;
+
+    public static void dell(String ip, String message, int port) {
+        String infom[] = message.split("55AA");
+        int size = infom.length;
+        for (int i = 0; i < size; i++) {
+            String mes = "55AA" + infom[i];
+            String[] hex = Tools.hex(message);
+            if (hex.length < 30) {
+                return;
+            }
+            String type = Tools.decodeHEX(hex[20] + hex[19]) + "";
+            if (type.equals("3")) {
+                dell05(ip, message, port);
+            }
+        }
+    }
+
+    public static void dell05(String ip, String message, int port) {
+        String[] infoArray = message.split("55AA");
+        int size = infoArray.length;
+
+        for (int i = 0; i < size; i++) {
+            String hexMessage = "55AA" + infoArray[i];
+            if (isValidMessage(hexMessage)) {
+                ok_55AA05(ip, hexMessage, port);
+            }
+        }
+    }
+
+    private static boolean isValidMessage(String hexMessage) {
+        return hexMessage.startsWith("55AA0355") && hexMessage.length() == 178;
+    }
+
+    public static void ok_55AA05(String ip, String hexMessage, int port) {
+        hexMessage = hexMessage.substring(14, hexMessage.length());
+        hex = Tools.hex(hexMessage);
+        String firmwareVersion = "V" + Integer.parseInt(hex[1], 16) + "." + Integer.parseInt(hex[0], 16);
+        versionUpgradeComp.getReadVersion_jf().setText(firmwareVersion);
+    }
+}
\ No newline at end of file
diff --git a/src/baowen/Dell_55AA34.java b/src/baowen/Dell_55AA34.java
new file mode 100644
index 0000000..ddf8206
--- /dev/null
+++ b/src/baowen/Dell_55AA34.java
@@ -0,0 +1,60 @@
+package baowen;
+
+
+import index.JPanelMoudle.readParamsComp;
+import index.JPanelMoudle.versionUpgradeComp;
+
+import tools.ShowMessage;
+import tools.Tools;
+
+import java.math.BigInteger;
+
+
+//鏍囩蹇冭烦鍖�
+public class Dell_55AA34 {
+    static String[] hex;//瀛楄妭鏁扮粍
+    static String ip;
+    static int port;
+
+//55AA3403240000
+    public static void dellrgs( String ip1,String infom, int port1) {
+        String jinDu="";//鍗囩骇杩涘害
+        ip = ip1;
+        port = port1;
+        hex = Tools.hex(infom);
+        if (hex.length>3) {
+            int datalenth1 = Tools.decodeHEX(hex[3]);//鏁版嵁闀垮害
+            datalenth1 = datalenth1 * 2 + 8;
+            int lenth = infom.length();
+            if (lenth == datalenth1) {
+                int i = decodeHEX(hex[4]);
+                String tagid="-----";
+                if (hex[3].equals("05")){
+                    tagid = hex[6] + hex[5];
+                }
+                String anchorID = readParamsComp.getAnchorId_jf().getText();
+                if (tagid.equals(anchorID)||tagid.equals("-----")){
+                    versionUpgradeComp.getUpdateAnchor_jf().setValue(i);
+                }
+                if (i==100||i==99){//璁惧鍗囩骇杩涘害杈惧埌100鎴栬��99鏃�
+                    ShowMessage.zidingyi("淇℃爣鍗囩骇瀹屾垚");
+                    versionUpgradeComp.exitUpgradeXinBiao();
+                }
+            }
+        }
+    }
+
+
+
+
+    /**16杩涘埗杞负10杩涘埗*/
+    public static int decodeHEX(String hexs){
+        BigInteger bigint=new BigInteger(hexs, 16);
+        int numb=bigint.intValue();
+        return numb;
+
+    }
+
+
+
+}
diff --git a/src/baowen/Dell_55AA39.java b/src/baowen/Dell_55AA39.java
new file mode 100644
index 0000000..159d685
--- /dev/null
+++ b/src/baowen/Dell_55AA39.java
@@ -0,0 +1,129 @@
+package baowen;
+
+
+import index.JPanelMoudle.readParamsComp;
+import tools.GetNowTime;
+import tools.ShowMessage;
+import tools.Tools;
+
+
+/**
+ * 鍩虹珯鐨勯厤缃俊鎭�
+ */
+public class Dell_55AA39 {
+    public static boolean readpeizhi_succ = false;
+    static String[] hex = null;
+    static String[] hex1 = null;
+
+
+    /**
+     * 55 AA 39 55 03 01 50 00 01 01 90 E8 03 0A 00 05 00 E1 FF 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 71 04 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 43 00 02 00 78 00 01 00 00 00 01 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 A9 FA
+     */
+    public static void dell(String ip, String message, int port) {
+        hex = Tools.hex(message);//鍘熷鏁版嵁
+        int length = message.length();
+        int size = Tools.decodeHEX(hex[3]);
+        int length2 = (size * 2) + 8;
+        if (length2 == length) {
+            ok_55AA39(ip, message, port, hex);
+        } else {
+            Dell_uanshi_byt.intsert(ip, message, GetNowTime.timestamp2(), GetNowTime.timestamp(), port);
+        }
+
+    }
+
+
+    @SuppressWarnings("unused")
+    public static void ok_55AA39(String ip, String message, int port, String[] hex) {
+        String hex1 = hex[8];
+        //璇诲啓鏍囩
+        if (hex1.equals("02")) {
+            rwTag(ip, message, port,hex);
+        } else if (hex1.equals("12") || hex1.equals("11")) {
+            rwAnc(ip, message, port, hex1);
+        }
+    }
+
+    //璇诲啓鍩虹珯閰嶇疆
+    private static void rwAnc(String ip, String message, int port, String hexr0w) {
+        String message1 = message.substring(22);
+        hex1 = Tools.hex(message1);//鍘熷鏁版嵁
+        String ancId = null;       //鍩虹珯ID
+        String version = null;     //鍩虹珯鐗堟湰
+        String cejuNum = null;     //娴嬭窛鍩虹珯鏁伴噺
+        String sendTime = null;    //uwb淇″彿鍙戦�佹椂闂�
+        String loraGongLv = null;  //lora鍙戝皠鍔熺巼
+        String uwbGongLv = null;   //uwb鍔熺巼
+        String gatewayId = null;   //uwb鍔熺巼
+        if (hexr0w.equals("11")){
+            System.out.println("淇敼鍩虹珯鎴愬姛");
+        }else {
+            try {
+                gatewayId = hex[7] + hex[6];//缃戝叧ID
+                version = "V" + Integer.parseInt(hex1[1], 16) + "." + Integer.parseInt(hex1[0], 16);//鐗堟湰鍙�
+                ancId = diZhi(2);//鍩虹珯ID
+                cejuNum = Tools.decodeHEX(diZhi(5)) + "";//缁処D
+                loraGongLv = getLoraGonglV(6);//lora鍔熺巼
+                sendTime = Tools.decodeHEX(diZhi(10)) + "";//鍙戦�佹椂闂�
+                uwbGongLv = Tools.decodeHEX(diZhi(27)) + "";//uwb鍔熺巼
+
+            } catch (NumberFormatException e) {
+                ShowMessage.zidingyi_24("淇℃爣杩斿洖鍙傛暟閿欒");
+                return;
+            }
+        }
+    }
+
+
+
+
+    //璇诲啓鏍囩鍥炲
+    private static void rwTag(String ip, String message, int port,String[] hex) {
+
+        String message1 = message.substring(22);
+        hex1 = Tools.hex(message1);//鍘熷鏁版嵁
+
+        String tagid = null;//妯″潡ID
+        String version = null;//鐗堟湰鍙�
+        String groupId = null;//灏忕粍ID
+        String distance = null;//lora鍔熺巼
+        String uwbGongLv = null;//uw鍔熺巼
+        try {
+            version = "V" + Integer.parseInt(hex1[1], 16) + "." + Integer.parseInt(hex1[0], 16);//鐗堟湰鍙�
+            tagid = diZhi(2);//鏍囩ID
+            groupId = Tools.decodeHEX(diZhi(5)) + "";//灏忕粍ID
+            distance = Tools.decodeHEX(diZhi(6))+"";//鏍″噯璺濈
+            uwbGongLv = Tools.decodeHEX(diZhi(27)) + "";//UWB鍔熺巼
+            readParamsComp.getAnchorId_jf().setText(tagid);
+            readParamsComp.getAnchorVersion_jf().setText(version);
+            readParamsComp.getGroupId_jf().setText(groupId);
+            readParamsComp.getAnchorPower_jf().setText(uwbGongLv);
+            readParamsComp.getJiaoZhunDis_jf().setText(distance);
+        } catch (NumberFormatException e) {
+            ShowMessage.zidingyi_24("淇℃爣鍙傛暟閿欒...");
+            return;
+        }
+
+
+
+    }
+
+
+
+
+    private static String getLoraGonglV(int addr) {
+        String loraGongl="-1";
+        int loraPower = Tools.decodeHEX(diZhi(addr));
+        byte loraPower1 = (byte) loraPower;
+        loraGongl = loraPower1 + "";
+        return loraGongl;
+    }
+
+
+    public static String diZhi(int addr) {
+        String s = hex1[(addr * 2) - 1] + hex1[(addr * 2) - 2];
+        return s;
+    }
+
+
+}
diff --git a/src/baowen/Dell_55AA40.java b/src/baowen/Dell_55AA40.java
new file mode 100644
index 0000000..02b0354
--- /dev/null
+++ b/src/baowen/Dell_55AA40.java
@@ -0,0 +1,65 @@
+package baowen;
+
+import Anchor.anchor_Dell;
+import tools.GetNowTime;
+import tools.Tools;
+
+public class Dell_55AA40 {
+
+    static String[] hex;//瀛楄妭鏁扮粍
+
+    static int[] distance;//鑾峰彇璺濈鐨勯泦鍚�
+    static String[] anchorid;//鑾峰彇鍩虹珯鐨勯泦鍚�
+
+    public static void dellrgs(String ip,String message,  int port) {
+        message = message.replaceAll("\r\n|\r|\n", "");//鍙栧嚭鎵�鏈夋彌琛屽拰鍥炶溅
+        int lenth = message.length();
+        hex = Tools.hex(message);//鍘熷鏁版嵁
+        //int datalenth1 = Tools.decodeHEX(hex[3]);//鏁版嵁闀垮害
+      /*  datalenth1 = datalenth1 * 2 + 8;
+        if (lenth == datalenth1) {*/
+            String baoTou = diZhi(2);//鍖呭ご
+            int anchorNum = Tools.decodeHEXToInt8(hex[3]);
+            get_anchorids(anchorNum);
+            get_distance_int(anchorNum);
+            addAnchor(anchorNum);
+      /*  }else {
+            Dell_uanshi_byt.intsert(ip, message, GetNowTime.timestamp2(), GetNowTime.timestamp(), port);
+        }*/
+    }
+
+
+    //娣诲姞鍩虹珯瀵硅薄
+    private static void addAnchor(int anchorNum) {
+        for (int i = 0; i < anchorNum; i++) {
+            String anchorID = anchorid[i];
+            int dis = distance[i];
+            anchor_Dell.addAnchor(anchorID,dis+"");
+        }
+    }
+
+
+    //鑾峰彇鍩虹珯鐨処D闆嗗悎
+    public static void get_anchorids(int anchornum) {
+        anchorid = new String[anchornum];
+        for (int i = 0; i < anchornum; i++) {
+            anchorid[i] = hex[5 + i * 2] + hex[4 + i * 2];
+        }
+    }
+
+
+    //鑾峰彇娴嬭窛璺濈
+    public static void get_distance_int(int anchornum) {
+        int dis1 = anchornum * 2 +4 ;
+        int dis2 = dis1 + 1;
+        distance = new int[anchornum];
+        for (int j = 0; j < anchornum; j++) {
+            distance[j] = Tools.decodeHEXToInt8( hex[dis2 + j * 2] + hex[dis1 + j * 2]);
+        }
+    }
+
+    public static String diZhi(int addr) {
+        String s = hex[(addr * 2) - 1] + hex[(addr * 2) - 2];
+        return s;
+    }
+}
diff --git a/src/baowen/Dell_Baowen.java b/src/baowen/Dell_Baowen.java
new file mode 100644
index 0000000..a8e2b8d
--- /dev/null
+++ b/src/baowen/Dell_Baowen.java
@@ -0,0 +1,79 @@
+package baowen;
+
+import tools.GetNowTime;
+
+import java.util.Vector;
+
+public class Dell_Baowen implements Runnable {
+
+    static Thread t;
+
+    static Vector<Baowen> baowenvec = new Vector<Baowen>();
+    static int sleeptime = 1;
+
+    public void startThread() {
+        t = new Thread(this);
+        t.start();
+    }
+
+    public static void intsert(String ip, String hex, String time, int port) {
+        Baowen baowen = new Baowen();
+        baowen.setHex(hex);
+        baowen.setIp(ip);
+        baowen.setAddtime(time);
+        baowen.setTimestamp(GetNowTime.timestamp());
+        baowen.setPort(port);
+        baowenvec.add(baowen);
+    }
+
+
+    public void run() {
+        while (true) {
+            try {
+                dellhex();
+                Thread.sleep(sleeptime);//浼戠湢鏃堕棿
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public void dellhex() {
+        int size = baowenvec.size();
+        if (size == 0) {
+            sleeptime = 10;
+            return;
+        }
+        if (size > 100000) {//濡傛灉鏁版嵁澶т簬10涓囨潯娌℃湁澶勭悊鍒欐竻绌�
+            baowenvec.removeAllElements();
+        } else {
+            sleeptime = 0;
+            Baowen baowen0 = baowenvec.get(0);
+            String ip = baowen0.getIp();
+            int port = baowen0.getPort();
+            String hex = baowen0.getHex();
+            String time = baowen0.getAddtime();
+            int timestamp = baowen0.getTimestamp();
+            int lenth = hex.length();
+            try {
+                dellhex2(ip, port, hex, time, timestamp, lenth);//澶勭悊鍘熷鏁版嵁
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            baowenvec.remove(baowen0);//鍒犻櫎澶勭悊杩囩殑鎶ユ枃
+        }
+    }
+    public static void dellhex2(String ip, int port, String hex, String time, int timestamp, int lenth) {
+        if (hex.startsWith("55AA39")) {
+            Dell_55AA39.dell(ip, hex,port);
+        }else if (hex.startsWith("55AA40")){
+            Dell_55AA40.dellrgs(ip, hex,port);
+        }else if (hex.startsWith("55AA03")){
+            Dell_55AA03.dell(ip, hex,port);
+        }else if (hex.startsWith("55AA34")){
+            Dell_55AA34.dellrgs(ip, hex,port);
+        }else {
+            Dell_uanshi_byt.intsert(ip, hex, time, timestamp, port);
+        }
+    }
+}
diff --git a/src/baowen/Dell_uanshi_byt.java b/src/baowen/Dell_uanshi_byt.java
new file mode 100644
index 0000000..a53eec5
--- /dev/null
+++ b/src/baowen/Dell_uanshi_byt.java
@@ -0,0 +1,187 @@
+package baowen;
+
+
+import tools.Jiaoyan;
+import tools.Judge.JugeNumber;
+import tools.ShowMessage;
+
+import java.math.BigInteger;
+import java.util.Vector;
+
+
+/**
+ * 澶勭悊鍘熷鏁版嵁
+ */
+public class Dell_uanshi_byt {
+
+    static Vector<YuanshiByt> yuanshivec = new Vector<>();
+
+
+    /**
+     * 鎻掑叆鍘熷娴嬭窛鏁版嵁锛屾瘡涓猧p涓�涓泦鍚堟瘡涓狪P涓婃潵鐨勬暟鎹鍏ュ悇鑷狪P涔嬩腑
+     */
+    public static void intsert(String ip, String hex, String time, int timestamp, int port) {
+        if (get_ys(ip) != null) {
+            int lenth = hex.length() / 2;
+            for (int i = 0; i < lenth; i++) {
+                String hex1 = hex.substring(2 * i, (i + 1) * 2);
+                get_ys(ip).getData().add(hex1);
+                hex1 = null;
+            }
+            get_ys(ip).setTime(time);
+            get_ys(ip).setTimestamp(timestamp);
+            dell_ysbyt(get_ys(ip), ip, port);
+        } else {
+            YuanshiByt ysbyt = new YuanshiByt();
+            Vector<String> data1 = new Vector<>();
+            StringBuffer okhex = new StringBuffer();
+            ysbyt.setIp(ip);
+            ysbyt.setPort(port);
+            ysbyt.setData(data1);
+            ysbyt.setTimestamp(timestamp);
+            ysbyt.setTime(time);
+            ysbyt.setUsart_state(0);
+            ysbyt.setPack(okhex);
+            ysbyt.setDatalen(0);
+            ysbyt.setType("");
+            int lenth = hex.length() / 2;
+            for (int i = 0; i < lenth; i++) {
+                String hex1 = hex.substring(2 * i, (i + 1) * 2);
+                data1.add(hex1);
+                hex1 = null;
+            }
+            yuanshivec.add(ysbyt);
+            dell_ysbyt(ysbyt, ip, port);
+        }
+
+    }
+
+    /**
+     * 閫氳繃IP鎵惧埌璇P鐨勬暟鎹泦鍚�
+     */
+    public static YuanshiByt get_ys(String ip) {
+        YuanshiByt ysbyt = null;
+        int size = yuanshivec.size();
+        for (int i = 0; i < size; i++) {
+            YuanshiByt ysbyt1 = yuanshivec.get(i);
+            String ip1 = ysbyt1.getIp();
+            if (ip1.equals(ip)) {
+                ysbyt = ysbyt1;
+                break;
+            }
+        }
+        return ysbyt;
+    }
+
+
+    /**
+     * 澶勭悊鍘熷闆嗗悎涓殑鏁版嵁
+     */
+    public static void dell_ysbyt(YuanshiByt ysbyt, String ip, int port) {
+        String time = ysbyt.getTime();
+        int timestamp = ysbyt.getTimestamp();
+        while (ysbyt.getData().size() > 0) {
+            String hex = null;
+            try {
+                hex = ysbyt.getData().get(0);
+            } catch (ArrayIndexOutOfBoundsException e) {
+                return;
+            }
+            int usart_state = ysbyt.getUsart_state();
+            //灏嗗師濮嬫暟鎹泦鍚堜腑鐨勭涓�鏉℃暟鎹彇鍑烘斁鍏wich寰幆
+            switch (usart_state) {
+
+                case 0:
+                    //濡傛灉鏁版嵁鏄�55鍒欐墽琛�
+                    if (hex.equals("55")) {
+                        //灏嗘暟鎹鐞嗙殑鐘舵�佷慨鏀逛负1
+                        ysbyt.setUsart_state(1);
+                        //鍚屾椂鎻掑叆鏁版嵁鍦ㄥ瓧绗︿覆涓�
+                        ysbyt.getPack().append(hex);
+                    }
+                    break;
+
+                case 1:
+                    //濡傛灉鏁版嵁鏄疉A鍒欐墽琛�
+                    if (hex.equals("AA")) {//鐘舵��1鎯呭喌涓嬶紝绛夊緟鎺ユ敹鍒癆A鍖呭ご2锛岀劧鍚庡彉鎴愮姸鎬�2
+                        ysbyt.setUsart_state(2);
+                        ysbyt.getPack().append(hex);
+                    }
+                    break;
+
+                case 2:
+                    //鏁版嵁绫诲瀷缁橳YPE
+                    ysbyt.setType(hex);
+                    ysbyt.setUsart_state(3);
+                    ysbyt.getPack().append(hex);
+                    break;
+
+                case 3:
+                    //鎶ユ枃鏁版嵁娈垫暟鎹暱搴�
+                    boolean a1 = JugeNumber.isLetterDigit(hex);
+                    int d = 0;
+                    if (a1) {
+                        BigInteger bigint = new BigInteger(hex, 16);
+                        d = bigint.intValue();
+                    } else {
+                        ShowMessage.zidingyi("HEX to DEC error锛�" + hex);
+                        ysbyt.getPack().setLength(0);
+                        ysbyt.setType("");
+                        ysbyt.setUsart_state(0);
+                        break;
+                    }
+                    ysbyt.getPack().append(hex);
+                    ysbyt.setUsart_state(4);
+                    ysbyt.setDatalen(d);
+                    break;
+
+                case 4:
+                    ysbyt.getPack().append(hex);
+                    int lenth = ysbyt.getPack().toString().length();
+                    int a = ysbyt.getDatalen() * 2 + 8;
+                    if (lenth == a) {
+                        //鏁版嵁澶勭悊鐨勭姸鎬�
+                        ysbyt.setUsart_state(0);
+                        //鏍¢獙
+                        String check = Jiaoyan.check2(ysbyt.getPack().toString());
+                        String panck_cmd = null;
+                        try {
+                            panck_cmd = ysbyt.getPack().toString().substring(lenth - 2, lenth) + ysbyt.getPack().substring(lenth - 4, lenth - 2);
+                        } catch (Exception e) {
+                            return;
+                        }
+
+
+                        //濡傛灉鏍¢獙鎴愬姛
+                        if (check.equals(panck_cmd)) {
+                            //濡傛灉鏄祴璺濇暟鎹�
+                            String type = ysbyt.getType();
+                            switch (type) {
+                                case "39":
+                                    Dell_55AA39.dell(ip, ysbyt.getPack().toString(), port);
+                                    break;
+                                case "40":
+                                    Dell_55AA40.dellrgs(ip, ysbyt.getPack().toString(), port);
+                                    break;
+                            }
+                        }
+
+                        ysbyt.getPack().setLength(0);
+                        ysbyt.setDatalen(0);
+                        ysbyt.setType("");
+                    } else if (lenth > a) {
+                        ysbyt.getPack().setLength(0);
+                        ysbyt.setDatalen(0);
+                        ysbyt.setType("");
+                    }
+
+                    break;
+
+            }
+            //鍒犻櫎澶勭悊杩囩殑鏁版嵁
+            ysbyt.getData().removeElement(hex);
+        }
+
+    }
+
+}
diff --git a/src/baowen/Dell_udpReceive.java b/src/baowen/Dell_udpReceive.java
new file mode 100644
index 0000000..9f71ed0
--- /dev/null
+++ b/src/baowen/Dell_udpReceive.java
@@ -0,0 +1,114 @@
+package baowen;
+
+import tools.GetNowTime;
+import tools.Tools;
+
+import java.io.IOException;
+import java.net.*;
+
+public class Dell_udpReceive implements Runnable{
+
+    int port=7000;
+    static DatagramSocket socket;
+    static int bytlenth=1024;
+    static DatagramPacket packet;
+    static boolean startFlag=false;
+    private static Thread receiveThread;
+
+    public Dell_udpReceive(int port1){
+        try {
+            startFlag=true;
+            port=port1;
+            socket = new DatagramSocket(port);
+            byte[] data = new byte[bytlenth]; // 鍒涘缓byte鏁扮粍
+            packet= new DatagramPacket(data,bytlenth);
+        } catch (SocketException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**鍚姩绾跨▼鐨勬柟娉�*/
+    public void startThread() {
+        receiveThread = new Thread(this);
+        receiveThread.start();
+    }
+
+    @Override
+    public void run() {
+        while(startFlag) {
+            getdata();
+        }
+    }
+
+    public  void getdata() {
+        if (socket != null) {
+            try {
+                socket.receive(packet); // 鎺ユ敹鏁版嵁鍖�
+                delludp_receive(packet);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public static void delludp_receive(DatagramPacket packet) {
+        int lenth=packet.getLength();
+        byte[] byt=subBytes(packet.getData(),0, lenth);
+        String ip=packet.getAddress().getHostAddress();//鑾峰彇鍙戦�佺鐨処P鍦板潃瀵硅薄
+        int port=packet.getPort();
+        String datas = Tools.Bytes2HexString(byt);//涓插彛鏉ョ殑鏁版嵁
+        Dell_Baowen.intsert(ip, datas, GetNowTime.timestamp2(), port);
+    }
+
+    public static byte[] subBytes(byte[] src, int begin, int count) {
+        byte[] bs = new byte[count];
+        System.arraycopy(src, begin, bs, 0, count);
+        return bs;
+    }
+
+
+    /**灏嗘暟鎹彂缁欏熀绔�*/
+    public static void sendData(byte[] data,String ip2,int port2) {
+        if(socket==null) {
+            return;
+        }
+        String datas1=Tools.Bytes2HexString(data);
+        DatagramPacket packet=null;
+        InetAddress address=null;
+        //濡傛灉鏁版嵁绫诲瀷鐩稿悓
+        try {
+            address=InetAddress.getByName(ip2);
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        packet=new DatagramPacket(data, data.length, address, port2);
+        try {
+            socket.send(packet);
+            String datas=Tools.Bytes2HexString(data).substring(0, packet.getLength()*2);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+    /** 鍋滄绾跨▼骞堕噴鏀捐祫婧� */
+    public static void stop() {
+
+        if (receiveThread != null && receiveThread.isAlive()) {
+            try {
+                receiveThread.join();  // 绛夊緟绾跨▼缁撴潫
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    public static void stopThread() {
+        startFlag = false;//鍋滄鏁版嵁鎺ユ敹
+        if (socket != null && !socket.isClosed()) {
+            socket.close();//鍏抽棴socket瀵硅薄
+        }
+        stop();
+    }
+}
diff --git a/src/baowen/WriteReadAnchor.java b/src/baowen/WriteReadAnchor.java
new file mode 100644
index 0000000..be78db8
--- /dev/null
+++ b/src/baowen/WriteReadAnchor.java
@@ -0,0 +1,137 @@
+package baowen;
+
+import gnu.io.SerialPort;
+import index.JPanelMoudle.showDataComp;
+import tools.ChuanKou.SerialPortUtil;
+import tools.Jiaoyan;
+import tools.Tools;
+
+public class WriteReadAnchor {
+
+    //缁欐壂鎻忓櫒鍙戦�佹寚浠�
+    public static void updateLora(String zhi,
+                                  byte diZhi,
+                                  byte duxie,
+                                  String anchorID,
+                                  SerialPort serialPort,
+                                  byte lenth) {
+        byte[] write = write_loraAnc(diZhi,lenth ,duxie, Integer.parseInt(zhi),anchorID);
+        if (write == null) {
+            return;
+        }
+        sendData(serialPort, write);
+    }
+
+    public static void sendData(SerialPort serialPort, byte[] write) {
+        SerialPortUtil.sendData(serialPort,write);
+        showDataComp.addSendAreaTextMes(write);
+    }
+
+
+    /**@param start 璧峰鍦板潃
+	 * @param lenth鏁版嵁闀垮害
+	 * @param value[]鍏蜂綋鐨勫��*/
+    private static byte[] write_loraAnc(byte start ,byte lenth,byte duXie,int value,String id) {
+        byte[] buf =new byte[12+lenth];
+        byte[] buf1 =new byte[8+lenth];
+        //鍖呭ご
+        buf[0]=(byte) 0x55;
+        //鍖呭ご
+        buf[1]=(byte) 0xAA;
+        //鎸囦护绫诲瀷
+        buf1[0]=(byte) 0x30;
+        //鏁版嵁闀垮害
+        buf1[1]=(byte) ((byte) 8+lenth);
+        //璇绘ā寮�
+        buf1[2]=(byte) duXie;
+        //璧峰鍦板潃
+        buf1[3]=(byte) start;
+
+
+        buf1[4]= Tools.toByteArray(id)[1];
+        buf1[5]=Tools.toByteArray(id)[0];
+        buf1[6]=Tools.toByteArray(id)[1];
+        buf1[7]=Tools.toByteArray(id)[0];
+
+        buf1[8]=Tools.intToRegisters(value)[3];
+        buf1[9]=Tools.intToRegisters(value)[2];
+        for(int i=0;i<buf1.length;i++) {
+            buf[i+2]=buf1[i];
+        }
+        //鏍¢獙鐮�
+        buf[buf.length-2]= Jiaoyan.check(buf1)[1];
+        buf[buf.length-1]=Jiaoyan.check(buf1)[0];
+        return buf;
+    }
+
+
+
+    //璇诲彇鎵弿鍣ㄧ増鏈�
+    public static byte[] ReadData(byte ref, byte lenth) {
+        byte[] buf = new byte[10];
+        byte[] buf1 = new byte[6];
+        //鍖呭ご
+        buf[0] = (byte) 0x55;
+        //鍖呭ご
+        buf[1] = (byte) 0xAA;
+
+        //鎸囦护绫诲瀷(鍙傛暟璇诲啓妯″紡)
+        buf1[0] = (byte) 0x03;
+        //鏁版嵁闀垮害
+        buf1[1] = (byte) 0x06;
+
+        //璇绘ā寮�(璇绘ā寮�)
+        buf1[2] = (byte) 0x01;
+        //璧峰鍦板潃
+        buf1[3] = ref;
+        //鏁版嵁闀垮害
+        buf1[4] = lenth;
+
+        //鍥哄畾鍊�(璇绘ā寮忎笅涓�0x00)
+        buf1[5] = (byte) 0x00;
+        for (int i = 0; i < buf1.length; i++) {
+            buf[i + 2] = buf1[i];
+        }
+
+        //鏍¢獙鐮�
+        buf[8] = Jiaoyan.check(buf1)[1];
+        buf[9] = Jiaoyan.check(buf1)[0];
+        ;
+        return buf;
+    }
+
+
+    /**@param start 璧峰鍦板潃
+     * @param lenth鏁版嵁闀垮害
+     * @param value[]鍏蜂綋鐨勫��*/
+    public static byte[] write_lora(byte start ,byte lenth,int value) {
+        byte[] buf =new byte[9+lenth];
+        byte[] buf1 =new byte[5+lenth];
+        //鍖呭ご
+        buf[0]=(byte) 0x55;
+        //鍖呭ご
+        buf[1]=(byte) 0xAA;
+        //鎸囦护绫诲瀷
+        buf1[0]=(byte) 0x03;
+        //鏁版嵁闀垮害
+        buf1[1]=(byte) ((byte) 5+lenth);
+        //璇绘ā寮�
+        buf1[2]=(byte) 0x02;
+        //璧峰鍦板潃
+        buf1[3]=(byte) start;
+
+        //璇诲啓闀垮害
+        buf1[4]=(byte) lenth;
+
+        buf1[5]=Tools.intToRegisters(value)[3];
+        buf1[6]=Tools.intToRegisters(value)[2];
+        for(int i=0;i<buf1.length;i++) {
+            buf[i+2]=buf1[i];
+        }
+        //鏍¢獙鐮�
+        buf[buf.length-2]=Jiaoyan.check(buf1)[1];
+        buf[buf.length-1]=Jiaoyan.check(buf1)[0];
+        return buf;
+
+    }
+}
diff --git a/src/baowen/YuanshiByt.java b/src/baowen/YuanshiByt.java
new file mode 100644
index 0000000..478da1b
--- /dev/null
+++ b/src/baowen/YuanshiByt.java
@@ -0,0 +1,73 @@
+package baowen;
+import java.util.Vector;
+
+/**鍘熷鏁版嵁*/
+public class YuanshiByt {
+	String time;
+	int timestamp;
+	int port;
+	String ip;
+	Vector<String> data;
+	StringBuffer pack;
+	int datalen;//鏁版嵁鐨勯暱搴�
+	String type;//鏁版嵁绫诲瀷
+	//澶勭悊鏁版嵁鍒颁粈涔堢姸鎬佷簡
+	int usart_state;
+	
+	public String getIp() {
+		return ip;
+	}
+	public Vector<String> getData() {
+		return data;
+	}
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+	public void setData(Vector<String> data) {
+		this.data = data;
+	}
+	public StringBuffer getPack() {
+		return pack;
+	}
+	public void setPack(StringBuffer pack) {
+		this.pack = pack;
+	}
+	public String getTime() {
+		return time;
+	}
+	public int getTimestamp() {
+		return timestamp;
+	}
+	public void setTime(String time) {
+		this.time = time;
+	}
+	public void setTimestamp(int timestamp) {
+		this.timestamp = timestamp;
+	}
+	public int getUsart_state() {
+		return usart_state;
+	}
+	public void setUsart_state(int usart_state) {
+		this.usart_state = usart_state;
+	}
+	public int getPort() {
+		return port;
+	}
+	public void setPort(int port) {
+		this.port = port;
+	}
+	public int getDatalen() {
+		return datalen;
+	}
+	public void setDatalen(int datalen) {
+		this.datalen = datalen;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+
+}
diff --git a/src/index/GCUWBreadIndex.java b/src/index/GCUWBreadIndex.java
new file mode 100644
index 0000000..f27f130
--- /dev/null
+++ b/src/index/GCUWBreadIndex.java
@@ -0,0 +1,220 @@
+package index;
+
+import index.JPanelMoudle.*;
+
+import java.awt.*;
+import javax.swing.*;
+
+
+/**
+ * @author zsh
+ */
+public class GCUWBreadIndex extends JFrame {
+    static ImageIcon icon = new ImageIcon("image/scan.png"); // 璇锋浛鎹负浣犲浘鏍囩殑璺緞
+    public GCUWBreadIndex() {
+        // 鑾峰彇灞忓箷鐨勫垎杈ㄧ巼
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice gd = ge.getDefaultScreenDevice();
+        Rectangle screenBounds = gd.getDefaultConfiguration().getBounds();
+        int screenWidth = screenBounds.width;
+        int screenHeight = screenBounds.height;
+
+        // 鏍规嵁灞忓箷灏哄璋冩暣绐楀彛澶у皬
+        setSize(screenWidth / 2, screenHeight / 2);  // 璁剧疆绐楀彛涓哄睆骞曞昂瀵哥殑涓�鍗�
+        setLocationRelativeTo(null);  // 灞呬腑鏄剧ず绐楀彛
+
+        // 绐楀彛灞炴��
+        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        setTitle("GC UWB淇℃爣鎵弿杞欢V1.2");
+        setIconImage(icon.getImage());
+        initComponents();
+    }
+
+    private void initComponents() {
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Container contentPane = getPane();
+        anchor_TableList(contentPane);
+        readComList(contentPane);
+        readWriteAnchorParams(contentPane);
+        DataShow(contentPane);
+        versionUpgrade(contentPane);
+        pack();
+        setLocationRelativeTo(getOwner());
+    }
+
+
+    //閫夋嫨涓插彛鐣岄潰
+    private void readComList(Container contentPane) {
+        ComMoudleComp.getCom_jp().setLayout(new GridBagLayout());
+        int[] columnWidths = {110, 110, 220};
+        int[] rowHeights = {46, 46, 0, 46};
+        double[] columnWeights = {1.0, 1.0, 1.0};
+        double[] rowWeights = {1.0, 1.0, 1.0, 1.0};
+        //璁剧疆甯冨眬鍣ㄧ殑鍙傛暟
+        setGridBagLayoutParams(ComMoudleComp.getCom_jp(), columnWidths, rowHeights, columnWeights, rowWeights);
+        // 娣诲姞缁勪欢
+        addLabelAndField(ComMoudleComp.getCom_jp(), ComMoudleComp.getChuanKou_jl(), ComMoudleComp.getChuanKou_jcom(), 0, 0,2);
+        addLabelAndField(ComMoudleComp.getCom_jp(), ComMoudleComp.getBotelv_jl(), ComMoudleComp.getBoteLV_jcm(), 0, 1,2);
+        // 娣诲姞鎸夐挳
+        addButton(ComMoudleComp.getCom_jp(), ComMoudleComp.getOpen(), 0, 3, 2, 1);
+        addButton(ComMoudleComp.getCom_jp(), ComMoudleComp.getClose(), 2, 3, 1, 1);
+        // 鏈�鍚庡皢瀹瑰櫒娣诲姞鍒� contentPane
+        contentPane.add(ComMoudleComp.getCom_jp(),
+                new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 5), 0, 0));
+    }
+
+    //淇℃爣鍒楄〃妯″潡
+    private void anchor_TableList(Container contentPane) {
+        anchorListComp.getAncList_jp().setLayout(new GridBagLayout());
+        int[] columnWidths = {449, 0};
+        int[] rowHeights = {480, 50, 0};
+        double[] columnWeights = {1.0, 1.0E-4};
+        double[] rowWeights = {1.0, 0.0, 1.0E-4};
+        // 璁剧疆 GridBagLayout 閰嶇疆
+        setGridBagLayoutParams(anchorListComp.getAncList_jp(), columnWidths, rowHeights, columnWeights, rowWeights);
+        // 娣诲姞缁勪欢
+        addScrollPane(anchorListComp.getAncList_jp(), anchorListComp.getScrollPane1(), anchorListComp.getAncTable(), 0, 0, 1, 1);
+        addButton(anchorListComp.getAncList_jp(), anchorListComp.getSelect_anc(), 0, 1, 1, 1);
+
+        // 鏈�鍚庡皢瀹瑰櫒娣诲姞鍒� contentPane
+        contentPane.add(anchorListComp.getAncList_jp(),
+                new GridBagConstraints(0, 1, 1, 2, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 0, 5), 0, 0));
+    }
+
+    //鍥轰欢鍗囩骇鐣岄潰
+    private void versionUpgrade(Container contentPane) {
+        versionUpgradeComp.getVersionUpdate().setLayout(new GridBagLayout());
+        int[] columnWidths = {143, 350, 0};
+        int[] rowHeights = {38, 54, 50, 58, 54, 0};
+        double[] columnWeights = {1.0, 1.0, 1.0};
+        double[] rowWeights = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
+        // 璁剧疆 GridBagLayout 閰嶇疆
+        setGridBagLayoutParams(versionUpgradeComp.getVersionUpdate(), columnWidths, rowHeights, columnWeights, rowWeights);
+        addLabelAndField(versionUpgradeComp.getVersionUpdate(), versionUpgradeComp.getLabel9(), versionUpgradeComp.getLabel9(), 0, 0,2);
+        addLabelAndField(versionUpgradeComp.getVersionUpdate(), versionUpgradeComp.getReadVersion_jb(), versionUpgradeComp.getReadVersion_jf(), 0, 1,2);
+        addLabelAndField(versionUpgradeComp.getVersionUpdate(), versionUpgradeComp.getChooseVersion(), versionUpgradeComp.getChooseVersion_jf(), 0, 2,2);
+        addLabelAndField(versionUpgradeComp.getVersionUpdate(), versionUpgradeComp.getWrite_saoMiao(), versionUpgradeComp.getJindu_SaoMiaoQi(), 0, 3,2);
+        addLabelAndField(versionUpgradeComp.getVersionUpdate(), versionUpgradeComp.getUpdateAnchor_jb(), versionUpgradeComp.getUpdateAnchor_jf(), 0, 4,2);
+        // 娣诲姞鍒� contentPane
+        contentPane.add(versionUpgradeComp.getVersionUpdate(), new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 0, 5), 0, 0));
+    }
+
+
+    //璇诲啓鍙傛暟妯″潡
+    private void readWriteAnchorParams(Container contentPane) {
+        readParamsComp.getReadAncParam_jp().setLayout(new GridBagLayout());
+        int[] columnWidths = {139, 124*2,30, 160, 0};//姣忓垪鐨勫搴�
+        int[] rowHeights = {50, 50, 50, 50, 50, 50, 50, 50, 50, 0};//姣忚鐨勯珮搴�
+        double[] columnWeights = {1.0, 1.0, 1.0,1.0, 0};
+        double[] rowWeights = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0};
+        // 璁剧疆 GridBagLayout 閰嶇疆
+        setGridBagLayoutParams(readParamsComp.getReadAncParam_jp(), columnWidths, rowHeights, columnWeights, rowWeights);
+        // 娣诲姞缁勪欢
+        addLabelAndField(readParamsComp.getReadAncParam_jp(), readParamsComp.getAnchorId(), readParamsComp.getAnchorId_jf(), 0, 1,3);
+        addLabelAndField(readParamsComp.getReadAncParam_jp(), readParamsComp.getAnchorVersion(), readParamsComp.getAnchorVersion_jf(), 0, 2,3);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getGroupId(), readParamsComp.getGroupId_jf(),  readParamsComp.getSaveParam_GroupID(),0, 3);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getAnchorPower(), readParamsComp.getAnchorPower_jf(), readParamsComp.getSaveParam_anchorPower(),0, 4);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getJiaoZhunDis(), readParamsComp.getJiaoZhunDis_jf(), readParamsComp.getSaveParam_jiaoZhunDis(),0, 5);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getLabel6(), readParamsComp.getTextField6(), readParamsComp.getSaveParam_label6(),0, 6);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getLabel7(), readParamsComp.getTextField7(),readParamsComp.getSaveParam_label7(), 0, 7);
+        addLabelAndFieldAndButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getLabel8(), readParamsComp.getTextField8(), readParamsComp.getSaveParam_label8(),0, 8);
+        // 娣诲姞鎸夐挳
+        addButton(readParamsComp.getReadAncParam_jp(), readParamsComp.getReadParam(), 0, 0, 4, 1);
+
+        // 鏈�鍚庡皢瀹瑰櫒娣诲姞鍒� contentPane
+        contentPane.add(readParamsComp.getReadAncParam_jp(),
+                new GridBagConstraints(1, 0, 1, 2, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 5), 0, 0));
+    }
+
+
+    //鏁版嵁鎺ユ敹瑙f瀽妯″潡
+    private void DataShow(Container contentPane) {
+        showDataComp.getDataShow().setViewportView(showDataComp.getTextArea1());
+        contentPane.add(showDataComp.getDataShow(),
+                new GridBagConstraints(2, 0, 1, 3, 0.0, 0.0,
+                        GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                        new Insets(0, 0, 0, 0), 0, 0));
+    }
+
+    // 绠�鍖栫殑鏍囩鍜岃緭鍏ユ娣诲姞鏂规硶
+    private void addLabelAndField(Container panel, JComponent label, JComponent textField, int gridx, int gridy,int width) {
+        panel.add(label, new GridBagConstraints(gridx, gridy, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 5), 0, 0));
+        panel.add(textField, new GridBagConstraints(gridx + 1, gridy,  width,1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 0), 0, 0));
+    }
+
+    // 绠�鍖栫殑鏍囩鍜岃緭鍏� 鎸夐挳娣诲姞鏂规硶
+    private void addLabelAndFieldAndButton(Container panel, JComponent label, JComponent textField, JComponent button,int gridx, int gridy) {
+        panel.add(label, new GridBagConstraints(gridx, gridy, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 5), 0, 0));
+
+        panel.add(textField, new GridBagConstraints(gridx + 1, gridy, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 0), 0, 0));
+
+        panel.add(button, new GridBagConstraints(gridx + 3, gridy, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 0), 0, 0));
+    }
+
+    // 绠�鍖栫殑鎸夐挳娣诲姞鏂规硶
+    private void addButton(Container panel, JButton button, int gridx, int gridy, int gridwidth, int gridheight) {
+        panel.add(button, new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 0), 0, 0));
+    }
+
+    // 娣诲姞 JScrollPane 鐨勬柟娉�
+    private void addScrollPane(Container panel, JScrollPane scrollPane, JTable table, int gridx, int gridy, int gridwidth, int gridheight) {
+        scrollPane.setViewportView(table);
+        panel.add(scrollPane, new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+                new Insets(0, 0, 5, 0), 0, 0));
+    }
+
+    //鍏ㄥ眬椤甸潰
+    private Container getPane() {
+        Container contentPane = getContentPane();
+        contentPane.setLayout(new GridBagLayout());
+        // 璁剧疆閫傚簲绐楀彛澶у皬鐨勫竷灞�
+        ((GridBagLayout) contentPane.getLayout()).columnWidths = new int[]{0, 504, 374, 0}; // 鍙互璋冩暣瀹藉害
+        ((GridBagLayout) contentPane.getLayout()).rowHeights = new int[]{170, 268, 315, 0}; // 鍙互璋冩暣楂樺害
+        // 璁剧疆浼哥缉鏉冮噸锛岀‘淇濆唴瀹瑰湪绐楀彛鏀惧ぇ鏃惰嚜閫傚簲
+        ((GridBagLayout) contentPane.getLayout()).columnWeights = new double[]{1.0, 1.0, 1.0, 1.0E-4};
+        ((GridBagLayout) contentPane.getLayout()).rowWeights = new double[]{1.0, 1.0, 1.0, 1.0E-4};
+        return contentPane;
+    }
+
+    private void setGridBagLayoutParams(JPanel jPanel, int[] columnWidths, int[] rowHeights, double[] columnWeights, double[] rowWeights) {
+        GridBagLayout layout = (GridBagLayout) jPanel.getLayout();
+        layout.columnWidths = columnWidths;
+        layout.rowHeights = rowHeights;
+        layout.columnWeights = columnWeights;
+        layout.rowWeights = rowWeights;
+    }
+
+    public static void startFrame(){
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                new GCUWBreadIndex().setVisible(true);
+            }
+        });
+    }
+}
diff --git a/src/index/JPanelMoudle/ComMoudleComp.java b/src/index/JPanelMoudle/ComMoudleComp.java
new file mode 100644
index 0000000..9e5db27
--- /dev/null
+++ b/src/index/JPanelMoudle/ComMoudleComp.java
@@ -0,0 +1,216 @@
+package index.JPanelMoudle;
+
+import Anchor.anchor_Dell;
+import baowen.Dell_Baowen;
+import gnu.io.SerialPort;
+import gnu.io.SerialPortEvent;
+import tools.ChuanKou.SerialPortManager;
+import tools.ChuanKou.SerialPortUtil;
+import tools.GetNowTime;
+import tools.ShowMessage;
+import tools.Tools;
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.util.TooManyListenersException;
+
+public class ComMoudleComp {
+
+
+    private static JPanel com_jp;//閫夋嫨涓插彛妯℃澘
+
+    private static JLabel chuanKou_jl;//涓插彛鍙锋爣绛�
+    private static JLabel botelv_jl;//娉㈢壒鐜囨爣绛�
+    private static JComboBox chuanKou_jcom;//涓插彛鍙蜂笅鎷夋
+    private static JComboBox boteLV_jcm;//娉㈢壒鐜囦笅鎷夋
+    private static JButton open;//鎵撳紑涓插彛鎸夐挳
+    private static JButton close;//鍏抽棴涓插彛鎸夐挳
+    static String[] coms = null;
+    static String com = null;//閫変腑鐨勪覆鍙�
+    static boolean chuankou = false;//涓插彛鏄惁琚墦寮�
+    static SerialPort serialPort = null;//涓插彛瀵硅薄
+
+    // 鑾峰彇閫夋嫨涓插彛闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JPanel getCom_jp() {
+        if (com_jp == null) {
+            com_jp = new JPanel();  // 鍒濆鍖栬闈㈡澘
+            com_jp.setBorder(new TitledBorder("閫夋嫨涓插彛"));
+        }
+        return com_jp;
+    }
+
+    // 鑾峰彇 涓插彛鍙锋爣绛撅紝鑻ヤ负绌哄垯鍒涘缓
+    public static JLabel getChuanKou_jl() {
+        if (chuanKou_jl == null) {
+            chuanKou_jl = new JLabel(" 涓插彛鍙凤細");  // 鍒濆鍖栬鏍囩
+        }
+        return chuanKou_jl;
+    }
+
+    // 鑾峰彇娉㈢壒鐜囨爣绛撅紝鑻ヤ负绌哄垯鍒涘缓
+    public static JLabel getBotelv_jl() {
+        if (botelv_jl == null) {
+            botelv_jl = new JLabel(" 娉㈢壒鐜囷細");  // 鍒濆鍖栬鏍囩
+        }
+        return botelv_jl;
+    }
+
+    // 鑾峰彇 涓插彛鍙蜂笅鎷夋锛岃嫢涓虹┖鍒欏垱寤�
+    public static JComboBox getChuanKou_jcom() {
+        if (chuanKou_jcom == null) {
+            chuanKou_jcom = new JComboBox();  // 鍒濆鍖栬涓嬫媺妗�
+            chuanKou_jcom.addFocusListener(new FocusListener() {
+                @Override
+                public void focusGained(FocusEvent e) {
+                    int comnum = SerialPortManager.get_all_port().size();
+                    if (coms.length != comnum) {
+                        coms = new String[SerialPortManager.get_all_port().size()];
+                        for (int i = 0; i < SerialPortManager.get_all_port().size(); i++) {
+                            coms[i] = SerialPortManager.get_all_port().get(i);
+                        }
+                        ComboBoxModel<String> coModel = new DefaultComboBoxModel<>(coms);//涓嬫媺鍒楄〃妯″瀷
+                        chuanKou_jcom.setModel(coModel);
+                    }
+                }
+
+                @Override
+                public void focusLost(FocusEvent e) {
+
+                }
+            });
+            if (SerialPortManager.get_all_port().size() != 0) {
+                coms = new String[SerialPortManager.get_all_port().size()];
+                for (int i = 0; i < SerialPortManager.get_all_port().size(); i++) {
+                    coms[i] = SerialPortManager.get_all_port().get(i);
+                }
+            } else {
+                coms = new String[1];
+                coms[0] = "鏈瘑鍒埌com鍙�";
+            }
+            ComboBoxModel<String> coModel = new DefaultComboBoxModel<>(coms);//涓嬫媺鍒楄〃妯″瀷
+            chuanKou_jcom.setModel(coModel);
+        }
+        return chuanKou_jcom;
+    }
+
+
+    // 鑾峰彇娉㈢壒鐜囦笅鎷夋锛岃嫢涓虹┖鍒欏垱寤�
+    public static JComboBox getBoteLV_jcm() {
+        if (boteLV_jcm == null) {
+            String[] com = {"115200", "921600", "19200", "9600"};
+            boteLV_jcm = new JComboBox(com);  // 鍒濆鍖栬涓嬫媺妗�
+        }
+        return boteLV_jcm;
+    }
+
+
+    // 鑾峰彇 鎵撳紑涓插彛 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getOpen() {
+        if (open == null) {
+            open = new JButton("鎵撳紑涓插彛");  // 鍒濆鍖栬鎸夐挳
+            open.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    com = (String) chuanKou_jcom.getSelectedItem();
+                    if (com == null || com.equals("鏈瘑鍒埌com鍙�")) {
+                        ShowMessage.zidingyi("鏈瘑鍒埌com鍙�,璇锋彃鍏ラ厤缃嚎骞堕噸鍚蒋浠�");
+                        comshuaxin();
+                        return;
+                    }
+                    int bote = Integer.parseInt((String) boteLV_jcm.getSelectedItem());
+                    if (!chuankou) {
+                        serialPort = SerialPortManager.open_chuankou(com, bote);
+                        if (serialPort == null) {
+                            return;
+                        }
+                        chuankou = true;//涓插彛琚墦寮�
+                        open.setEnabled(false);
+                        close.setEnabled(true);
+                        try {
+                            SerialPortUtil.setListenerToSerialPort(serialPort, event -> {
+
+                                //鏁版嵁閫氱煡
+                                if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+                                    if (!versionUpgradeComp.isWrite()) {
+                                        byte[] bytes = SerialPortUtil.readData(serialPort);
+                                        if (bytes == null) {
+                                            return;
+                                        }
+
+                                        showDataComp.addAreaTextMes(bytes,"127.0.0.1",8888);
+                                    }
+                                }
+                            });
+
+
+                        } catch (TooManyListenersException e1) {
+                            // TODO 鑷姩鐢熸垚鐨� catch 鍧�
+                            e1.printStackTrace();
+                        }
+                    } else {
+                        ShowMessage.zidingyi("璇峰厛鍏抽棴宸叉墦寮�鐨勪覆鍙�");
+                    }
+                }
+            });
+        }
+        return open;
+    }
+
+    // 鑾峰彇 鍏抽棴涓插彛 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getClose() {
+        if (close == null) {
+            close = new JButton("鍏抽棴涓插彛");  // 鍒濆鍖栬鎸夐挳
+            close.setEnabled(false);
+            close.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    try {
+                        if (chuankou) {
+                            SerialPortUtil.closeSerialPort(serialPort);
+                            open.setEnabled(true);
+                            close.setEnabled(false);
+                            chuankou = false;
+                            anchor_Dell.getAnchors().removeAllElements();//娓呯┖淇℃爣鍩虹珯鐨勯泦鍚�
+                            anchorListComp.updateTable();//娓呯┖淇℃爣鍒楄〃
+                        } else {
+                            ShowMessage.zidingyi("涓插彛鏈墦寮�");
+                        }
+                    } catch (Exception ex) {
+                        throw new RuntimeException(ex);
+                    }
+                }
+            });
+        }
+        return close;
+    }
+
+
+    //閲嶆柊鍒锋柊涓插彛
+    public static void comshuaxin() {
+        int comnum = SerialPortManager.get_all_port().size();
+        if (comnum != 0) {
+            coms = new String[SerialPortManager.get_all_port().size()];
+            for (int i = 0; i < SerialPortManager.get_all_port().size(); i++) {
+                coms[i] = SerialPortManager.get_all_port().get(i);
+            }
+        } else {
+            coms = new String[1];
+            coms[0] = "鏈瘑鍒埌com鍙�";
+        }
+        ComboBoxModel<String> coModel = new DefaultComboBoxModel<>(coms);//涓嬫媺鍒楄〃妯″瀷
+        chuanKou_jcom.setModel(coModel);
+        chuanKou_jcom.repaint();
+    }
+
+    public static SerialPort getSerialPort() {
+        return serialPort;
+    }
+
+    public static boolean isChuankou() {
+        return chuankou;
+    }
+}
diff --git a/src/index/JPanelMoudle/anchorListComp.java b/src/index/JPanelMoudle/anchorListComp.java
new file mode 100644
index 0000000..12b1d68
--- /dev/null
+++ b/src/index/JPanelMoudle/anchorListComp.java
@@ -0,0 +1,199 @@
+package index.JPanelMoudle;
+
+
+import Anchor.Anchor;
+import Anchor.anchor_Dell;
+import tools.ShowMessage;
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableCellRenderer;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+public class anchorListComp {
+    private static JPanel ancList_jp;//鍩虹珯鍒楄〃闈㈡澘
+
+    private static JTable ancTable;//鍩虹珯鍒楄〃
+    private static DefaultTableModel model;//琛ㄦ牸妯″瀷
+    private static JButton select_anc;//鎵弿淇℃爣鎸夐挳
+    private static JScrollPane scrollPane1;//瑙f瀽鏁版嵁婊氬姩闈㈡澘
+
+    private static Vector<Vector<String>> rowData = null;
+    private static Set<Anchor> existingIds = new HashSet<>();
+    ;
+
+    // 鑾峰彇 ancList_jp 闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JPanel getAncList_jp() {
+        if (ancList_jp == null) {
+            ancList_jp = new JPanel();  // 鍒濆鍖栬闈㈡澘
+            ancList_jp.setBorder(new TitledBorder("淇℃爣鍒楄〃"));
+        }
+        return ancList_jp;
+    }
+
+    public static JTable getAncTable() {
+        if (ancTable == null) {
+            String[] columnNames = {"璁惧ID", "娴嬭窛璺濈(cm)"}; // 琛ㄦ牸鍒楀悕
+            Vector<String> columnName = new Vector<>();
+            for (int i = 0; i < columnNames.length; i++) {
+                columnName.add(columnNames[i]);
+            }
+
+            // 琛ㄦ牸鍒濆鍖�
+            ancTable = new JTable(rowData, columnName) {
+                private static final long serialVersionUID = 1L;
+
+                // 绂佹缂栬緫
+                public boolean isCellEditable(int row, int column) {
+                    return false;
+                }
+
+                // 閲嶅啓 prepareRenderer 瀹炵幇闅旇鍙樿壊
+                @Override
+                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
+                    Component c = super.prepareRenderer(renderer, row, column);
+
+                    // 璁剧疆闅旇鍙樿壊锛氬伓鏁拌涓虹櫧鑹诧紝濂囨暟琛屼负鐏拌壊
+                    if (!isRowSelected(row)) {
+                        if (row % 2 == 0) {
+                            c.setBackground(new Color(240, 240, 240));  // 鍋舵暟琛岀伆鑹�
+                        } else {
+                            c.setBackground(Color.white);  // 濂囨暟琛岀櫧鑹�
+                        }
+                    }
+                    return c;
+                }
+            };
+            ancTable.setColumnSelectionAllowed(false);
+            ancTable.getTableHeader().setReorderingAllowed(false);
+            // 璁剧疆琛ㄦ牸鏍峰紡
+            setShowStyle();
+            // 璁剧疆鍒楀ご鏍峰紡
+            ancTable.getTableHeader().setPreferredSize(new Dimension(ancTable.getTableHeader().getPreferredSize().width, 40));
+            DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer();
+            headerRenderer.setHorizontalAlignment(SwingConstants.CENTER);  // 鍒楀ご鏂囧瓧灞呬腑
+            for (int i = 0; i < ancTable.getColumnCount(); i++) {
+                ancTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
+            }
+            // 璁剧疆琛岄珮
+            ancTable.setRowHeight(35);  // 璁剧疆姣忚鐨勯珮搴︿负35鍍忕礌
+            // 鑾峰彇琛ㄦ牸妯″瀷骞跺姞杞芥暟鎹�
+            model = (DefaultTableModel) ancTable.getModel();
+            getRowData(anchor_Dell.getAnchors());
+            ancTable.revalidate();
+            ancTable.repaint();
+        }
+        return ancTable;
+    }
+
+
+    public static void getRowData(Vector<Anchor> s2_vector) {
+        // 閬嶅巻鏂版暟鎹�
+        for (Anchor s2 : s2_vector) {
+            String anchorId = s2.getAnchorId().trim();
+            String newDistance = s2.getDistance().trim();
+
+            boolean found = false;
+
+            // 閬嶅巻鐜版湁妯″瀷锛屽垽鏂槸鍚﹀瓨鍦ㄧ浉鍚岀殑 AnchorId
+            for (int i = 0; i < model.getRowCount(); i++) {
+                String existingId = ((String) model.getValueAt(i, 0)).trim();
+                String existingDistance = ((String) model.getValueAt(i, 1)).trim();
+                if (existingId.equals(anchorId)) {
+                    found = true;
+                    // 濡傛灉璺濈涓嶅悓锛屾洿鏂版ā鍨�
+                    if (!existingDistance.equals(newDistance)) {
+                        model.setValueAt(newDistance, i, 1); // 鏇存柊璺濈
+                    }
+                    break;
+                }
+            }
+            // 濡傛灉娌℃湁鎵惧埌锛屾坊鍔犳柊琛�
+            if (!found) {
+                Vector<String> row = new Vector<>();
+                row.add(anchorId);
+                row.add(newDistance);
+                model.addRow(row);
+            }
+        }
+    }
+
+    // 鑾峰彇 select_anc 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSelect_anc() {
+        if (select_anc == null) {
+            select_anc = new JButton("鎵弿淇℃爣");  // 鍒濆鍖栬鎸夐挳
+            select_anc.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (ComMoudleComp.isChuankou()) {
+                        updateTable();
+                        ShowMessage.zidingyi("姝e湪閲嶆柊鎵弿淇℃爣");
+                    } else {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                    }
+                }
+            });
+        }
+        return select_anc;
+    }
+
+    // 鑾峰彇 瑙f瀽鏁版嵁婊氬姩闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JScrollPane getScrollPane1() {
+        if (scrollPane1 == null) {
+            scrollPane1 = new JScrollPane();  // 鍒濆鍖栬婊氬姩闈㈡澘
+        }
+        return scrollPane1;
+    }
+
+
+    //璁剧疆琛ㄦ牸鏄剧ず椋庢牸
+    private static void setShowStyle() {
+        // 鑾峰彇琛ㄦ牸鐨勫垪鏁�
+        int columnCount = ancTable.getColumnCount();
+        // 鍒涘缓涓�涓粯璁ょ殑鍗曞厓鏍兼覆鏌撳櫒锛岀敤浜庡眳涓樉绀�
+        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
+        renderer.setHorizontalAlignment(SwingConstants.CENTER);
+        // 涓烘瘡涓�鍒楄缃娓叉煋鍣�
+        for (int i = 0; i < columnCount; i++) {
+            ancTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
+        }
+        // 涓哄垪澶磋缃眳涓覆鏌撳櫒
+        DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer();
+        headerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
+        for (int i = 0; i < columnCount; i++) {
+            // 璁剧疆鍒楀ご鐨勬覆鏌撳櫒
+            ancTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
+        }
+    }
+
+
+    //鍒锋柊琛ㄦ牸鐨勬柟娉�
+    public static void updateTable() {
+        if (model != null) {
+            // 娓呯┖鎵�鏈夎
+            existingIds.clear();
+            model.setRowCount(0);
+            anchor_Dell.getAnchors().removeAllElements();//鍒犻櫎鎵�鏈変俊鏍�
+            getRowData(anchor_Dell.getAnchors());
+            scrollPane1.validate();
+        }
+    }
+
+    public static String getChooseAnchorId() {
+        String anchorID = null;
+        int selectedRow = anchorListComp.getAncTable().getSelectedRow();
+        if (selectedRow != -1) {
+            anchorID = (String) anchorListComp.getAncTable().getValueAt(selectedRow, 0);
+        }
+        return anchorID;
+    }
+}
diff --git a/src/index/JPanelMoudle/readParamsComp.java b/src/index/JPanelMoudle/readParamsComp.java
new file mode 100644
index 0000000..c4a0f42
--- /dev/null
+++ b/src/index/JPanelMoudle/readParamsComp.java
@@ -0,0 +1,361 @@
+package index.JPanelMoudle;
+
+import baowen.WriteReadAnchor;
+import tools.Judge.JugeIn;
+import tools.ShowMessage;
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class readParamsComp {
+
+    private static JPanel readAncParam_jp;//璇诲彇淇℃爣閰嶇疆闈㈡澘
+    private static JButton readParam;//璇诲彇鍙傛暟鎸夐挳
+    private static JLabel anchorId;//鍩虹珯ID
+    private static JLabel anchorVersion;//淇℃爣鐗堟湰鍙�
+    private static JLabel groupId;//閫氳灏忕粍
+    private static JLabel anchorPower;//淇℃爣鍔熺巼
+    private static JLabel jiaoZhunDis;//鏍″噯璺濈
+    private static JLabel label6;//淇濈暀鍙傛暟1
+    private static JLabel label7;//淇濈暀鍙傛暟2
+    private static JLabel label8;//淇濈暀鍙傛暟3
+    private static JTextField anchorId_jf;
+    private static JTextField anchorVersion_jf;
+    private static JTextField groupId_jf;
+    private static JTextField anchorPower_jf;
+    private static JTextField jiaoZhunDis_jf;
+    private static JTextField textField6;
+    private static JTextField textField7;
+    private static JTextField textField8;
+
+
+    private static JButton saveParam_groupId;
+    private static JButton saveParam_anchorPower;
+    private static JButton saveParam_jiaoZhunDis;
+    private static JButton saveParam_label6;
+    private static JButton saveParam_label7;
+    private static JButton saveParam_label8;
+
+
+    // 鑾峰彇 readAncParam_jp 闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JPanel getReadAncParam_jp() {
+        if (readAncParam_jp == null) {
+            readAncParam_jp = new JPanel();  // 鍒濆鍖栬闈㈡澘
+            readAncParam_jp.setBorder(new TitledBorder("璇诲啓淇℃爣鍙傛暟"));
+        }
+        return readAncParam_jp;
+    }
+
+
+    // 鑾峰彇 readParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getReadParam() {
+        if (readParam == null) {
+            readParam = new JButton("璇诲彇鍙傛暟");  // 鍒濆鍖栬鎸夐挳
+            readParam.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    String chooseAnchorId = anchorListComp.getChooseAnchorId();
+                    if (chooseAnchorId != null) {
+                        WriteReadAnchor.updateLora("0", (byte) 0x00, (byte) 0x02, chooseAnchorId, ComMoudleComp.getSerialPort(),(byte) 0x02);
+                        ShowMessage.zidingyi(chooseAnchorId + ":璇诲彇鎸囦护宸插彂閫�");
+                    } else {
+                        ShowMessage.zidingyi("璇峰湪淇℃爣鍒楄〃涓�変腑闇�瑕佽鍙栫殑璁惧");
+                    }
+                }
+            });
+
+
+        }
+        return readParam;
+    }
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_GroupID() {
+        if (saveParam_groupId == null) {
+            saveParam_groupId = new JButton("淇濆瓨閫氳灏忕粍");  // 鍒濆鍖栬鎸夐挳
+            saveParam_groupId.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                    String zuId = getGroupId_jf().getText();//閫氳灏忕粍
+                    boolean groudID = JugeIn.shuru("閫氳灏忕粍", zuId);
+                    if (groudID){
+                        WriteReadAnchor.updateLora(zuId, (byte) 0x0A, (byte) 0x01, ancID, ComMoudleComp.getSerialPort(),(byte) 0x02);
+                    }
+                }
+            });
+        }
+        return saveParam_groupId;
+    }
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_anchorPower() {
+        if (saveParam_anchorPower == null) {
+            saveParam_anchorPower = new JButton("淇濆瓨淇℃爣鍔熺巼");  // 鍒濆鍖栬鎸夐挳
+            saveParam_anchorPower.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                    String power = getAnchorPower_jf().getText();//淇℃爣鍔熺巼
+                    boolean poweraAnc = JugeIn.shuru("淇℃爣鍔熺巼", power);
+                    if (poweraAnc){
+                        WriteReadAnchor.updateLora(power, (byte) 0x36, (byte) 0x01, ancID, ComMoudleComp.getSerialPort(),(byte) 0x02);
+                    }
+                }
+            });
+        }
+        return saveParam_anchorPower;
+    }
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_jiaoZhunDis() {
+        if (saveParam_jiaoZhunDis == null) {
+            saveParam_jiaoZhunDis = new JButton("淇濆瓨鏍″噯璺濈");  // 鍒濆鍖栬鎸夐挳
+            saveParam_jiaoZhunDis.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                    String dis = getJiaoZhunDis_jf().getText();//鏍″噯璺濈
+                    boolean distance = JugeIn.shuru("鏍″噯璺濈", dis);
+                    if (distance){
+                        WriteReadAnchor.updateLora(dis, (byte) 0x0C, (byte) 0x01, ancID, ComMoudleComp.getSerialPort(),(byte) 0x02);
+                    }
+                }
+            });
+        }
+        return saveParam_jiaoZhunDis;
+    }
+
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_label6() {
+        if (saveParam_label6 == null) {
+            saveParam_label6 = new JButton("淇濆瓨鍙傛暟");  // 鍒濆鍖栬鎸夐挳
+            saveParam_label6.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                }
+            });
+        }
+        return saveParam_label6;
+    }
+
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_label7() {
+        if (saveParam_label7 == null) {
+            saveParam_label7 = new JButton("淇濆瓨鍙傛暟");  // 鍒濆鍖栬鎸夐挳
+            saveParam_label7.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                }
+            });
+        }
+        return saveParam_label7;
+    }
+
+
+    // 鑾峰彇 saveParam 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getSaveParam_label8() {
+        if (saveParam_label8 == null) {
+            saveParam_label8 = new JButton("淇濆瓨鍙傛暟");  // 鍒濆鍖栬鎸夐挳
+            saveParam_label8.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!ComMoudleComp.isChuankou()) {
+                        ShowMessage.zidingyi("璇峰厛鎵撳紑涓插彛");
+                        return;
+                    }
+                    if (getAnchorId_jf().getText().length()!=4){
+                        ShowMessage.zidingyi("淇℃爣ID涓嶆纭�");
+                        return;
+                    }
+                    String ancID = getAnchorId_jf().getText();//鍩虹珯ID
+                }
+            });
+        }
+        return saveParam_label8;
+    }
+
+
+
+    // 鑾峰彇 label1 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getAnchorId() {
+        if (anchorId == null) {
+            anchorId = new JLabel("    淇℃爣ID");  // 鍒濆鍖栬鏍囩
+        }
+        return anchorId;
+    }
+
+    // 鑾峰彇 label2 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getAnchorVersion() {
+        if (anchorVersion == null) {
+            anchorVersion = new JLabel("    淇℃爣鐗堟湰鍙�");  // 鍒濆鍖栬鏍囩
+        }
+        return anchorVersion;
+    }
+
+    // 鑾峰彇 label3 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getGroupId() {
+        if (groupId == null) {
+            groupId = new JLabel("    閫氳灏忕粍");  // 鍒濆鍖栬鏍囩
+        }
+        return groupId;
+    }
+
+    // 鑾峰彇 label4 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getAnchorPower() {
+        if (anchorPower == null) {
+            anchorPower = new JLabel("    淇℃爣鍔熺巼");  // 鍒濆鍖栬鏍囩
+        }
+        return anchorPower;
+    }
+
+    // 鑾峰彇 label5 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getJiaoZhunDis() {
+        if (jiaoZhunDis == null) {
+            jiaoZhunDis = new JLabel("    鏍″噯璺濈");  // 鍒濆鍖栬鏍囩
+        }
+        return jiaoZhunDis;
+    }
+
+    // 鑾峰彇 label6 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getLabel6() {
+        if (label6 == null) {
+            label6 = new JLabel("    淇濈暀鍙傛暟1");  // 鍒濆鍖栬鏍囩
+        }
+        return label6;
+    }
+
+    // 鑾峰彇 label7 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getLabel7() {
+        if (label7 == null) {
+            label7 = new JLabel("    淇濈暀鍙傛暟2");  // 鍒濆鍖栬鏍囩
+        }
+        return label7;
+    }
+
+    // 鑾峰彇 label8 鏍囩锛岃嫢涓虹┖鍒欏垱寤�
+    public static JLabel getLabel8() {
+        if (label8 == null) {
+            label8 = new JLabel("    淇濈暀鍙傛暟3");  // 鍒濆鍖栬鏍囩
+        }
+        return label8;
+    }
+
+
+    // 鑾峰彇 textField1 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getAnchorId_jf() {
+        if (anchorId_jf == null) {
+            anchorId_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+            anchorId_jf.setEnabled(false);
+        }
+        return anchorId_jf;
+    }
+
+    // 鑾峰彇 textField2 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getAnchorVersion_jf() {
+        if (anchorVersion_jf == null) {
+            anchorVersion_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+            anchorVersion_jf.setEnabled(false);
+        }
+        return anchorVersion_jf;
+    }
+
+    // 鑾峰彇 textField3 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getGroupId_jf() {
+        if (groupId_jf == null) {
+            groupId_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return groupId_jf;
+    }
+
+    // 鑾峰彇 textField4 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getAnchorPower_jf() {
+        if (anchorPower_jf == null) {
+            anchorPower_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return anchorPower_jf;
+    }
+
+    // 鑾峰彇 textField5 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getJiaoZhunDis_jf() {
+        if (jiaoZhunDis_jf == null) {
+            jiaoZhunDis_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return jiaoZhunDis_jf;
+    }
+
+    // 鑾峰彇 textField6 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getTextField6() {
+        if (textField6 == null) {
+            textField6 = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return textField6;
+    }
+
+    // 鑾峰彇 textField7 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getTextField7() {
+        if (textField7 == null) {
+            textField7 = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return textField7;
+    }
+
+    // 鑾峰彇 textField8 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getTextField8() {
+        if (textField8 == null) {
+            textField8 = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return textField8;
+    }
+
+}
diff --git a/src/index/JPanelMoudle/showDataComp.java b/src/index/JPanelMoudle/showDataComp.java
new file mode 100644
index 0000000..4ec5f75
--- /dev/null
+++ b/src/index/JPanelMoudle/showDataComp.java
@@ -0,0 +1,158 @@
+package index.JPanelMoudle;
+
+import baowen.Dell_Baowen;
+import tools.GetNowTime;
+import tools.Tools;
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.nio.charset.Charset;
+
+public class showDataComp {
+
+    private static JScrollPane dataShow;//瑙f瀽鏁版嵁婊氬姩闈㈡澘
+    private static JTextArea textArea1;
+    private static JPopupMenu popupMenu;//鍙抽敭鑿滃崟鍒楄〃
+    static boolean time=true;//鏄剧ず鏃堕棿鎴�
+    static boolean ascll=false;//ascll鏄剧ず
+
+    // 鑾峰彇 textArea1 鏂囨湰鍖猴紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextArea getTextArea1() {
+        if (textArea1 == null) {
+            textArea1 = new JTextArea();  // 鍒濆鍖栬鏂囨湰鍖�
+            textArea1.addMouseListener(new MouseAdapter() {
+                @Override
+                public void mousePressed(MouseEvent e) {
+                    maybeShowPopup(e);
+                }
+
+                @Override
+                public void mouseReleased(MouseEvent e) {
+                    maybeShowPopup(e);
+                }
+
+                // 鏄剧ず鍙抽敭鑿滃崟
+                private void maybeShowPopup(MouseEvent e) {
+                    if (e.isPopupTrigger()) {  // 鍒ゆ柇鏄惁鏄彸閿偣鍑�
+                        getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
+                    }
+                }
+            });
+        }
+        return textArea1;
+    }
+    // 鑾峰彇 瑙f瀽鏁版嵁婊氬姩闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JScrollPane getDataShow() {
+        if (dataShow == null) {
+            dataShow = new JScrollPane();  // 鍒濆鍖栬婊氬姩闈㈡澘
+            dataShow.setBorder(new TitledBorder("鎺ユ敹鏁版嵁瑙f瀽"));
+        }
+        return dataShow;
+    }
+
+    public static JPopupMenu getPopupMenu(){
+        if (popupMenu == null) {
+            popupMenu = new JPopupMenu();
+            popupMenu.setBackground(new Color(245, 245, 245));  // 璁剧疆鑿滃崟鑳屾櫙鑹�
+            popupMenu.setFont(new Font("Segoe UI", Font.PLAIN, 14)); // 璁剧疆瀛椾綋
+
+            // 鍔ㄦ�佽绠楄彍鍗曢」鐨勬枃鏈�
+            String showAscll = ascll ? "HEX鏄剧ず" : "ASCLL鏄剧ず";
+            String noShowtime = time ? "闅愯棌鏃堕棿鎴�" : "鏄剧ず鏃堕棿鎴�";
+
+            // 鍒涘缓鑿滃崟椤�
+            JMenuItem clear = new JMenuItem("娓呯┖绐楀彛");
+            JMenuItem ascllShow = new JMenuItem(showAscll);
+            JMenuItem timeNoShow = new JMenuItem(noShowtime);
+
+            // 娣诲姞鍔ㄤ綔鐩戝惉鍣�
+            clear.addActionListener(e -> textArea1.setText(""));
+            ascllShow.addActionListener(e -> setAscll());
+            timeNoShow.addActionListener(e -> setTimeShow());
+
+            // 榧犳爣鎮仠鏃舵敼鍙樿儗鏅鑹�
+            clear.addMouseListener(createMouseAdapter(clear));
+            ascllShow.addMouseListener(createMouseAdapter(ascllShow));
+            timeNoShow.addMouseListener(createMouseAdapter(timeNoShow));
+
+            // 娣诲姞鑿滃崟椤瑰埌鑿滃崟
+            popupMenu.add(clear);
+            popupMenu.addSeparator();
+            popupMenu.add(ascllShow);
+            popupMenu.addSeparator();
+            popupMenu.add(timeNoShow);
+        } else {
+            // 濡傛灉popupMenu宸茬粡鍒涘缓锛屾洿鏂拌彍鍗曢」
+            // 鍔ㄦ�佹洿鏂拌彍鍗曢」鏂囨湰
+            ((JMenuItem) popupMenu.getComponent(2)).setText(ascll ? "HEX鏄剧ず" : "ASCLL鏄剧ず");
+            ((JMenuItem) popupMenu.getComponent(4)).setText(time ? "闅愯棌鏃堕棿鎴�" : "鏄剧ず鏃堕棿鎴�");
+        }
+
+        return popupMenu;
+    }
+
+    // 榧犳爣鎮仠鏃舵敼鍙樿儗鏅鑹茬殑閫氱敤鏂规硶
+    private static MouseAdapter createMouseAdapter(JMenuItem item) {
+        return new MouseAdapter() {
+            @Override
+            public void mouseEntered(MouseEvent e) {
+                item.setBackground(new Color(220, 220, 220)); // 璁剧疆鎮仠鏃剁殑棰滆壊
+            }
+
+            @Override
+            public void mouseExited(MouseEvent e) {
+                item.setBackground(new Color(240, 240, 240)); // 鎭㈠姝e父棰滆壊
+            }
+        };
+    }
+
+
+    public static void addAreaTextMes(byte[] Datas,String ip,int port) {
+        String message = ascll ? new String(Datas, Charset.forName("GBK")): Tools.Bytes2HexString(Datas);
+        if (time) {
+            getTextArea1().append(GetNowTime.timestamp2() + ":鏀垛啇" + message + "\n");
+        }else {
+            getTextArea1().append( message + "\n");
+        }
+        if (port!=9999) {
+            Dell_Baowen.intsert(ip, message, GetNowTime.timestamp2(), port);
+        }
+        // 鑾峰彇鏂囨湰鍖哄煙鐨勯暱搴︼紙鍗虫渶鍚庝竴琛岀殑缁撴潫浣嶇疆锛�
+        int length = textArea1.getDocument().getLength();
+        // 璁剧疆鍏夋爣浣嶇疆鍒版枃鏈殑鏈熬
+        textArea1.setCaretPosition(length);
+    }
+
+    public static void addSendAreaTextMes(byte[] Datas){
+        String message = ascll ? new String(Datas, Charset.forName("GBK")): Tools.Bytes2HexString(Datas);
+        if (time) {
+            getTextArea1().append(GetNowTime.timestamp2()+":鍙戔啋"+message+"\n");
+        }else {
+            getTextArea1().append( message + "\n");
+        }
+        // 鑾峰彇鏂囨湰鍖哄煙鐨勯暱搴︼紙鍗虫渶鍚庝竴琛岀殑缁撴潫浣嶇疆锛�
+        int length = textArea1.getDocument().getLength();
+        // 璁剧疆鍏夋爣浣嶇疆鍒版枃鏈殑鏈熬
+        textArea1.setCaretPosition(length);
+    }
+
+    public static void setTimeShow(){
+        if (time){
+            time=false;
+        }else {
+            time=true;
+        }
+    }
+
+    public static void setAscll(){
+        if (ascll){
+            ascll=false;
+        }else {
+            ascll=true;
+        }
+    }
+
+}
diff --git a/src/index/JPanelMoudle/versionUpgradeComp.java b/src/index/JPanelMoudle/versionUpgradeComp.java
new file mode 100644
index 0000000..cd20591
--- /dev/null
+++ b/src/index/JPanelMoudle/versionUpgradeComp.java
@@ -0,0 +1,228 @@
+package index.JPanelMoudle;
+
+import baowen.WriteReadAnchor;
+import gnu.io.SerialPort;
+import tools.ChuanKou.SerialPortUtil;
+import tools.CustomProgressBar;
+import tools.ShowMessage;
+import ymodem.getFilesDataBytes;
+import ymodem.YModemUpgradeThread;
+
+import javax.swing.*;
+import javax.swing.border.TitledBorder;
+
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+
+public class versionUpgradeComp {
+    private static JPanel  versionUpdate;//鐗堟湰鍗囩骇闈㈡澘
+    private static JLabel label9;//绌烘爣绛撅紝杩涜鍗犱綅
+    private static JTextField readVersion_jf;//璇诲彇鎵弿鍣ㄧ増鏈枃鏈
+    private static JTextField chooseVersion_jf;//閫夋嫨鍥轰欢鏂囨湰妗�
+
+    private static JButton chooseVersion;//閫夋嫨鍥轰欢鎸夐挳
+    private static JButton write_saoMiao;//鍐欏叆鎵弿鍣ㄦ寜閽�
+    public static boolean write=false;//鍐欏叆鎵弿鍣ㄦ寜閽�
+    public static boolean xinBiaoUp=false;//鍗囩骇淇℃爣鐗堟湰鎸夐挳
+    private static JButton readVersion_jb;//璇诲彇鐗堟湰鎸夐挳
+    private static JButton  updateAnchor_jb;//鍗囩骇淇℃爣鐗堟湰鎸夐挳
+
+    private static CustomProgressBar jindu_SaoMiaoQi;//鍐欏叆鎵弿鍣ㄨ繘搴︽潯
+    private static CustomProgressBar updateAnchor_jf;//鍗囩骇淇℃爣鐗堟湰杩涘害鏉�
+
+    private static YModemUpgradeThread upgradeThread; // 淇濆瓨绾跨▼寮曠敤
+    private static Color color = new Color(6, 176, 37);; // 淇濆瓨绾跨▼寮曠敤
+
+    // 鑾峰彇鐗堟湰鍗囩骇闈㈡澘锛岃嫢涓虹┖鍒欏垱寤�
+    public static JPanel getVersionUpdate() {
+        if (versionUpdate == null) {
+            versionUpdate = new JPanel();  // 鍒濆鍖栬闈㈡澘
+            versionUpdate.setBorder(new TitledBorder("鍥轰欢鍗囩骇"));
+        }
+        return versionUpdate;
+    }
+
+    // 鑾峰彇绌烘爣绛撅紝鑻ヤ负绌哄垯鍒涘缓
+    public static JLabel getLabel9() {
+        if (label9 == null) {
+            label9 = new JLabel();  // 鍒濆鍖栬鏍囩
+        }
+        return label9;
+    }
+
+
+
+    // 鑾峰彇 閫夋嫨鍥轰欢 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getChooseVersion() {
+        if (chooseVersion == null) {
+            chooseVersion = new JButton("閫夋嫨鍥轰欢");  // 鍒濆鍖栬鎸夐挳
+            chooseVersion.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    // 鎵撳紑鏂囦欢閫夋嫨瀵硅瘽妗�
+                    String currentDirectory = System.getProperty("user.dir");
+                    JFileChooser fileChooser = new JFileChooser();
+                    // 璁剧疆鏂囦欢閫夋嫨瀵硅瘽妗嗕负鍙�夋嫨鏂囦欢
+                    fileChooser.setDialogTitle("閫夋嫨鍥轰欢");
+                    fileChooser.setCurrentDirectory(new File(currentDirectory));
+                    int result = fileChooser.showOpenDialog(readParamsComp.getReadAncParam_jp());
+                    if (result == JFileChooser.APPROVE_OPTION) {
+                        // 濡傛灉鐢ㄦ埛閫夋嫨浜嗘枃浠�
+                        File selectedFile = fileChooser.getSelectedFile();
+                        // 鏄剧ず閫夋嫨鐨勬枃浠惰矾寰�
+                        getChooseVersion_jf().setText(selectedFile.getPath());//鏂囦欢鍚嶇О);
+                    }
+                }
+            });
+        }
+        return chooseVersion;
+    }
+
+    // 鑾峰彇 鍐欏叆鎵弿鍣� 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getWrite_saoMiao() {
+        if (write_saoMiao == null) {
+            write_saoMiao = new JButton("鍐欏叆鎵弿鍣�");  // 鍒濆鍖栬鎸夐挳
+            write_saoMiao.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if(!write) {
+                        String filePath = getChooseVersion_jf().getText();
+                        if (!ComMoudleComp.isChuankou()) {
+                            ShowMessage.zidingyi("涓插彛鏈瘑鍒�");
+                            return;
+                        }
+                        if (filePath == null || filePath.length() < 10) {
+                            ShowMessage.zidingyi("鍥轰欢涓嶆纭�");
+                            return;
+                        }
+                        SerialPort serialPort = ComMoudleComp.getSerialPort();
+                        write = true;
+                        byte[] bytes = WriteReadAnchor.write_lora((byte) 0x10, (byte) 0x2, 1);
+                        YModemUpgradeThread.shengji(serialPort,filePath,bytes);
+                        write_saoMiao.setText("鍙栨秷鍐欏叆");
+                        jindu_SaoMiaoQi.setStringPainted(true); // 鏄剧ず鐧惧垎姣旀枃瀛�
+                    }else {
+                       YModemUpgradeThread.setSendDataFlag(true);
+                        exitUpgrade();
+                    }
+                }
+            });
+        }
+        return write_saoMiao;
+    }
+
+
+
+    // 鑾峰彇 璇诲彇鎵弿鍣ㄧ増鏈� 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getReadVersion_jb() {
+        if (readVersion_jb == null) {
+            readVersion_jb = new JButton("璇诲彇鎵弿鍣ㄧ増鏈�");  // 鍒濆鍖栬鎸夐挳
+            readVersion_jb.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+
+                        if (!ComMoudleComp.isChuankou()) {
+                            ShowMessage.zidingyi("涓插彛鏈瘑鍒�");
+                            return;
+                        }
+                        ShowMessage.zidingyi("璇诲彇鎵弿鍣ㄧ増鏈寚浠ゅ彂閫佹垚鍔�");
+                        byte[] byt = WriteReadAnchor.ReadData((byte) 0x2, (byte) 0x50);
+                        WriteReadAnchor.sendData(ComMoudleComp.getSerialPort(), byt);
+                }
+
+            });
+        }
+        return readVersion_jb;
+    }
+
+    // 鑾峰彇 鍗囩骇淇℃爣鐗堟湰 鎸夐挳锛岃嫢涓虹┖鍒欏垱寤�
+    public static JButton getUpdateAnchor_jb() {
+        if (updateAnchor_jb == null) {
+            updateAnchor_jb = new JButton("鍗囩骇淇℃爣鐗堟湰");  // 鍒濆鍖栬鎸夐挳
+            updateAnchor_jb.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (!xinBiaoUp) {
+
+                        if (!ComMoudleComp.isChuankou()) {
+                            ShowMessage.zidingyi("涓插彛鏈瘑鍒�");
+                            return;
+                        }
+                        String text = readParamsComp.getAnchorId_jf().getText();
+                        if (text.length() != 4) {
+                            ShowMessage.zidingyi("淇℃爣ID涓嶆纭�,璇峰厛璇诲彇淇℃爣鍙傛暟");
+                            return;
+                        }
+                        SerialPort serialPort = ComMoudleComp.getSerialPort();
+                        xinBiaoUp=true;
+                        updateAnchor_jb.setText("閫�鍑轰俊鏍囧崌绾�");
+                        WriteReadAnchor.updateLora("0", (byte) 0xAA,(byte)  0x06, text,serialPort,(byte) 0x02);
+                    }else {
+                        exitUpgradeXinBiao();
+                    }
+                }
+            });
+        }
+        return updateAnchor_jb;
+    }
+
+
+    // 鑾峰彇 璇诲彇鎵弿鍣ㄧ増鏈� 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getReadVersion_jf() {
+        if (readVersion_jf == null) {
+            readVersion_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+        }
+        return readVersion_jf;
+    }
+
+    // 鑾峰彇 閫夋嫨鍥轰欢 鏂囨湰妗嗭紝鑻ヤ负绌哄垯鍒涘缓
+    public static JTextField getChooseVersion_jf() {
+        if (chooseVersion_jf == null) {
+            chooseVersion_jf = new JTextField();  // 鍒濆鍖栬鏂囨湰妗�
+            chooseVersion_jf.setEnabled(false);
+        }
+        return chooseVersion_jf;
+    }
+
+    // 鑾峰彇 鍐欏叆鎵弿鍣� 杩涘害鏉★紝鑻ヤ负绌哄垯鍒涘缓
+    public static CustomProgressBar  getJindu_SaoMiaoQi() {
+        if (jindu_SaoMiaoQi == null) {
+            jindu_SaoMiaoQi = new CustomProgressBar();  // 鍒濆鍖栬杩涘害鏉�
+            jindu_SaoMiaoQi.setForeground(color); // 璁剧疆杩涘害鏉″墠鏅壊涓虹豢鑹�
+            // 鑷畾涔塙I鏉ヤ慨鏀规枃鏈鑹�
+        }
+        return jindu_SaoMiaoQi;
+    }
+
+
+    // 鑾峰彇 鍗囩骇淇℃爣鐗堟湰 杩涘害鏉★紝鑻ヤ负绌哄垯鍒涘缓
+    public static CustomProgressBar getUpdateAnchor_jf() {
+        if (updateAnchor_jf == null) {
+            updateAnchor_jf = new CustomProgressBar();  // 鍒濆鍖栬杩涘害鏉�
+            updateAnchor_jf.setForeground(color); // 璁剧疆杩涘害鏉″墠鏅壊涓虹豢鑹�
+        }
+        return updateAnchor_jf;
+    }
+
+
+    public static boolean isWrite() {
+        return write;
+    }
+
+    public static void exitUpgrade() {
+        write=false;
+        write_saoMiao.setText("鍐欏叆鎵弿鍣�");
+        jindu_SaoMiaoQi.setValue(0); // 鏄剧ず鐧惧垎姣旀枃瀛�
+    }
+
+
+    public static void exitUpgradeXinBiao() {
+        xinBiaoUp=false;
+        updateAnchor_jb.setText("鍗囩骇淇℃爣鐗堟湰");
+        updateAnchor_jf.setValue(0); // 鏄剧ず鐧惧垎姣旀枃瀛�
+    }
+}
diff --git a/src/index/Timer100.java b/src/index/Timer100.java
new file mode 100644
index 0000000..40a2c8d
--- /dev/null
+++ b/src/index/Timer100.java
@@ -0,0 +1,40 @@
+package index;
+
+import Anchor.anchor_Dell;
+import index.JPanelMoudle.ComMoudleComp;
+import index.JPanelMoudle.anchorListComp;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class Timer100 {
+
+    Timer timer;
+    int time=0;
+
+    public  void ding_shi_qi() {
+        Integer cacheTime = 100;//瑙﹀彂鍣ㄦ椂闂�100姣鎵ц涓�娆�
+        timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    time++;
+                    if (time==10){
+                        if (ComMoudleComp.isChuankou()) {
+                            anchorListComp.getRowData(anchor_Dell.getAnchors());
+                        }else {
+                            anchorListComp.updateTable();//娓呯┖淇℃爣鍒楄〃
+                        }
+                        time=0;
+                    }
+                } catch (Exception e) {
+                    // TODO 鑷姩鐢熸垚鐨� catch 鍧�
+                    e.printStackTrace();
+                }
+            }
+        }, 100, cacheTime);
+
+    }
+
+}
diff --git a/src/index/homeMain.java b/src/index/homeMain.java
new file mode 100644
index 0000000..698ee79
--- /dev/null
+++ b/src/index/homeMain.java
@@ -0,0 +1,15 @@
+package index;
+
+import Anchor.anchor_Dell;
+import baowen.Dell_Baowen;
+
+import javax.swing.*;
+
+public class homeMain {
+    public static void main(String[] args) {
+        new Dell_Baowen().startThread();//鍚姩鎶ユ枃瑙f瀽绾跨▼
+        System.setProperty("sun.java2d.dpi", "96"); // 璁剧疆DPI鍊间负96锛堟爣鍑咲PI锛�
+        GCUWBreadIndex.startFrame();//鍚姩鍥惧舰鍖栫晫闈�
+        new Timer100().ding_shi_qi();//100姣瀹氭椂鍣�
+    }
+}
diff --git a/src/tools/AutoCloseDialog.java b/src/tools/AutoCloseDialog.java
new file mode 100644
index 0000000..5c5d5f8
--- /dev/null
+++ b/src/tools/AutoCloseDialog.java
@@ -0,0 +1,63 @@
+package tools;
+/**鑷姩鍏抽棴鐨勫璇濇*/
+
+import javax.swing.*;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class AutoCloseDialog {
+
+
+	static ImageIcon icon = new ImageIcon("image/warn.png"); // 璇锋浛鎹负浣犲浘鏍囩殑璺緞
+
+	/**3绉掗挓娑堝け鐨勫璇濇*/
+	public static JOptionPane getDialog(String message) {
+		JOptionPane op = new JOptionPane(message,
+				JOptionPane.INFORMATION_MESSAGE);
+		op.setIcon(icon);
+		final JDialog dialog = op.createDialog("鎻愮ず淇℃伅, 2绉掑悗鑷姩鍏抽棴锛�");
+
+		// 鍒涘缓涓�涓柊璁℃椂鍣�
+		Timer timer = new Timer();
+
+		// 3绉掑悗鎵ц璇ヤ换鍔�
+		timer.schedule(new TimerTask() {
+			public void run() {
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		}, 2000);
+		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+		dialog.setAlwaysOnTop(true);
+		dialog.setModal(false);
+		dialog.setVisible(true);
+		dialog.setIconImage(icon.getImage());
+		return op;
+	}
+
+
+	/**24h娑堝け鐨勫璇濇*/
+	public static JOptionPane getDialogno(String message) {
+		JOptionPane op = new JOptionPane(message,JOptionPane.INFORMATION_MESSAGE);
+		op.setIcon(icon);
+		final JDialog dialog = op.createDialog("鎻愮ず淇℃伅锛�");
+
+		// 鍒涘缓涓�涓柊璁℃椂鍣�
+		Timer timer = new Timer();
+
+		// 24灏忔椂鍚庡悗鎵ц璇ヤ换鍔�
+		timer.schedule(new TimerTask() {
+			public void run() {
+				dialog.setVisible(false);
+				dialog.dispose();
+			}
+		}, 86400000);
+		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+		dialog.setAlwaysOnTop(true);
+		dialog.setModal(false);
+		dialog.setVisible(true);
+		dialog.setIconImage(icon.getImage());
+		return op;
+	}
+
+}
diff --git a/src/tools/ChuanKou/CRC16.java b/src/tools/ChuanKou/CRC16.java
new file mode 100644
index 0000000..0fcb344
--- /dev/null
+++ b/src/tools/ChuanKou/CRC16.java
@@ -0,0 +1,51 @@
+package tools.ChuanKou;
+
+/**
+ * CRC16鏍¢獙
+ * 
+ * @author yangle
+ */
+public class CRC16 {
+
+	private static final char crctable[] = { 0x0000, 0x1021, 0x2042, 0x3063,
+			0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,
+			0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252,
+			0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a,
+			0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
+			0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509,
+			0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630,
+			0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
+			0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7,
+			0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af,
+			0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
+			0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,
+			0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5,
+			0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
+			0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4,
+			0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc,
+			0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,
+			0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3,
+			0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da,
+			0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,
+			0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589,
+			0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481,
+			0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
+			0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0,
+			0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
+			0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,
+			0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e,
+			0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16,
+			0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
+			0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45,
+			0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c,
+			0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
+			0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };
+
+	public static char calc(byte[] bytes) {
+		char crc = 0x0000;
+		for (byte b : bytes) {
+			crc = (char) ((crc << 8) ^ crctable[((crc >> 8) ^ b) & 0x00ff]);
+		}
+		return (char) (crc);
+	}
+}
diff --git a/src/tools/ChuanKou/SerialPortManager.java b/src/tools/ChuanKou/SerialPortManager.java
new file mode 100644
index 0000000..f71fef8
--- /dev/null
+++ b/src/tools/ChuanKou/SerialPortManager.java
@@ -0,0 +1,52 @@
+package tools.ChuanKou;
+
+
+import gnu.io.*;
+import tools.ShowMessage;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+public class SerialPortManager {
+	static Enumeration<CommPortIdentifier> portList;
+	static CommPortIdentifier portId;
+
+	
+	/**
+	 * 鍒楀嚭鏈湴杩炴帴鐨勬墍鏈変覆鍙e悕绉伴泦鍚�
+	 * @param args
+	 */
+	@SuppressWarnings("unchecked")//鍛婅瘔缂栬瘧鍣ㄥ拷鐣� unchecked 璀﹀憡淇℃伅锛屽浣跨敤List锛孉rrayList绛夋湭杩涜鍙傛暟鍖栦骇鐢熺殑璀﹀憡淇℃伅銆�
+	public static List<String> get_all_port(){
+		List<String> all_port=new ArrayList<String>();
+		portList = CommPortIdentifier.getPortIdentifiers();
+		while(portList.hasMoreElements()){
+			portId = (CommPortIdentifier)portList.nextElement();
+			if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){
+				all_port.add(portId.getName());
+			}
+		}
+		return all_port;		
+	}
+	
+	/**鎵撳紑涓插彛
+	 * @param chuankou 涓插彛鍙�
+	 * @param botelv 娉㈢壒鐜�*/
+	public static SerialPort open_chuankou(String chuankou,int botelv) {
+		SerialPort serialPort=null;
+		try {
+		serialPort =SerialPortUtil.openSerialPort(chuankou,botelv);
+		} catch (NoSuchPortException e) {
+			// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+			ShowMessage.zidingyi(chuankou+"涓嶅瓨鍦紒");
+		} catch (PortInUseException e) {
+			// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+			ShowMessage.zidingyi(chuankou+"宸茶鍗犵敤锛�");
+		} catch (UnsupportedCommOperationException e) {
+			// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+			ShowMessage.zidingyi(chuankou+"涓嶆敮鎸佹搷浣滐紒");
+		}
+		return serialPort;
+		
+	}
+}
diff --git a/src/tools/ChuanKou/SerialPortParameter.java b/src/tools/ChuanKou/SerialPortParameter.java
new file mode 100644
index 0000000..382f13c
--- /dev/null
+++ b/src/tools/ChuanKou/SerialPortParameter.java
@@ -0,0 +1,98 @@
+package tools.ChuanKou;
+
+import gnu.io.SerialPort;
+
+/**
+ * @name: SerialPortParameter
+ * @author: tuacy.
+ * @date: 2019/6/26.
+ * @version: 1.0
+ * @Description: 涓插彛鍙傛暟
+ */
+public final class SerialPortParameter {
+
+    /**
+     * 涓插彛鍚嶇О(COM0銆丆OM1銆丆OM2绛夌瓑)
+     */
+    private String serialPortName;
+    /**
+     * 娉㈢壒鐜�
+     * 榛樿锛�115200
+     */
+    private int baudRate;
+    /**
+     * 鏁版嵁浣� 榛樿8浣�
+     * 鍙互璁剧疆鐨勫�硷細SerialPort.DATABITS_5銆丼erialPort.DATABITS_6銆丼erialPort.DATABITS_7銆丼erialPort.DATABITS_8
+     * 榛樿锛歋erialPort.DATABITS_8
+     */
+    private int dataBits;
+    /**
+     * 鍋滄浣�
+     * 鍙互璁剧疆鐨勫�硷細SerialPort.STOPBITS_1銆丼erialPort.STOPBITS_2銆丼erialPort.STOPBITS_1_5
+     * 榛樿锛歋erialPort.STOPBITS_1
+     */
+    private int stopBits;
+    /**
+     * 鏍¢獙浣�
+     * 鍙互璁剧疆鐨勫�硷細SerialPort.PARITY_NONE銆丼erialPort.PARITY_ODD銆丼erialPort.PARITY_EVEN銆丼erialPort.PARITY_MARK銆丼erialPort.PARITY_SPACE
+     * 榛樿锛歋erialPort.PARITY_NONE
+     */
+    private int parity;
+
+    public SerialPortParameter(String serialPortName) {
+        this.serialPortName = serialPortName;
+        this.baudRate = 115200;
+        this.dataBits = SerialPort.DATABITS_8;
+        this.stopBits = SerialPort.STOPBITS_1;
+        this.parity = SerialPort.PARITY_NONE;
+    }
+
+    public SerialPortParameter(String serialPortName, int baudRate) {
+        this.serialPortName = serialPortName;
+        this.baudRate = baudRate;
+        this.dataBits = SerialPort.DATABITS_8;
+        this.stopBits = SerialPort.STOPBITS_1;
+        this.parity = SerialPort.PARITY_NONE;
+    }
+
+    public String getSerialPortName() {
+        return serialPortName;
+    }
+
+    public void setSerialPortName(String serialPortName) {
+        this.serialPortName = serialPortName;
+    }
+
+    public int getBaudRate() {
+        return baudRate;
+    }
+
+    public void setBaudRate(int baudRate) {
+        this.baudRate = baudRate;
+    }
+
+    public int getDataBits() {
+        return dataBits;
+    }
+
+    public void setDataBits(int dataBits) {
+        this.dataBits = dataBits;
+    }
+
+    public int getStopBits() {
+        return stopBits;
+    }
+
+    public void setStopBits(int stopBits) {
+        this.stopBits = stopBits;
+    }
+
+    public int getParity() {
+        return parity;
+    }
+
+    public void setParity(int parity) {
+        this.parity = parity;
+    }
+}
+
diff --git a/src/tools/ChuanKou/SerialPortUtil.java b/src/tools/ChuanKou/SerialPortUtil.java
new file mode 100644
index 0000000..436fbbe
--- /dev/null
+++ b/src/tools/ChuanKou/SerialPortUtil.java
@@ -0,0 +1,306 @@
+package tools.ChuanKou;
+
+import gnu.io.*;
+import index.JPanelMoudle.ComMoudleComp;
+import tools.ShowMessage;
+import tools.Tools;
+
+
+import javax.tools.Tool;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.TooManyListenersException;
+
+/**
+ * @name: SerialPortUtil
+ * @author: tuacy.
+ * @date: 2019/6/26.
+ * @version: 1.0
+ * @Description: 涓插彛宸ュ叿绫�
+ */
+@SuppressWarnings("unused")
+public class SerialPortUtil {
+
+	/**
+	 * 鑾峰緱绯荤粺鍙敤鐨勭鍙e悕绉板垪琛�(COM0銆丆OM1銆丆OM2绛夌瓑)
+	 *
+	 * @return List<String>鍙敤绔彛鍚嶇О鍒楄〃
+	 */
+	
+	   // 杈撳叆娴�
+    private static InputStream inputStream;
+    // 杈撳嚭娴�
+    private static OutputStream outputStream;
+    private static String data;
+    // 淇濆瓨涓插彛杩斿洖淇℃伅鍗佸叚杩涘埗
+    
+    private static String dataHex;
+
+	@SuppressWarnings("unchecked")
+	public static List<String> getSerialPortList() {
+		List<String> systemPorts = new ArrayList<>();
+		//鑾峰緱绯荤粺鍙敤鐨勭鍙�
+		Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
+		while (portList.hasMoreElements()) {
+			String portName = portList.nextElement().getName();//鑾峰緱绔彛鐨勫悕瀛�
+			systemPorts.add(portName);
+		}
+		return systemPorts;
+	}
+
+	/**
+	 * 鎵撳紑涓插彛
+	 *
+	 * @param serialPortName 涓插彛鍚嶇О
+	 * @return SerialPort 涓插彛瀵硅薄
+	 * @throws NoSuchPortException               瀵瑰簲涓插彛涓嶅瓨鍦�
+	 * @throws PortInUseException                涓插彛鍦ㄤ娇鐢ㄤ腑
+	 * @throws UnsupportedCommOperationException 涓嶆敮鎸佹搷浣滄搷浣�
+	 */
+	public static SerialPort openSerialPort(String serialPortName)
+			throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
+		SerialPortParameter parameter = new SerialPortParameter(serialPortName);
+		return openSerialPort(parameter);
+	}
+
+	/**
+	 * 鎵撳紑涓插彛
+	 *
+	 * @param serialPortName 涓插彛鍚嶇О
+	 * @param baudRate       娉㈢壒鐜�
+	 * @return SerialPort 涓插彛瀵硅薄
+	 * @throws NoSuchPortException               瀵瑰簲涓插彛涓嶅瓨鍦�
+	 * @throws PortInUseException                涓插彛鍦ㄤ娇鐢ㄤ腑
+	 * @throws UnsupportedCommOperationException 涓嶆敮鎸佹搷浣滄搷浣�
+	 */
+	public static SerialPort openSerialPort(String serialPortName, int baudRate)
+			throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
+		SerialPortParameter parameter =new SerialPortParameter(serialPortName, baudRate);
+		return openSerialPort(parameter);
+	}
+
+	/**
+	 * 鎵撳紑涓插彛
+	 *
+	 * @param serialPortName 涓插彛鍚嶇О
+	 * @param baudRate       娉㈢壒鐜�
+	 * @param timeout        涓插彛鎵撳紑瓒呮椂鏃堕棿
+	 * @return SerialPort 涓插彛瀵硅薄
+	 * @throws NoSuchPortException               瀵瑰簲涓插彛涓嶅瓨鍦�
+	 * @throws PortInUseException                涓插彛鍦ㄤ娇鐢ㄤ腑
+	 * @throws UnsupportedCommOperationException 涓嶆敮鎸佹搷浣滄搷浣�
+	 */
+	public static SerialPort openSerialPort(String serialPortName, int baudRate, int timeout)
+			throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
+		SerialPortParameter parameter = new SerialPortParameter(serialPortName, baudRate);
+		return openSerialPort(parameter, timeout);
+	}
+
+	/**
+	 * 鎵撳紑涓插彛
+	 *
+	 * @param parameter 涓插彛鍙傛暟
+	 * @return SerialPort 涓插彛瀵硅薄
+	 * @throws NoSuchPortException               瀵瑰簲涓插彛涓嶅瓨鍦�
+	 * @throws PortInUseException                涓插彛鍦ㄤ娇鐢ㄤ腑
+	 * @throws UnsupportedCommOperationException 涓嶆敮鎸佹搷浣滄搷浣�
+	 */
+	public static SerialPort openSerialPort(SerialPortParameter parameter)
+			throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
+		return openSerialPort(parameter, 2000);
+	}
+
+	/**
+	 * 鎵撳紑涓插彛
+	 *
+	 * @param parameter 涓插彛鍙傛暟
+	 * @param timeout   涓插彛鎵撳紑瓒呮椂鏃堕棿
+	 * @return SerialPort涓插彛瀵硅薄
+	 * @throws NoSuchPortException               瀵瑰簲涓插彛涓嶅瓨鍦�
+	 * @throws PortInUseException                涓插彛鍦ㄤ娇鐢ㄤ腑
+	 * @throws UnsupportedCommOperationException 涓嶆敮鎸佹搷浣滄搷浣�
+	 */
+	public static SerialPort openSerialPort(SerialPortParameter parameter, int timeout)
+			throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
+		//閫氳繃绔彛鍚嶇О寰楀埌绔彛
+		CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(parameter.getSerialPortName());
+		//鎵撳紑绔彛锛岋紙鑷畾涔夊悕瀛楋紝鎵撳紑瓒呮椂鏃堕棿锛�
+		CommPort commPort = portIdentifier.open(parameter.getSerialPortName(), timeout);
+		//鍒ゆ柇鏄笉鏄覆鍙�
+		if (commPort instanceof SerialPort) {
+			SerialPort serialPort = (SerialPort) commPort;
+			//璁剧疆涓插彛鍙傛暟锛堟尝鐗圭巼锛屾暟鎹綅8锛屽仠姝綅1锛屾牎楠屼綅鏃狅級
+			serialPort.setSerialPortParams(parameter.getBaudRate(), parameter.getDataBits(), parameter.getStopBits(), parameter.getParity());
+			ShowMessage.zidingyi(parameter.getSerialPortName()+"鎵撳紑鎴愬姛锛�");
+			//System.out.println("寮�鍚覆鍙f垚鍔燂紝涓插彛鍚嶇О锛�" + parameter.getSerialPortName());
+			return serialPort;
+		} else {
+			//鏄叾浠栫被鍨嬬殑绔彛
+			throw new NoSuchPortException();
+		}
+	}
+
+
+	
+	
+	/**
+	 * @throws Exception 
+	 * 鍏抽棴涓插彛
+	 * @author LinWenLi
+	 * @date 2018骞�7鏈�21鏃ヤ笅鍗�3:45:43
+	 * @Description: 鍏抽棴涓插彛
+	 * @param:       
+	 * @return: void      
+	 * @throws
+	 */
+    public static void closeSerialPort(SerialPort serialPort) throws Exception {
+        if (serialPort != null) {
+            serialPort.notifyOnDataAvailable(false);
+            serialPort.removeEventListener();
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                    inputStream = null;
+                } catch (IOException e) {
+                	ShowMessage.zidingyi("鍏抽棴杈撳叆娴佹椂鍙戠敓IO寮傚父");
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                    outputStream = null;
+                } catch (IOException e) {
+					ShowMessage.zidingyi("鍏抽棴杈撳叆娴佹椂鍙戠敓IO寮傚父");
+                }
+            }
+            serialPort.close();
+            serialPort = null;
+			ShowMessage.zidingyi("涓插彛鍏抽棴鎴愬姛");
+        }
+    }
+	
+	
+	
+	
+	
+    /**
+     * 鍙戦�佷俊鎭埌涓插彛
+     * @author LinWenLi
+     * @date 2018骞�7鏈�21鏃ヤ笅鍗�3:45:22
+     * @param: serialPort 涓插彛瀵硅薄      
+     * @return: data 鍙戦�佺殑鏁版嵁     
+     * @throws
+     */
+    public static  void sendData(SerialPort serialPort, byte[] data) {
+        try {
+            outputStream = serialPort.getOutputStream();
+            outputStream.write(data);
+            outputStream.flush();
+        } catch (NullPointerException e) {
+            try {
+				throw new Exception("鎵句笉鍒颁覆鍙�");
+			} catch (Exception e1) {
+				// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+				e1.printStackTrace();
+			}
+        } catch (IOException e) {
+            try {
+				throw new Exception("鍙戦�佷俊鎭埌涓插彛鏃跺彂鐢烮O寮傚父");
+			} catch (Exception e1) {
+				// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+				e1.printStackTrace();
+			}
+        }finally {
+			try {
+				if (outputStream != null) {
+					outputStream.close();
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+    }
+	
+	
+	
+	
+	
+	
+	
+	
+
+
+	
+	
+
+	/**
+	 * 璇诲彇涓插彛杩斿洖淇℃伅
+	 * @author LinWenLi
+	 * @date 2018骞�7鏈�21鏃ヤ笅鍗�3:43:04
+	 * @return: byte[]     
+	 */
+    public static byte[] readData(SerialPort serialPort) {
+    	byte[] bytes=null;
+    	try {
+			Thread.sleep(10);
+            inputStream = serialPort.getInputStream();
+            // 閫氳繃杈撳叆娴佸璞$殑available鏂规硶鑾峰彇鏁扮粍瀛楄妭闀垮害
+           bytes = new byte[inputStream.available()];
+            // 浠庣嚎璺笂璇诲彇鏁版嵁娴�
+            int len = 0;
+            while ((len = inputStream.read(bytes)) != -1) {// 鐩存帴鑾峰彇鍒扮殑鏁版嵁
+                data = new String(bytes, 0, len).trim();// 杞负鍗佸叚杩涘埗鏁版嵁
+                dataHex = Tools.Bytes2HexString(bytes);
+                inputStream.close();
+                inputStream = null;
+                break;
+            }
+        } catch (IOException e) {
+            try {
+            	SerialPortUtil.closeSerialPort(serialPort);            	
+				ShowMessage.zidingyi_24("涓插彛閫氫俊寮傚父宸插叧闂紒");
+				SerialPortUtil.getSerialPortList().clear();
+				System.exit(-1);
+			} catch (Exception e1) {
+				// TODO 鑷姩鐢熸垚鐨� catch 鍧�
+				e1.printStackTrace();
+			}
+        } catch (InterruptedException e) {
+            //throw new RuntimeException(e);
+        }
+        return bytes;
+    }
+
+
+	
+
+
+	/**
+	 * 缁欎覆鍙h缃洃鍚�
+	 *
+	 * @param serialPort serialPort 瑕佽鍙栫殑涓插彛
+	 * @param listener   SerialPortEventListener鐩戝惉瀵硅薄
+	 * @throws TooManyListenersException 鐩戝惉瀵硅薄澶
+	 */
+	public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws TooManyListenersException {
+		//缁欎覆鍙f坊鍔犱簨浠剁洃鍚�
+		
+		if(serialPort!=null) {
+
+		serialPort.addEventListener(listener);
+		//涓插彛鏈夋暟鎹洃鍚�
+		serialPort.notifyOnDataAvailable(true);
+		//涓柇浜嬩欢鐩戝惉
+		serialPort.notifyOnBreakInterrupt(true);
+		}
+	}
+	
+	
+
+
+}
+
diff --git a/src/tools/ChuanKou/Xmodem.java b/src/tools/ChuanKou/Xmodem.java
new file mode 100644
index 0000000..5e29af8
--- /dev/null
+++ b/src/tools/ChuanKou/Xmodem.java
@@ -0,0 +1,257 @@
+package tools.ChuanKou;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * XModem鍗忚
+ * 
+ * @author 
+ */
+@SuppressWarnings("all")
+public class Xmodem {
+
+	// 寮�濮�
+	private final byte SOH = 0x01;
+	// 缁撴潫
+	private final byte EOT = 0x04;
+	// 搴旂瓟
+	private final byte ACK = 0x06;
+	// 閲嶄紶
+	private final byte NAK = 0x15;
+	// 鏃犳潯浠剁粨鏉�
+	private final byte CAN = 0x18;
+
+	// 浠�128瀛楄妭鍧楃殑褰㈠紡浼犺緭鏁版嵁
+	private final int SECTOR_SIZE = 128;
+	// 鏈�澶ч敊璇紙鏃犲簲绛旓級鍖呮暟
+	private final int MAX_ERRORS = 10;
+
+	// 杈撳叆娴侊紝鐢ㄤ簬璇诲彇涓插彛鏁版嵁
+	private InputStream inputStream;
+	// 杈撳嚭娴侊紝鐢ㄤ簬鍙戦�佷覆鍙f暟鎹�
+	private OutputStream outputStream;
+
+	public Xmodem(InputStream inputStream, OutputStream outputStream) {
+		this.inputStream = inputStream;
+		this.outputStream = outputStream;
+	}
+
+	/**
+	 * 鍙戦�佹暟鎹�
+	 * 
+	 * @param filePath
+	 *            鏂囦欢璺緞
+	 */
+	public void send(final String filePath) {
+		new Thread() {
+			public void run() {
+				try {
+					// 閿欒鍖呮暟
+					int errorCount;
+					// 鍖呭簭鍙�
+					byte blockNumber = 0x01;
+					// 鏍¢獙鍜�
+					int checkSum;
+					// 璇诲彇鍒扮紦鍐插尯鐨勫瓧鑺傛暟閲�
+					int nbytes;
+					// 鍒濆鍖栨暟鎹紦鍐插尯
+					byte[] sector = new byte[SECTOR_SIZE];
+					// 璇诲彇鏂囦欢鍒濆鍖�
+					DataInputStream inputStream = new DataInputStream(
+							new FileInputStream(filePath));
+
+					while ((nbytes = inputStream.read(sector)) > 0) {
+						// 濡傛灉鏈�鍚庝竴鍖呮暟鎹皬浜�128涓瓧鑺傦紝浠�0xff琛ラ綈
+						if (nbytes < SECTOR_SIZE) {
+							for (int i = nbytes; i < SECTOR_SIZE; i++) {
+								sector[i] = (byte) 0xff;
+							}
+						}
+
+						// 鍚屼竴鍖呮暟鎹渶澶氬彂閫�10娆�
+						errorCount = 0;
+						while (errorCount < MAX_ERRORS) {
+							// 缁勫寘
+							// 鎺у埗瀛楃 + 鍖呭簭鍙� + 鍖呭簭鍙风殑鍙嶇爜 + 鏁版嵁鍖烘 + 鏍¢獙鍜�
+							putData(SOH);
+							putData(blockNumber);
+							putData(~blockNumber);
+							checkSum = CRC16.calc(sector) & 0x00ffff;
+							putChar(sector, (short) checkSum);
+							outputStream.flush();
+
+							// 鑾峰彇搴旂瓟鏁版嵁
+							byte data = getData();
+							// 濡傛灉鏀跺埌搴旂瓟鏁版嵁鍒欒烦鍑哄惊鐜紝鍙戦�佷笅涓�鍖呮暟鎹�
+							// 鏈敹鍒板簲绛旓紝閿欒鍖呮暟+1锛岀户缁噸鍙�
+							if (data == ACK) {
+								break;
+							} else {
+								++errorCount;
+							}
+						}
+						// 鍖呭簭鍙疯嚜澧�
+						blockNumber = (byte) ((++blockNumber) % 256);
+					}
+
+					// 鎵�鏈夋暟鎹彂閫佸畬鎴愬悗锛屽彂閫佺粨鏉熸爣璇�
+					boolean isAck = false;
+					while (!isAck) {
+						putData(EOT);
+						isAck = getData() == ACK;
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			};
+		}.start();
+	}
+
+	/**
+	 * 鎺ユ敹鏁版嵁
+	 * 
+	 * @param filePath
+	 *            鏂囦欢璺緞
+	 * @return 鏄惁鎺ユ敹瀹屾垚
+	 * @throws IOException
+	 *             寮傚父
+	 */
+	public boolean receive(String filePath) throws Exception {
+		// 閿欒鍖呮暟
+		int errorCount = 0;
+		// 鍖呭簭鍙�
+		byte blocknumber = 0x01;
+		// 鏁版嵁
+		byte data;
+		// 鏍¢獙鍜�
+		int checkSum;
+		// 鍒濆鍖栨暟鎹紦鍐插尯
+		byte[] sector = new byte[SECTOR_SIZE];
+		// 鍐欏叆鏂囦欢鍒濆鍖�
+		DataOutputStream outputStream = new DataOutputStream(
+				new FileOutputStream(filePath));
+
+		// 鍙戦�佸瓧绗锛孋RC鏂瑰紡鏍¢獙
+		putData((byte) 0x43);
+
+		while (true) {
+			if (errorCount > MAX_ERRORS) {
+				outputStream.close();
+				return false;
+			}
+
+			// 鑾峰彇搴旂瓟鏁版嵁
+			data = getData();
+			if (data != EOT) {
+				try {
+					// 鍒ゆ柇鎺ユ敹鍒扮殑鏄惁鏄紑濮嬫爣璇�
+					if (data != SOH) {
+						errorCount++;
+						continue;
+					}
+
+					// 鑾峰彇鍖呭簭鍙�
+					data = getData();
+					// 鍒ゆ柇鍖呭簭鍙锋槸鍚︽纭�
+					if (data != blocknumber) {
+						errorCount++;
+						continue;
+					}
+
+					// 鑾峰彇鍖呭簭鍙风殑鍙嶇爜
+					byte _blocknumber = (byte) ~getData();
+					// 鍒ゆ柇鍖呭簭鍙风殑鍙嶇爜鏄惁姝g‘
+					if (data != _blocknumber) {
+						errorCount++;
+						continue;
+					}
+
+					// 鑾峰彇鏁版嵁
+					for (int i = 0; i < SECTOR_SIZE; i++) {
+						sector[i] = getData();
+					}
+
+					// 鑾峰彇鏍¢獙鍜�
+					checkSum = (getData() & 0xff) << 8;
+					checkSum |= (getData() & 0xff);
+					// 鍒ゆ柇鏍¢獙鍜屾槸鍚︽纭�
+					int crc = CRC16.calc(sector);
+					if (crc != checkSum) {
+						errorCount++;
+						continue;
+					}
+
+					// 鍙戦�佸簲绛�
+					putData(ACK);
+					// 鍖呭簭鍙疯嚜澧�
+					blocknumber++;
+					// 灏嗘暟鎹啓鍏ユ湰鍦�
+					outputStream.write(sector);
+					// 閿欒鍖呮暟褰掗浂
+					errorCount = 0;
+
+				} catch (Exception e) {
+					e.printStackTrace();
+
+				} finally {
+					// 濡傛灉鍑洪敊鍙戦�侀噸浼犳爣璇�
+					if (errorCount != 0) {
+						putData(NAK);
+					}
+				}
+			} else {
+				break;
+			}
+		}
+
+		// 鍏抽棴杈撳嚭娴�
+		outputStream.close();
+		// 鍙戦�佸簲绛�
+		putData(ACK);
+
+		return true;
+	}
+
+	/**
+	 * 鑾峰彇鏁版嵁
+	 * 
+	 * @return 鏁版嵁
+	 * @throws IOException
+	 *             寮傚父
+	 */
+	private byte getData() throws IOException {
+		return (byte) inputStream.read();
+	}
+
+	/**
+	 * 鍙戦�佹暟鎹�
+	 * 
+	 * @param data
+	 *            鏁版嵁
+	 * @throws IOException
+	 *             寮傚父
+	 */
+	private void putData(int data) throws IOException {
+		outputStream.write((byte) data);
+	}
+
+	/**
+	 * 鍙戦�佹暟鎹�
+	 * 
+	 * @param data
+	 *            鏁版嵁
+	 * @param checkSum
+	 *            鏍¢獙鍜�
+	 * @throws IOException
+	 *             寮傚父
+	 */
+	private void putChar(byte[] data, short checkSum) throws IOException {
+		ByteBuffer bb = ByteBuffer.allocate(data.length + 2).order(
+				ByteOrder.BIG_ENDIAN);
+		bb.put(data);
+		bb.putShort(checkSum);
+		outputStream.write(bb.array());
+	}
+}
\ No newline at end of file
diff --git a/src/tools/CustomProgressBar.java b/src/tools/CustomProgressBar.java
new file mode 100644
index 0000000..4b8eea4
--- /dev/null
+++ b/src/tools/CustomProgressBar.java
@@ -0,0 +1,45 @@
+package tools;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class CustomProgressBar extends JProgressBar {
+    private Color textColor = Color.BLACK; // 榛樿鏂囨湰棰滆壊
+
+    public CustomProgressBar() {
+        super();
+        setStringPainted(true); // 鍏佽鏄剧ず鏂囨湰
+    }
+
+    public void setTextColor(Color textColor) {
+        this.textColor = textColor;
+    }
+
+    @Override
+    protected void paintComponent(Graphics g) {
+        // 鍏堣皟鐢ㄧ埗绫荤殑paintComponent锛岀粯鍒惰繘搴︽潯鐨勮儗鏅拰鍓嶆櫙
+        super.paintComponent(g);
+
+        if (isStringPainted()) {
+            // 鑾峰彇杩涘害鐧惧垎姣旂殑鏂囨湰
+            String text = String.format("%d%%", (int)(getPercentComplete() * 100));
+            Graphics2D g2d = (Graphics2D) g;
+
+            // 鑾峰彇鏂囨湰鍖哄煙鐨勭煩褰㈠尯鍩�
+            FontMetrics metrics = g2d.getFontMetrics();
+            int x = (getWidth() - metrics.stringWidth(text)) / 2;
+            int y = (getHeight() + metrics.getAscent()) / 2;
+
+            // 娓呴櫎鏂囨湰鍖哄煙锛岄伩鍏嶉噸褰�
+            g2d.setColor(getBackground()); // 浣跨敤鑳屾櫙鑹叉潵娓呴櫎鍖哄煙
+            g2d.fillRect(x, y - metrics.getAscent(), metrics.stringWidth(text), metrics.getHeight());
+
+            // 璁剧疆鏂囨湰棰滆壊鍜屽瓧浣�
+            g2d.setColor(textColor);
+            g2d.setFont(getFont().deriveFont(Font.BOLD));
+
+            // 缁樺埗鏂囨湰
+            g2d.drawString(text, x, y);
+        }
+    }
+}
diff --git a/src/tools/GetNowTime.java b/src/tools/GetNowTime.java
new file mode 100644
index 0000000..6c35ed5
--- /dev/null
+++ b/src/tools/GetNowTime.java
@@ -0,0 +1,56 @@
+package tools;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class GetNowTime {
+
+    public static String now() {//鑾峰彇鏃堕棿鏂规硶
+        String msg="";
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
+        msg+="["+sdf.format(date)+"]";
+        return msg;
+
+    }
+
+    /**鑾峰彇骞存湀鏃ユ椂鍒嗙姣鏃堕棿 2020-05-30 12:33:45.23*/
+    public static String timestamp2() {
+        String d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(Calendar.getInstance().getTime());
+        d="["+d+"]";
+        return d;
+    }
+
+
+    public static int timestamp() {
+
+        int time=0;
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+        String inputString =sss();
+        Date date = null;
+        try {
+            date = sdf.parse("1970-01-01 " + inputString);
+        } catch (ParseException e) {
+            // TODO 鑷姩鐢熸垚鐨� catch 鍧�
+            e.printStackTrace();
+        }
+
+        time=(int) date.getTime();
+        return time;
+    }
+
+    /**鑾峰彇姣鏃堕棿鎴�21:49:27.519*/
+    public static String sss() {//鑾峰彇鏃堕棿鏂规硶
+        String msg="";
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
+        msg+=sdf.format(date);
+        return msg;
+
+    }
+
+
+}
diff --git a/src/tools/Jiaoyan.java b/src/tools/Jiaoyan.java
new file mode 100644
index 0000000..4a70f81
--- /dev/null
+++ b/src/tools/Jiaoyan.java
@@ -0,0 +1,109 @@
+package tools;
+import java.math.BigInteger;
+
+public class Jiaoyan {
+	
+	/**鑾峰彇鏍¢獙鐮侀櫎鍘诲寘澶寸浉鍔犲彇鍙�*/
+	public static byte[] check(byte[] byt) {
+		
+		//瀛楄妭鏁扮粍杞负16杩涘埗瀛楃涓�/2鍚庣殑闀垮害
+		int size=BinaryToHexString2(byt).length()/2;
+		String[] hex=hex(BinaryToHexString2(byt));
+		
+		//姹傚拰
+		int sum=0;
+		for(int i=0;i<size;i++) {
+			sum+=decodeHEX(hex[i]);
+		}
+		
+		//鍙栧弽杞负16杩涘埗瀛楃涓�
+		String hex16=Integer.toHexString(~sum);
+		
+		//瀛楃涓茬殑闀垮害
+		int lenth=hex16.length();		
+		
+		byte[] jiaoyan=hexStringToByteArray(hex16.substring(lenth-4, lenth));
+		
+		return jiaoyan;		
+		
+	}
+	
+	
+	/**鑾峰彇鏍¢獙鐮侀櫎鍘诲寘澶寸浉鍔犲彇鍙�*/
+	public static String check2(String byt) {
+		
+		//瀛楄妭鏁扮粍杞负16杩涘埗瀛楃涓�/2鍚庣殑闀垮害
+		int size=byt.length()/2;
+		String[] hex=hex(byt);
+		
+		//姹傚拰
+		int sum=0;
+		for(int i=2;i<size-2;i++) {
+			sum+=decodeHEX(hex[i]);
+		}
+		
+		//鍙栧弽杞负16杩涘埗瀛楃涓�
+		String hex16=Integer.toHexString(~sum);
+		
+		//瀛楃涓茬殑闀垮害
+		int lenth=hex16.length();		
+		
+		String jiaoyan=hex16.substring(lenth-4, lenth);
+		
+		return jiaoyan.toUpperCase();		
+		
+	}
+	
+	/**16杩涘埗杞负10杩涘埗*/
+	public static int decodeHEX(String hexs){
+		BigInteger bigint=new BigInteger(hexs, 16);
+		int numb=bigint.intValue();
+		return numb;
+
+	}
+	
+	/**灏�16杩涘埗瀛楃涓茶浆涓篽ex瀛楃涓叉暟缁�2涓瓧绗︿覆涓�涓�*/
+	public static String[] hex(String message) {
+		int size=message.length()/2;		
+		String[] hex=new String[size];
+		for(int i=0;i<size;i++) {
+			hex[i]=message.substring(i*2, 2+i*2);
+		}
+		
+		return hex;
+	}
+	
+	
+	/**灏嗗瓧鑺傛暟缁勮浆鎹负16杩涘埗瀛楃涓叉棤绌烘牸*/
+	public static  String BinaryToHexString2(byte[] bytes) {
+		String hexStr = "0123456789ABCDEF";
+		String result = "";
+		String hex = "";
+		for (byte b : bytes) {
+			hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
+			hex += String.valueOf(hexStr.charAt(b & 0x0F));
+			result += hex + "";
+		}
+		return result;
+	}
+	
+	
+	/**
+     * 16杩涘埗琛ㄧず鐨勫瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
+    *
+    * @param hexString 16杩涘埗琛ㄧず鐨勫瓧绗︿覆
+    * @return byte[] 瀛楄妭鏁扮粍
+    */
+   public static byte[] hexStringToByteArray(String hexString) {
+       hexString = hexString.replaceAll(" ", "");
+       int len = hexString.length();
+       byte[] bytes = new byte[len / 2];
+       for (int i = 0; i < len; i += 2) {
+           // 涓や綅涓�缁勶紝琛ㄧず涓�涓瓧鑺�,鎶婅繖鏍疯〃绀虹殑16杩涘埗瀛楃涓诧紝杩樺師鎴愪竴涓瓧鑺�
+           bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
+                   .digit(hexString.charAt(i+1), 16));
+       }
+       return bytes;
+   }
+
+}
diff --git a/src/tools/Judge/JugeIn.java b/src/tools/Judge/JugeIn.java
new file mode 100644
index 0000000..0d767f2
--- /dev/null
+++ b/src/tools/Judge/JugeIn.java
@@ -0,0 +1,24 @@
+package tools.Judge;
+
+
+import tools.ShowMessage;
+
+
+
+public class JugeIn {
+
+	/**鍒ゆ柇杈撳叆鏄惁鍚堟硶锛屽杈撳叆涓簁ong*/
+	public static  boolean shuru(String name,String str) {
+		boolean inru=true;
+		
+		if(str.length()<1) {
+			ShowMessage.zidingyi(name+"涓嶈兘涓虹┖...");
+			inru=false;
+		}else if(!JugeNumber.isDigit(str)) {
+			ShowMessage.zidingyi(name+"杈撳叆鍐呭鍙兘涓烘暣鏁�...");
+			inru=false;
+		}
+		
+		return inru;		
+	}
+}
diff --git a/src/tools/Judge/JugeNumber.java b/src/tools/Judge/JugeNumber.java
new file mode 100644
index 0000000..c5d7694
--- /dev/null
+++ b/src/tools/Judge/JugeNumber.java
@@ -0,0 +1,136 @@
+package tools.Judge;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class JugeNumber {
+
+	// 绾暟瀛�
+	private static String DIGIT_REGEX = "^-?\\d+$";
+	
+	// 鍚湁鏁板瓧
+	private static String CONTAIN_DIGIT_REGEX = ".*[0-9].*";
+	
+	// 绾瓧姣�
+	private static String LETTER_REGEX = "[a-zA-Z]+";
+	
+	// 鍖呭惈瀛楁瘝
+	private static String CONTAIN_LETTER_REGEX = ".*[a-zA-z].*";
+	
+	// 绾腑鏂�
+	private static String CHINESE_REGEX = "[\u4e00-\u9fa5]";
+	
+	// 浠呬粎鍖呭惈瀛楁瘝鍜屾暟瀛�
+	private static String LETTER_DIGIT_REGEX = "^[a-z0-9A-Z]+$";
+	
+	private static String CHINESE_LETTER_REGEX = "([\u4e00-\u9fa5]+|[a-zA-Z]+)";
+	
+	private static String CHINESE_LETTER_DIGIT_REGEX = "^[a-z0-9A-Z\u4e00-\u9fa5]+$";
+	
+
+
+
+
+	/*鏂规硶浜岋細鎺ㄨ崘锛岄�熷害鏈�蹇�
+	 * 鍒ゆ柇鏄惁涓烘暣鏁� 
+	 * @param str 浼犲叆鐨勫瓧绗︿覆 
+	 * @return 鏄暣鏁拌繑鍥瀟rue,鍚﹀垯杩斿洖false 
+	 */
+	public static boolean isInteger(String str) {  
+		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");  
+		return pattern.matcher(str).matches();  
+	}
+
+	/** 鍒ゆ柇瀛楃涓叉槸鍚︿粎鍚湁鏁板瓧鍜屽瓧姣�*/
+	public static boolean isLetterDigit(String str) {
+		return str.matches(LETTER_DIGIT_REGEX);
+	}
+	
+	
+	/**
+	 * 鏄惁涓烘眽瀛楋紝涓嶅寘鎷爣鐐圭鍙�
+	 *
+	 * @param con
+	 * @return true 鏄眽瀛�
+	 */
+	public static boolean isChinese(String con) {
+		Pattern pattern = Pattern.compile(CHINESE_REGEX);
+		for (int i = 0; i < con.length(); i = i + 1) {
+			if (!pattern.matcher(
+					String.valueOf(con.charAt(i))).find()) {
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	
+	/**
+	 * 鐢ㄦ鍒欒〃杈惧紡鍒ゆ柇瀛楃涓蹭腑鏄惁 浠呭寘鍚嫳鏂囧瓧姣嶃�佹暟瀛楀拰姹夊瓧
+	 *
+	 * @param str
+	 * @return
+	 */
+	public static boolean isLetterDigitOrChinese(String str) {
+		return str.matches(CHINESE_LETTER_DIGIT_REGEX);
+	}
+	
+	
+	/**
+	 * 濮撳悕涓彲鍖呭惈姹夊瓧鍜屽瓧姣嶏紝鏃犲叾瀹冨瓧绗�
+	 *
+	 * @param passengerName
+	 * @return
+	 */
+	public static boolean checkChineseLetter(String passengerName) {
+		Pattern pattern = Pattern.compile(CHINESE_LETTER_REGEX);
+		Matcher matcher = pattern.matcher(passengerName);
+		if (matcher.matches()) {
+			//涓嶅寘鍚壒娈婂瓧绗�
+			return true;
+		} else {
+			//鍖呭惈浜嗙壒娈婂瓧绗�
+			return false;
+		}
+	}
+	/**
+	 * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁鍖呭惈鏍囩偣绗﹀彿锛堜腑鏂囨垨鑰呰嫳鏂囨爣鐐圭鍙凤級锛宼rue 鍖呭惈銆�<br/>
+	 * 鍘熺悊锛氬鍘熷瓧绗︿覆鍋氫竴娆℃竻娲楋紝娓呮礂鎺夋墍鏈夋爣鐐圭鍙枫��<br/>
+	 * 姝ゆ椂锛屽鏋滃叆鍙� ret 鍖呭惈鏍囩偣绗﹀彿锛岄偅涔堟竻娲楀墠鍚庡瓧绗︿覆闀垮害涓嶅悓锛岃繑鍥瀟rue锛涘惁鍒欙紝闀垮害鐩哥瓑锛岃繑鍥瀎alse銆�<br/>
+	 *
+	 * @param ret
+	 * @return true 鍖呭惈涓嫳鏂囨爣鐐圭鍙�
+	 */
+	public static boolean checkPunctuation(String ret) {
+		boolean b = false;
+		String tmp = ret;
+		//        replaceAll閲岄潰鐨勬鍒欏尮閰嶅彲浠ユ竻绌哄瓧绗︿覆涓殑涓嫳鏂囨爣鐐圭鍙凤紝鍙繚鐣欐暟瀛椼�佽嫳鏂囧拰涓枃銆�
+		tmp = tmp.replaceAll("\\p{P}", "");
+		if (ret.length() != tmp.length()) {
+			b = true;
+		}
+		return b;
+	}
+	
+	/**鍒ゆ柇瀛楃涓叉槸鍚︿负绾暟瀛�*/
+	public static boolean isDigit(String ret) {
+		return ret.matches(DIGIT_REGEX);
+	}
+	
+	public static boolean isLetter(String ret) {
+		
+		return ret.matches(LETTER_REGEX);
+	}
+	
+	public static boolean hasDigit(String ret) {
+		return ret.matches(CONTAIN_DIGIT_REGEX);
+	}
+	
+	/**鍒ゆ柇鏄惁鍖呭惈瀛楁瘝*/
+	public static boolean hasLetter(String ret) {
+		return ret.matches(CONTAIN_LETTER_REGEX);
+	}
+
+
+}
\ No newline at end of file
diff --git a/src/tools/ShowMessage.java b/src/tools/ShowMessage.java
new file mode 100644
index 0000000..65feb2d
--- /dev/null
+++ b/src/tools/ShowMessage.java
@@ -0,0 +1,21 @@
+package tools;
+
+public class ShowMessage {
+	
+
+	/**鑷畾涔夌殑鍐呭鎻愮ず*/
+	public static void zidingyi(String zidingyi) {
+		AutoCloseDialog.getDialog(zidingyi);
+	}
+	
+	/**杞欢璇曠敤鏈熺粨鏉�*/
+	public static void zhuce_off() {
+		AutoCloseDialog.getDialogno("杞欢璇曠敤鏈熷凡缁撴潫锛屽闇�缁х画浣跨敤璇峰悜鍖椾含鍗庢槦鏅烘帶鍏徃璐拱娉ㄥ唽鐮侊紒");
+	}
+	
+	/**24灏忔椂娑堝け鐨勫璇濇*/
+	public static void zidingyi_24(String str) {
+		AutoCloseDialog.getDialogno(str);
+	}
+
+}
diff --git a/src/tools/Tools.java b/src/tools/Tools.java
new file mode 100644
index 0000000..a9d73bf
--- /dev/null
+++ b/src/tools/Tools.java
@@ -0,0 +1,223 @@
+package tools;
+
+import java.math.BigInteger;
+
+@SuppressWarnings("unused")
+public class Tools {
+		
+	
+	
+	/**
+	 * 将十六进制的字符串转换成字节数组
+	 *
+	 * @param hexString
+	 * @return
+	 */
+	public static byte[] hexStrToBinaryStr(String hexString) {
+		
+ 
+		if (hexString==null) {
+			return null;
+		}
+ 
+		hexString = hexString.replaceAll(" ", "");
+ 
+		int len = hexString.length();
+		int index = 0;
+ 
+ 
+		byte[] bytes = new byte[len / 2];
+ 
+		while (index < len) {
+ 
+			String sub = hexString.substring(index, index + 2);
+			bytes[index/2] = (byte)Integer.parseInt(sub,16);
+			index += 2;
+		}
+ 
+ 
+		return bytes;
+	}
+	
+	/**
+	 * 将十六进制的字符串转换成字节数组不去除空格
+	 *
+	 * @param hexString
+	 * @return
+	 */
+	public static byte[] hexStrToBinaryStr2(String hexString) {
+		 
+		if (hexString==null) {
+			return null;
+		} 
+		
+		int len = hexString.length();
+		
+		int index = 0;
+ 
+ 
+		byte[] bytes = new byte[len / 2];
+ 
+		while (index < len) {
+			String sub = hexString.substring(index, index + 2);
+			bytes[index/2] = (byte)Integer.parseInt(sub,16);
+			index += 2;
+		}
+ 
+ 
+		return bytes;
+	}
+	
+	
+	
+	 public static final int registersToInt(byte[] bytes) {
+		    return (
+		        ((bytes[0] & 0xff) << 24) |
+		        ((bytes[1] & 0xff) << 16) |
+		        ((bytes[2] & 0xff) << 8) |
+		        (bytes[3] & 0xff)
+		        );
+		  }//registersToInt
+
+
+	// hex转ASCII
+	public static String hexToAscii(String hex) {
+		StringBuilder ascii = new StringBuilder();
+		// 去除 HEX 字符串中的空格
+		hex = hex.replaceAll(" ", "");
+
+		// 每两个字符为一组,转换为对应的字节并拼接成 ASCII 字符
+		for (int i = 0; i < hex.length(); i += 2) {
+			// 直接使用 charAt 获取每两个字符的十六进制数字
+			char hexChar1 = hex.charAt(i);
+			char hexChar2 = hex.charAt(i + 1);
+
+			// 组合十六进制字符为一个数字
+			int decimalValue = (Character.digit(hexChar1, 16) << 4) + Character.digit(hexChar2, 16);
+
+			// 转换为对应的 ASCII 字符并添加到结果中
+			ascii.append((char) decimalValue);
+		}
+
+		return ascii.toString();  // 返回拼接后的 ASCII 字符串
+	}
+
+
+
+	public static String byteToAscii(byte[] bytes) {
+		// 将字节数组转换为 ASCII 字符串
+		String asciiString = new String(bytes, java.nio.charset.StandardCharsets.US_ASCII);
+		return asciiString;
+	}
+
+	/**将字节数组转为16进制字符串*/ 
+	 public static String Bytes2HexString(byte[] b) { 
+		   String ret = ""; 
+		   for (int i = 0; i < b.length; i++) { 
+			     String hex = Integer.toHexString(b[i] & 0xFF); 
+			     if (hex.length() == 1) { 
+			       hex = '0' + hex; 
+				     } 
+			     ret += hex.toUpperCase(); 
+			   }
+		return ret;
+	   }
+
+
+
+
+
+
+
+	 public static final float registersToFloat(byte[] bytes) {
+		    return Float.intBitsToFloat((
+		        ((bytes[0] & 0xff) << 24) |
+		        ((bytes[1] & 0xff) << 16) |
+		        ((bytes[2] & 0xff) << 8) |
+		        (bytes[3] & 0xff)
+		        ));
+		  }//
+	 @SuppressWarnings("unused")
+	private static String intToHex(int n) {
+	        StringBuffer s = new StringBuffer();
+	        String a;
+	        char []b = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+	        while(n != 0){
+	            s = s.append(b[n%16]);
+	            n = n/16;            
+	        }
+	        a = s.reverse().toString();
+	        return a;
+	    }
+	 
+	 //将返回的数据转化为10进制数据
+	 public static int ormntoint(byte[] bytes){
+		 int aa=0;
+		 aa=bytes[0]-48 +(bytes[1]-48)*10+(bytes[2]-48)*100+(bytes[3]-48)*1000;
+		 return aa;
+	 }
+
+
+	/**
+	 * 16进制的字符串表示转成字节数组
+	 *
+	 * @param hexString 16进制格式的字符串
+	 * @return 转换后的字节数组
+	 **/
+	public static byte[] toByteArray(String hexString) {
+		byte[] byteArray=null;
+		if(hexString !=null || hexString !="") {
+			hexString = hexString.replaceAll(" ", "");
+			byteArray = new byte[hexString.length() / 2];
+			int k = 0;
+			for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
+				byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
+				byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
+				byteArray[i] = (byte) (high << 4 | low);
+				k += 2;
+			}
+		}
+		return byteArray;
+	}
+
+
+	public static  byte[] intToRegisters(int v) {
+		byte[] registers = new byte[4];
+		registers[0] = (byte) (0xff & (v >> 24));
+		registers[1] = (byte) (0xff & (v >> 16));
+		registers[2] = (byte) (0xff & (v >> 8));
+		registers[3] = (byte) (0xff & v);
+		return registers;
+	}
+
+
+
+	//转成字节数组
+	public static String[] hex(String message) {
+		int size=message.length()/2;
+		String[] hex=new String[size];
+		for(int i=0;i<size;i++) {
+			hex[i]=message.substring(i*2, 2+i*2);
+		}
+
+		return hex;
+	}
+
+
+	/**
+	 * 16进制转为10进制
+	 */
+	public static int decodeHEX(String hexs) {
+		BigInteger bigint = new BigInteger(hexs, 16);
+		int numb = bigint.intValue();
+		return numb;
+	}
+
+	public static byte decodeHEXToInt8(String hexStr) {
+		BigInteger bigInt = new BigInteger(hexStr, 16);
+		// 将无符号整数转换为有符号的8位整数
+		byte result = bigInt.byteValue();
+		return result;
+	}
+}
+
diff --git a/src/ymodem/CRC16.java b/src/ymodem/CRC16.java
new file mode 100644
index 0000000..0849b36
--- /dev/null
+++ b/src/ymodem/CRC16.java
@@ -0,0 +1,76 @@
+package ymodem;
+
+import java.util.Arrays;
+
+/**
+ * Uses table for irreducible polynomial:  1 + x^2 + x^15 + x^16
+ */
+
+public class CRC16 {
+    private static int[] table = {
+        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
+        0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
+        0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
+        0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
+        0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
+        0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
+        0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
+        0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
+        0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
+        0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
+        0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
+        0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
+        0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
+        0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
+        0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
+        0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
+        0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
+        0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
+        0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
+        0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
+        0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
+        0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+        0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
+        0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
+        0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
+        0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
+        0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
+        0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
+        0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
+        0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
+        0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
+        0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
+    };
+
+    public static int getCRCLength() {
+        return 2;
+    }
+
+    public static long calcCRC(byte[] block) {
+        int crc = 0x0000;
+        for (byte b : block) {
+            crc = ((crc << 8) ^ table[((crc >> 8) ^ (0xff & b))]) & 0xFFFF;
+        }
+
+        return crc;
+    }
+    
+    public static byte[] getCRC16(byte[] block) {
+    	byte[] crcBytes = new byte[getCRCLength()];
+		long crcValue = calcCRC(block);
+		for (int i = 0; i < getCRCLength(); i++) {
+			crcBytes[getCRCLength() - i - 1] = (byte) ((crcValue >> (8 * i)) & 0xFF);
+		}
+		return crcBytes;
+    }
+    
+    public static byte[] getCRC16(byte[] block,int start) {
+    	byte[] crcBytes = new byte[getCRCLength()];
+		long crcValue = calcCRC(Arrays.copyOfRange(block, start, block.length-2));
+		for (int i = 0; i < getCRCLength(); i++) {
+			crcBytes[getCRCLength() - i - 1] = (byte) ((crcValue >> (8 * i)) & 0xFF);
+		}
+		return crcBytes;
+    }
+       
+}
diff --git a/src/ymodem/YModemUpgradeThread.java b/src/ymodem/YModemUpgradeThread.java
new file mode 100644
index 0000000..8527b91
--- /dev/null
+++ b/src/ymodem/YModemUpgradeThread.java
@@ -0,0 +1,145 @@
+package ymodem;
+
+import gnu.io.SerialPort;
+import index.JPanelMoudle.showDataComp;
+import index.JPanelMoudle.versionUpgradeComp;
+import tools.ChuanKou.SerialPortUtil;
+import tools.ShowMessage;
+import tools.Tools;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class YModemUpgradeThread extends Thread {
+
+    private static byte[][] dataBytes; // 鏁版嵁甯�
+    private static byte[] startBytes; // 璧峰甯�
+    private static byte[] endBytes ; // 缁撴潫甯�
+    private static final long TIMEOUT = 30000; // 瓒呰繃30绉掓湭鍥炲簲鍒欓��鍑哄崌绾фā寮�
+    private static SerialPort serialPort;
+  
+    static int numSend = 0;
+    static boolean SendDataFlag = false;
+
+
+    public static void shengji(SerialPort serialPort1, String filePath1,byte[] byt){
+        SendDataFlag=false;
+        numSend=0;
+        serialPort = serialPort1;
+        SerialPortUtil.sendData(serialPort, byt);
+        ComSendUpdateFile(filePath1);
+        chushihua();
+    }
+    
+    // 鏋勯�犲嚱鏁帮紝鎺ユ敹涓插彛鍜屾枃浠惰矾寰�
+    public static void chushihua() {
+        if (versionUpgradeComp.isWrite()) {
+            if (serialPort == null) {
+                return;
+            } else {
+                new YModemUpgradeThread().startThread();
+            }
+        }
+    }
+
+    public void startThread() {
+        Thread t = new Thread(this);
+        t.start();
+    }
+
+    public void run() {
+        try {
+            // 璋冪敤鍗囩骇杩囩▼
+            upgtade();
+        } catch (Exception e) {
+            Thread.currentThread().interrupt(); // 鎭㈠涓柇鏍囧織
+            System.out.println("绾跨▼琚腑鏂紝姝e湪閫�鍑哄崌绾ц繃绋�...");
+            e.printStackTrace();
+        }
+    }
+
+    //鍗囩骇鍥轰欢
+    private void upgtade(){
+        long startTime = System.currentTimeMillis();
+        long l = System.currentTimeMillis() - startTime;
+        boolean b =  l< TIMEOUT;
+        while (b&&!SendDataFlag) {
+            b=System.currentTimeMillis()-startTime<TIMEOUT;
+            // 绛夊緟鍥炲簲
+            byte[] response = SerialPortUtil.readData(serialPort);
+            // 濡傛灉璁惧娌℃湁鍥炲簲锛堝洖搴斾负绌猴級,鍒欒涓烘槸瓒呮椂
+            if (response == null || response.length == 0) {
+                continue;  // 濡傛灉娌℃湁鍥炲簲锛岀户缁瓑寰�
+            }
+            showDataComp.addAreaTextMes(response,"127.0.0.1",9999);
+            if (response[0] == ymodem.ACK) {
+                numSend++;
+                sendData(numSend);
+            } else if (response[0] == ymodem.NAK || response[0] == ymodem.C) {
+                // 鏀跺埌NAK鎴朇A锛岄��鍑哄崌绾�
+                sendData(numSend);
+            }else if (response[0]==ymodem.CA){
+                break;
+            }
+        }
+        if (!b){
+            ShowMessage.zidingyi("鏁版嵁鎺ユ敹瓒呮椂,閫�鍑哄崌绾фā寮�");
+        }
+        versionUpgradeComp.exitUpgrade();
+    }
+
+
+    //鍙戦�佹暟鎹寘
+    public static void sendData(int shuJuZhen) {
+        int length = dataBytes.length;
+        if (shuJuZhen == 0) {
+            SerialPortUtil.sendData(serialPort, startBytes);
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen <= length && shuJuZhen > 0) {
+            SerialPortUtil.sendData(serialPort, dataBytes[shuJuZhen - 1]);
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen == length + 1||shuJuZhen == length + 2) {
+            SerialPortUtil.sendData(serialPort,new byte[]{(byte) ymodem.EOT});
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen == length + 3) {
+            SerialPortUtil.sendData(serialPort,endBytes);
+            getProgress(shuJuZhen, length);
+            ShowMessage.zidingyi("鍗囩骇瀹屾垚");
+            SendDataFlag=true;
+            numSend = 0;
+        }
+    }
+
+    //璁$畻褰撳墠鍖呯殑杩涘害
+    private static void getProgress(double shuJuZhen, int length) {
+        int i =(int) Math.round((shuJuZhen / (length +3)) * 100);
+        versionUpgradeComp.getJindu_SaoMiaoQi().setValue(i);
+    }
+
+    //鑾峰彇瑕佸彂閫佺殑甯ф暟鎹�
+    public static void ComSendUpdateFile(String filePath){
+        try {
+            File file = new File(filePath);
+            if (!file.exists()) {                                //濡傛灉鏂囦欢涓嶅瓨鍦�
+                ShowMessage.zidingyi("鏂囦欢涓嶅瓨鍦�" + filePath);        //鎶涘嚭鏂囦欢鎵句笉鍒板紓甯�
+                return;
+            }
+            getFilesDataBytes.setNum(0);
+            startBytes = getFilesDataBytes.getStartData(file);//鑾峰彇璧峰甯ф暟鎹寘
+            dataBytes = getFilesDataBytes.getData(file);//鑾峰彇鏁版嵁甯ф暟鎹寘
+            endBytes = getFilesDataBytes.getEndData();//鑾峰彇缁撴潫甯ф暟鎹寘
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static boolean isSendDataFlag() {
+        return SendDataFlag;
+    }
+
+    public static void setSendDataFlag(boolean sendDataFlag) {
+        SendDataFlag = sendDataFlag;
+    }
+}
diff --git a/src/ymodem/getFilesDataBytes.java b/src/ymodem/getFilesDataBytes.java
new file mode 100644
index 0000000..dfe1ddb
--- /dev/null
+++ b/src/ymodem/getFilesDataBytes.java
@@ -0,0 +1,127 @@
+package ymodem;
+
+
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public class getFilesDataBytes {
+    public static final int SOH = 0x01; // 128瀛楄妭鏁版嵁鍖�
+    public static final int STX = 0x02; // 1024瀛楄妭鏁版嵁鍖�
+    private static int num = 0;  // 甯у簭鍙�
+
+    // 鑾峰彇鏂囦欢鐨勮捣濮嬫暟鎹寘
+    public static byte[] getStartData(File file) {
+        int index = 0;
+        byte[] dat = new byte[133];
+        byte[] nameBytes = file.getName().getBytes();
+        byte[] lengthBytes = String.valueOf(file.length()).getBytes();
+        dat[index++] = SOH;
+        dat[index++] = (byte) num++;
+        dat[index++] = (byte) ~dat[1];
+        // 缁勫悎鏂囦欢鍚嶆暟鎹�
+        for (int i = 0; i < nameBytes.length; i++) {
+            dat[i + index] = nameBytes[i];
+        }
+        index += nameBytes.length;
+        dat[index++] = 0x00;
+        // 缁勫悎鏂囦欢闀垮害鏁版嵁
+        for (int i = 0; i < lengthBytes.length; i++) {
+            dat[i + index] = lengthBytes[i];
+        }
+        index += lengthBytes.length;
+        dat[index++] = 0x00;
+        byte[] crcDat = CRC16.getCRC16(dat, 3);
+        dat[dat.length - 2] = crcDat[0];
+        dat[dat.length - 1] = crcDat[1];
+        return dat;
+    }
+
+    // 鑾峰彇缁撴潫甯ф暟鎹�
+    public static byte[] getEndData() {
+        byte[] dat = new byte[133];
+        dat[0] = SOH;
+        dat[1] = (byte) 0x00;
+        dat[2] = (byte) 0xFF;
+        byte[] crcDat = CRC16.getCRC16(dat, 3);
+        dat[dat.length - 2] = crcDat[0];
+        dat[dat.length - 1] = crcDat[1];
+        return dat;
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁甯ф暟鎹�
+     *
+     * @param file 鏂囦欢
+     * @return 鏁版嵁甯ф暟缁�
+     * @throws IOException
+     */
+    public static byte[][] getData(File file) throws IOException {
+        long len = file.length();
+        int size = (int) Math.ceil(len / 1024d);
+        int size1 = (int) Math.ceil(len / 1024d);
+        double v = len % 1024d;
+        if (v==0){
+            int i = size + 1;
+            size1=i;
+        }
+        //鑾峰彇鏁版嵁甯т釜鏁�
+        byte[][] result = new byte[size][1029];
+        FileInputStream fis = new FileInputStream(file);
+        for (int i = 0; i < size1-1 ; i++) {            //鐢熸垚鏁版嵁甯�
+            result[i][0] = STX;                        //1024瀛楄妭鏁版嵁鍖呭ご
+            result[i][1] = (byte) (num++);            //鑷姩濉厖甯у簭鍙�
+            if (num > 255) {                        //甯у簭鍙锋渶澶�255
+                num = 0;
+            }
+            result[i][2] = (byte) ~result[i][1];        //鍙栧弽甯у簭鍙�
+            fis.read(result[i], 3, 1024);
+            byte[] crc16 = CRC16.getCRC16(result[i], 3);    //鑾峰彇crc16鏍¢獙
+            result[i][result[i].length - 2] = crc16[0];
+            result[i][result[i].length - 1] = crc16[1];    //濉厖crc16鏍¢獙
+        }
+        int endLen = (int) len % 1024;
+        //濡傛灉鏈�鍚庝竴甯т笉鏄暣1024涓瓧鑺�
+        if (endLen > 0) {
+            //濡傛灉鏈�鍚庝竴甯ч暱搴﹀皬浜庣瓑浜�128
+            if (endLen <= 128) {
+                //鏈�鍚庝竴甯т娇鐢�128瀛楄妭浼犺緭
+                result[size - 1] = new byte[133];
+                result[size - 1][0] = SOH;                        //128瀛楄妭鏁版嵁鍖呭ご
+                int n = fis.read(result[size - 1], 3, 128);        //濉厖128涓瓧鑺傛暟鎹�
+                for (int i = n + 3; i < 131; i++) {                    //鍓╀綑浣嶅~鍏�0x1A
+                    result[size - 1][i] = 0x1A;
+                }
+            } else {
+                //鏈�鍚庝竴甯т娇鐢�1024瀛楄妭浼犺緭
+                result[size - 1][0] = STX;                        //1024瀛楄妭鏁版嵁鍖呭ご
+                int n = fis.read(result[size - 1], 3, 1024);        //濉厖1024涓暟鎹�
+                for (int i = n + 3; i < 1027; i++) {                    //鍓╀綑浣嶅~鍏�0x1A
+                    result[size - 1][i] = 0x1A;
+                }
+            }
+            result[size - 1][1] = (byte) (num++);                //鑷姩濉厖甯у簭鍙�
+            if (num > 255) {                                //甯у簭鍙锋渶澶�255
+                num = 0;
+            }
+            result[size - 1][2] = (byte) ~result[size - 1][1];    //鍙栧弽甯у簭鍙�
+            byte[] crc16 = CRC16.getCRC16(result[size - 1], 3);    //鑾峰彇crc16鏍¢獙
+            result[size - 1][result[size - 1].length - 2] = crc16[0];
+            result[size - 1][result[size - 1].length - 1] = crc16[1];    //濉厖crc16鏍¢獙
+        }
+        fis.close();
+        return result;
+    }
+
+
+
+    public static int getNum() {
+        return num;
+    }
+
+    public static void setNum(int num) {
+        getFilesDataBytes.num = num;
+    }
+}
diff --git a/src/ymodem/netWorkUpgradeThread.java b/src/ymodem/netWorkUpgradeThread.java
new file mode 100644
index 0000000..65c7d45
--- /dev/null
+++ b/src/ymodem/netWorkUpgradeThread.java
@@ -0,0 +1,201 @@
+package ymodem;
+
+import baowen.Dell_udpReceive;
+import gnu.io.SerialPort;
+import index.JPanelMoudle.showDataComp;
+import index.JPanelMoudle.versionUpgradeComp;
+import tools.ChuanKou.SerialPortUtil;
+import tools.ShowMessage;
+import tools.Tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.*;
+
+public class netWorkUpgradeThread extends Thread {
+
+
+    private static byte[][] dataBytes; // 鏁版嵁甯�
+    private static byte[] startBytes; // 璧峰甯�
+    private static byte[] endBytes ; // 缁撴潫甯�
+
+    private static final long TIMEOUT = 600000; // 瓒呰繃30绉掓湭鍥炲簲鍒欓��鍑哄崌绾фā寮�
+    static int numSend = 0;
+    static boolean SendDataFlag = false;
+    static String ip = "";//鐩爣璁惧ip鍦板潃
+    static int port;//鐩爣璁惧绔彛
+    static DatagramSocket socket;
+    static int bytlenth=1024;
+    static DatagramPacket packet;
+
+
+    public static void shengji(String ip1,int port1, String filePath1,byte[] byt,int nowPort){
+        SendDataFlag=false;
+        numSend=0;
+        ip = ip1;
+        port = port1;
+        Dell_udpReceive.sendData(byt,ip,port);
+        ComSendUpdateFile(filePath1);
+        Dell_udpReceive.stopThread();//鏆傚仠瑙f瀽绾跨▼
+        chushihua(nowPort);
+
+        new Dell_udpReceive(nowPort);//閲嶆柊寮�濮嬭В鏋愮嚎绋�
+    }
+    
+    // 鏋勯�犲嚱鏁帮紝鎺ユ敹涓插彛鍜屾枃浠惰矾寰�
+    public static void chushihua(int nowPort) {
+        if (versionUpgradeComp.isWrite()) {
+          if (socket==null){
+              try {
+                  socket = new DatagramSocket(nowPort);//鍒涘缓socket
+                  byte[] data = new byte[bytlenth]; // 鍒涘缓byte鏁扮粍
+                  packet= new DatagramPacket(data,bytlenth);
+                  new netWorkUpgradeThread().startThread();
+              } catch (SocketException e) {
+                  throw new RuntimeException(e);
+              }
+          }else {
+              new netWorkUpgradeThread().startThread();
+          }
+        }
+    }
+
+    public void startThread() {
+        Thread t = new Thread(this);
+        t.start();
+    }
+
+    public void run() {
+        try {
+            // 璋冪敤鍗囩骇杩囩▼
+            upgtade();
+            stopThread();
+        } catch (Exception e) {
+            Thread.currentThread().interrupt(); // 鎭㈠涓柇鏍囧織
+            System.out.println("绾跨▼琚腑鏂紝姝e湪閫�鍑哄崌绾ц繃绋�...");
+            e.printStackTrace();
+        }
+    }
+
+    //鍗囩骇鍥轰欢
+    private void upgtade(){
+        long startTime = System.currentTimeMillis();
+        boolean b = System.currentTimeMillis() - startTime < TIMEOUT;
+        while (b&&!SendDataFlag) {
+            // 绛夊緟鍥炲簲
+            byte[] recDat = getRecDat();
+            // 濡傛灉璁惧娌℃湁鍥炲簲锛堝洖搴斾负绌猴級,鍒欒涓烘槸瓒呮椂
+            if (recDat == null || recDat.length == 0) {
+                continue;
+            }
+
+            showDataComp.addAreaTextMes(recDat,ip,port);
+            if (recDat[0] == ymodem.ACK) {
+                numSend++;
+                sendData(numSend);
+            } else if (recDat[0] == ymodem.NAK || recDat[0] == ymodem.C) {
+                // 鏀跺埌NAK鎴朇A锛岄��鍑哄崌绾�
+                sendData(numSend);
+            }else if (recDat[0]==ymodem.CA){
+                break;
+            }
+        }
+        versionUpgradeComp.exitUpgrade();
+    }
+
+
+    //鍙戦�佹暟鎹寘
+    public static void sendData(int shuJuZhen) {
+        int length = dataBytes.length;
+        if (shuJuZhen == 0) {
+            sendData(startBytes,ip,port);
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen <= length && shuJuZhen > 0) {
+            sendData(dataBytes[shuJuZhen - 1],ip,port);
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen == length + 1||shuJuZhen == length + 2) {
+            sendData(new byte[]{(byte) ymodem.EOT},ip,port);
+            getProgress(shuJuZhen, length);
+        } else if (shuJuZhen == length + 3) {
+            sendData(endBytes,ip,port);
+            getProgress(shuJuZhen, length);
+            ShowMessage.zidingyi("鍗囩骇瀹屾垚");
+            SendDataFlag=true;
+            numSend = 0;
+        }
+    }
+
+    //璁$畻褰撳墠鍖呯殑杩涘害
+    private static void getProgress(double shuJuZhen, int length) {
+        int i =(int) Math.round((shuJuZhen / (length +3)) * 100);
+        versionUpgradeComp.getJindu_SaoMiaoQi().setValue(i);
+    }
+
+    //鑾峰彇瑕佸彂閫佺殑甯ф暟鎹�
+    public static void ComSendUpdateFile(String filePath){
+        try {
+            File file = new File(filePath);
+            if (!file.exists()) {                                //濡傛灉鏂囦欢涓嶅瓨鍦�
+                ShowMessage.zidingyi("鏂囦欢涓嶅瓨鍦�" + filePath);        //鎶涘嚭鏂囦欢鎵句笉鍒板紓甯�
+                return;
+            }
+            getFilesDataBytes.setNum(0);
+            startBytes = getFilesDataBytes.getStartData(file);//鑾峰彇璧峰甯ф暟鎹寘
+            dataBytes = getFilesDataBytes.getData(file);//鑾峰彇鏁版嵁甯ф暟鎹寘
+            endBytes = getFilesDataBytes.getEndData();//鑾峰彇缁撴潫甯ф暟鎹寘
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static byte[] getRecDat()  {
+        byte[] dat = new byte[0];
+        try {
+            dat = null;
+            packet = new DatagramPacket(dat,100);
+            socket.receive(packet);
+            String hostAddress = packet.getAddress().getHostAddress();
+            if (hostAddress.equals(ip)){
+                int lenth=packet.getLength();
+                dat=subBytes(packet.getData(),0, lenth);
+            }
+            return dat;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+        /**灏嗘暟鎹彂缁欑綉鍏�*/
+    public static void sendData(byte[] data,String ipout,int portout) {
+        DatagramPacket packet=null;
+        InetAddress address=null;
+        //濡傛灉鏁版嵁绫诲瀷鐩稿悓
+        try {
+            address=InetAddress.getByName(ipout);
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        packet=new DatagramPacket(data,data.length, address, portout);
+        try {
+            socket.send(packet);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static byte[] subBytes(byte[] src, int begin, int count) {
+        byte[] bs = new byte[count];
+        System.arraycopy(src, begin, bs, 0, count);
+        return bs;
+    }
+
+
+
+
+    public static void stopThread() {
+        if (socket != null && !socket.isClosed()) {
+            socket.close();//鍏抽棴socket瀵硅薄
+        }
+    }
+}
diff --git a/src/ymodem/ymodem.java b/src/ymodem/ymodem.java
new file mode 100644
index 0000000..9e2f1ae
--- /dev/null
+++ b/src/ymodem/ymodem.java
@@ -0,0 +1,10 @@
+package ymodem;
+
+public class ymodem {
+    public static final int EOT = 0x04; // 结束传输
+    public static final int ACK = 0x06; // 响应
+    public static final int NAK = 0x15; // 不响应
+    public static final int CA = 0x18;  // 传输终止
+    public static final int C = 0x43;   // 请求数据包
+
+}

--
Gitblit v1.9.3