一、首先搭建平台,我用的是eclipse+rxtx+SWT。
安装eclipse就是安装java包后,然后下载eclipse即可。因为eclipse是绿色的,不用安装,下载即可用。
下载rxtx。在网上下载rxtx包含串口开发的常用函数,是开源社区的一个产物,与sun公司的comm包相同,只是调用前的导入语句由import javax.comm.*变为import gnu.io.*而已.这个包包含一个jar包和几个用于windows平台的几个dll文件。
下载swt。同rxtx一样,包含一个jar包和几个dll文件。详见可到SWT网站查询。
安装rxtx和swt。把上面rxtx和swt涉及到的文件放到你的项目下,然后在该项目下添加外包jar包,关于添加外部jar包的详细的网上有很多.
二、支持图形化编辑
下载安装swt designer。
注册swt designer,重启你的eclipse,在项目菜单里找到属性一项,然后在对话框里找到designer一项,里面有提示,根据提示一次填写,注意的是在想免费使用set designer时,必须选中free 下的swt,同时你的Email必须填写,这样你的注册码才能收到。注册后,会提示你注册码已经发送到你的邮箱了。再次打开项目菜单的属性一项,同样是designer下,和上次填写注册信息一样,只是这此你不必填写信息了。直接把你的注册码写到注册码一项里,然后单击完成即可。
使用图形界面。打开你的项目下的源文件,工作区的左下角会有source/designer选项,单击designer就到了图形编辑状态,要回到非图形状态,同样到工作区的左下角,只是这此单击source选项。有时,左下角会找不到这样的切换选项,这时你选中你要打开的文件,然后右击,在弹出的菜单里由一项是“open in designer”,选中该项,你就会发现工作区的左下角由source/designer切换选项.
三、项目
和一般的java项目一样,编写你的文件。当然可以用图形界面编辑了。
源代码:
第一个是串口对象,支持串口的一些基本操作,
package one;

import java.io.*;
import java.util.*;
import gnu.io.*;
public class Comm implements SerialPortEventListener {
 private volatile boolean usingOnePort = false;// 宣告对象打开了(或者正在使用)一个串口
 // volatile,保证不同线程得到的值一致这里是监听器和readPort()函数读取
 protected volatile boolean receiving = false;// 处于接收串口信息状态
 protected volatile boolean sentting = false;// 处于向串口发送信息状态
 private CommPortIdentifier portId;// 硬件初始化
 private SerialPort serialPort;// 软件和硬件的接口
 private OutputStream out;// 向串口发送数据流
 private InputStream in;// 接收串口数据流
 private String commName = "COM2";
 private int bPS = 9600;
 private int dataBit = 7;// 和C51通信必须设为7位,不然输出不对
 private int stopBit = 1;
 private int parityBit = 0;
 private PipedInputStream pipin;// 管道流,接收串口信息的
 private PipedOutputStream pipout;
 
 
 public void setName(String commname) {
  commName=commname;
 }
 
 
 
 public void setBps(int bps) {
  bPS = bps;
 }
 
 public void setDataBit(int databit) {
  dataBit = databit;
 }
 
 public void setStopBit(int stopbit) {
  stopBit = stopbit;
 }
 
 public void setParityBit(int paritybit) {
  parityBit = paritybit;
 }
 
 public static String[] listPort() {
  int i = 0;
  String commList[] = new String[15];// 假定最多为十五个串口
  CommPortIdentifier commPort = null;
  Enumeration portList = null;
  portList = CommPortIdentifier.getPortIdentifiers();
  // iterate through the ports.
  while (portList.hasMoreElements()) {
   commPort = (CommPortIdentifier) portList.nextElement();
   if (commPort.getPortType() == CommPortIdentifier.PORT_SERIAL) {
    commList[i] = commPort.getName();
    // System.out.print(commList[i] + " ");// 调试语句
    i += 1;
   }
  }
  // System.out.println();// 调试语句
  return commList;
 }
 
 public boolean open() {
  boolean ok = false;
  try {// 打开硬件资源,获取并口
   portId = CommPortIdentifier.getPortIdentifier(commName);
  } catch (NoSuchPortException e) {
   System.out.println("Get portid err" + e.getMessage());
   return ok;
  }
  try {// 打开软件资源,设置进程名称和超时时间
   serialPort = (SerialPort) portId.open("comm", 1000);
  } catch (PortInUseException e) {
   // System.out.println("Port in used err " + e.getMessage());//调试语句
   return ok;
  }
  // 很有意思这句,你不设置他也能正确收到信息,但是设置不正确就收不到信息
  try {// 设置数据传输参数
   serialPort.setSerialPortParams(bPS, dataBit, stopBit, parityBit);
  } catch (UnsupportedCommOperationException e) {
   System.out.println("Set port params err " + e.getMessage());
   return ok;
  }
  try {// 创建输入流
   in = serialPort.getInputStream();
  } catch (IOException e) {
   System.out.println("Create instream err " + e.getMessage());
   return ok;
  }
  try {// 创建输出流
   out = serialPort.getOutputStream();
  } catch (IOException e) {
   System.out.println("Create outstream err " + e.getMessage());
   return ok;
  }
  // 创建管道流
  pipin = new PipedInputStream();
  pipout = new PipedOutputStream();
  try {// 连接管道
   pipin.connect(pipout);
  } catch (IOException e1) {
   System.out.println("Connect pipin and pipout err "
     + e1.getMessage());
   return ok;
  }
  try {// 监听串口
   serialPort.addEventListener(this);
  } catch (TooManyListenersException e) {
   System.out.println("SerialPort addEventListener err"
     + e.getMessage());
   return ok;
  }
  serialPort.notifyOnDataAvailable(true);// 开启,是否监听有数据
  usingOnePort = true;// 已经使用一个串口了
  receiving = true;// 处于接收状态
  sentting = true;// 处于发送状态
  // System.out.println(commName+" init is ok");// 调试语句
  ok = true;
  return ok;
 }
 
 
 
 private synchronized void read() {// 由打开串口后,增加的监听程序自动调用
  final byte[] buf;// 缓冲区
  int n;// 检测输入流是否真的有输入
  if (usingOnePort) {// usingOnePort针对增加监听时出错识别
   try {
    n = in.available();
   } catch (IOException e) {
    System.out.println("Check inputstream available err "
      + e.getMessage());
    return;
   }
   if (receiving) {// 串口处于接收状态
    if (n > -1) {// 输入流有数据输入,全部读入到管道
     buf = new byte[n];
     try {// 数据读到缓存区
      in.read(buf);
     } catch (IOException e) {
      System.out.println("Start read port err "
        + e.getMessage());
      return;
     }
     if (new String(buf).trim() != " ") {// 数据有效,非全为空格
      try {// 把数据写到到管道
       pipout.write(buf);
       pipout.flush();
      } catch (IOException e) {
       System.out.println("Write data to pip err "
         + e.getMessage());
      }
     }
    } else {// 没有数据输入,不再写入管道了
     buf = null;
     return;
    }
   } else {// 非接受状态,跳过N个字节
    try {
     in.skip(n);
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  notifyAll();// 完成一次读取,释放该函数,其他程序可以调用了
  return;
 }
 
 public String getMessage() {
  int n = -1;
  byte[] buf;
  String msg = null;
  if (usingOnePort) {// 正在使用一个串口
   try {
    n = pipin.available();
   } catch (IOException e) {
    System.out.println("Check pipin has data or not err "
      + e.getMessage());
    return msg;
   }
   if (n > -1) {// 管道里有数据
    buf = new byte[n];
    try {// 获取数据
     pipin.read(buf);
    } catch (IOException e) {
     System.out.println("Get message form pipin err "
       + e.getMessage());
     return msg;
    }
    msg = new String(buf);
    if (msg.trim() == " ")
     msg = null;
   }
  }
  return msg;
 }
 
 public String getMessage(int[] num) {
  num[0]=0;//表示接收多少个数据了
  int n = -1;
  byte[] buf;
  String msg = null;
  if (usingOnePort) {// 正在使用一个串口
   try {
    n = pipin.available();
   } catch (IOException e) {
    System.out.println("Check pipin has data or not err "
      + e.getMessage());
    return msg;
   }
   if (n > -1) {// 管道里有数据
    num[0]=n;
    buf = new byte[n];
    try {// 获取数据
     pipin.read(buf);
    } catch (IOException e) {
     System.out.println("Get message form pipin err "
       + e.getMessage());
     return msg;
    }
    msg = new String(buf);
    if (msg.trim() == " "){
     num[0]=0;
     msg = null;
    }
   }
  }
  return msg;
 }
 
 private synchronized boolean write(String msg) {
  boolean ok = false;
  if (sentting && msg != null) {// 处于发送状态且发送字符为非空
   try {
    out.write(msg.getBytes());
    out.flush();
   } catch (Exception e) {
    System.out.println("Write port err " + e.getMessage());
    return ok;
   }
  }
  ok = true;
  notifyAll();
  // System.out.println("Writting port");// 调试语句
  return ok;
 }
 
 
 public boolean sentMessage(String msg) {
  boolean ok = false;
  if (usingOnePort) {// 正在使用一个串口
   write(msg);
   ok = true;
  }
  return ok;
 }
 
 public boolean sentMessage(String msg,int[] num) {
  boolean ok = false;
  if (usingOnePort) {// 正在使用一个串口
   write(msg);
   num[0]=msg.length();
   ok = true;
  }
  return ok;
 }
 
 public boolean close() {
  boolean ok = false;
  if (usingOnePort) {// 只有已经打开一个串口,在使用时,才能关闭串口
   try {// 关闭输入输出流
    in.close();
    out.close();
   } catch (Exception e) {
    System.out.println("Close IO err " + e.getMessage());
    return ok;
   }
   try {// 关闭管道流
    pipout.close();
    pipin.close();
   } catch (IOException e1) {
    System.out.println("Close pipedIO err " + e1.getMessage());
    return ok;
   }
   serialPort.close();// 关闭串口
   usingOnePort = false;// 串口处于关闭状态
   // System.out.println("Close port");// 调试语句
   ok = true;
  }
  return ok;
 }
 
 public void serialEvent(SerialPortEvent e) {
  switch (e.getEventType()) {
  case SerialPortEvent.BI:
  case SerialPortEvent.OE:
  case SerialPortEvent.FE:
  case SerialPortEvent.PE:
  case SerialPortEvent.CD:
  case SerialPortEvent.CTS:
  case SerialPortEvent.DSR:
  case SerialPortEvent.RI:
  case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
   break;
  
  case SerialPortEvent.DATA_AVAILABLE: {
   // System.out.println("Have Data");
   read();
  }
  }
 }
 
}
***************************************
下面是图形界面部分,包括界面和串口动态生成和关闭.
package one;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
public class CommTest {
 private Display display;
 private Shell shell;
 private Comm comm;// 串口对象
 private Thread commT;// 串口对象管理线程
 // 五个串口参数,因串口对象是动态的存在
 private volatile String commname = "COM2";// 串口参数必须在这个类里设置,不然不行
 private volatile int bps = 9600;
 private volatile int databit = 7;// 和C51通信必须设为7位,不然输出不对
 private volatile int stopbit = 1;
 private volatile int paritybit = 0;
 private volatile int what2Do;// 串口关闭、打开或者保持不变标志等
 // 以下四个为对串口对象的管理动作
 private final int closeComm = 0;// 关闭串口
 private final int openComm = 1;// 打开串口
 private final int changePara = 2;// 改变串口参数
 private final int keepStat = 3;// 保持当前状态
 // 接收信息
 private Text receiveText;// 接收信息文本框
 private final int disLimit = 1000;// 接收信息显示1000自字符后,清屏
 private volatile boolean disHex = false;// 十六进制显示接收的数据
 // 发送信息
 private Text sentText;// 发送信息文本框
 private volatile boolean sentHexS = false;// 十六进制格式发送数据
 private volatile boolean autoSentS = false;// 是否自动发送
 private volatile long autoSentTime = 1000;// 自动发送时间间隔,1秒
 // 信息保存
 private volatile boolean autoSaveS = false;// 自动保存标志
 private volatile String fileName = "./comm.txt";// 保存路径(默认)
 // 收、发信息量
 private volatile int numReceived = 0;// 接收到串口数据的数目
 private volatile int numSend = 0;// 发送数据的数目
 
 public static void main(String[] args) {
  try {
   CommTest window = new CommTest();
   window.open();
  } catch (Exception e) {
   System.out.println("window open err " + e.getMessage());
  }
 }
 
 @SuppressWarnings("deprecation")
 public void open() {
  display = Display.getDefault();// 打开显示SWT显示功能
  createContents();// 创建窗口部件
  shell.open();// 打开主窗口
  shell.layout();// 主窗口布局
  while (!shell.isDisposed()) {// shell没有注销掉
   if (!display.readAndDispatch())
    display.sleep();
  }
  comm.close();// 关闭串口
  commT.stop();// 关闭串口管理线程
  shell.dispose();// 关闭主窗口
  display.dispose();// 关闭显示swt功能
 }
 
 protected void createContents() {
  shell = new Shell(display,SWT.MIN|SWT.CLOSE);// 由display生成shell
  final GridLayout gridLayout = new GridLayout();
  gridLayout.numColumns = 2;
  shell.setLayout(gridLayout);
  shell.setSize(701, 532);
  shell.setText("串口调试助手");
  shell.setImage(new Image(display, "./icon.gif"));// 设置窗口图像
  createSetting();
  createCommT();
  createReceive();
  createSent();
  final Label label_4 = new Label(shell, SWT.CENTER | SWT.BORDER);
  label_4.setLayoutData(new GridData(116, SWT.DEFAULT));
  final Thread couter = new Thread(new Runnable() {// 统计接收和发送到的数据数目
     public void run() {
      while (true) {
       try {
        Thread.sleep(1000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       display.syncExec(new Runnable() {
        public void run() {
         label_4.setText("RX:" + numReceived
           + "\tTX:" + numSend);
        }
       });
      }
     }
    });
  couter.start();
  label_4.addDisposeListener(new DisposeListener() {
   @SuppressWarnings("deprecation")
   public void widgetDisposed(DisposeEvent arg0) {
    couter.stop();
   }
  });
  final Label label_5 = new Label(shell, SWT.NONE | SWT.CENTER);
  label_5.setLayoutData(new GridData(549, SWT.DEFAULT));
  label_5.setText("串口调试助手(SWT) \t版权所有:anyone \t作者:adlong");
 }
 
 private void createSetting() {
  final Group group = new Group(shell, SWT.NONE | SWT.CENTER);
  final GridData gd_group = new GridData(SWT.LEFT, SWT.TOP, false, false);
  gd_group.heightHint = 160;
  gd_group.widthHint = 110;
  group.setLayoutData(gd_group);
  final GridLayout gridLayout = new GridLayout();
  gridLayout.numColumns = 2;
  group.setText("串口设置");
  group.setLayout(gridLayout);
  final Label Label = new Label(group, SWT.NONE);
  Label.setText("串口");
  final Combo combo = new Combo(group, SWT.NONE);
  combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  String[] list = Comm.listPort();// 最大串口名称列表
  int n = list.length;// 最大串口个数
  for (int i = 0; i < n - 1; i++)
   if (list[i] != null)
    combo.add(list[i]);
  combo.select(1);// 默认选中第二项,与默认串口一致
  combo.addSelectionListener(new SelectionAdapter() {// 选择响应
     public void widgetSelected(SelectionEvent e) {
      int n = combo.getSelectionIndex();// 获取选中的选项位置值
      commname = combo.getItem(n);// 获取应该设置的值
      what2Do = changePara;
     }
    });
  final Label label_1 = new Label(group, SWT.NONE);
  label_1.setText("波特率");
  final Combo combo_1 = new Combo(group, SWT.NONE);
  combo_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  combo_1.add("300");
  combo_1.add("600");
  combo_1.add("1200");
  combo_1.add("2400");
  combo_1.add("4800");
  combo_1.add("9600");
  combo_1.add("19200");
  combo_1.add("38400");
  combo_1.add("43000");
  combo_1.add("56000");
  combo_1.add("57600");
  combo_1.add("115200");
  combo_1.select(5);// 默认选中9600项,与默认波特率一致
  combo_1.addSelectionListener(new SelectionAdapter() {// 选择响应
     public void widgetSelected(SelectionEvent e) {
      int n = combo_1.getSelectionIndex();// 获取选中的选项位置值
      bps = Integer.valueOf(combo_1.getItem(n));// 获取应该设置的值
      what2Do = changePara;
     }
    });
  final Label label_2 = new Label(group, SWT.NONE);
  label_2.setText("校验位");
  final Combo combo_2 = new Combo(group, SWT.NONE);
  combo_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  combo_2.add("无");
  combo_2.add("奇校验");
  combo_2.add("偶校验");
  combo_2.select(0);// 默认选中校验位为0
  combo_2.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    int n = combo_2.getSelectionIndex();
    paritybit = n;
    what2Do = changePara;
   }
  });
  final Label label_3 = new Label(group, SWT.NONE);
  label_3.setText("数据位");
  final Combo combo_3 = new Combo(group, SWT.NONE);
  combo_3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  combo_3.add("6");
  combo_3.add("7");
  combo_3.add("8");
  combo_3.select(1);// 默认值为7位
  combo_3.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    int n = combo_3.getSelectionIndex();
    databit = Integer.valueOf(combo_3.getItem(n));
    what2Do = changePara;
   }
  });
  final Label label_4 = new Label(group, SWT.NONE);
  label_4.setText("停止位");
  final Combo combo_4 = new Combo(group, SWT.NONE);
  combo_4.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  combo_4.add("1");
  combo_4.add("2");
  combo_4.select(0);// 默认值为1位停止位
  combo_4.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    int n = combo_4.getSelectionIndex();
    stopbit = Integer.valueOf(combo_4.getItem(n));
    what2Do = changePara;
   }
  });
  Canvas sign = new Canvas(group, SWT.NONE);
  sign.setLayoutData(new GridData(33, 27));
  final GC gc = new GC(sign);
  sign.addPaintListener(new PaintListener() {// 软件打开时,红色,表示打开串口
     public void paintControl(PaintEvent e) {
      gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
      gc.fillOval(0, 0, 25, 25);
     }
    });
  final Button button = new Button(group, SWT.NONE);
  button.setLayoutData(new GridData(56, SWT.DEFAULT));
  button.setText("关闭串口");
  button.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    if (button.getText() == "关闭串口") {// 关闭串口
     gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
     button.setText("打开串口");
     what2Do = closeComm;
    } else {// 打开串口
     button.setText("关闭串口");
     gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
     what2Do = openComm;
     numReceived = 0;// 计数清空
     numSend = 0;
    }
    gc.fillOval(0, 0, 25, 25);
   }
  });
 }
 private void createCommT() {// comm的生成和消释都在此线程
  commT = new Thread(new Runnable() {
   public void run() {
    boolean ok = false;
    comm = new Comm();
    comm.setName(commname);// 首次执行,创建串口对象
    comm.setBps(bps);
    comm.setDataBit(databit);
    comm.setParityBit(paritybit);
    comm.setStopBit(stopbit);
    if (comm.open())
     ok = true;
    what2Do = keepStat;// 保持状态不变
    // 管理动态串口对象
    while (true) {
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     switch (what2Do) {
     case changePara: {// 改变参数
      comm.close();
      ok = false;
      comm = new Comm();
      comm.setName(commname);
      comm.setBps(bps);
      comm.setDataBit(databit);
      comm.setParityBit(paritybit);
      comm.setStopBit(stopbit);
      if (comm.open())
       ok = true;
      what2Do = keepStat;// 保持状态不变
      break;
     }
     case closeComm: {// 关闭串口
      comm.close();
      ok = false;
      what2Do = keepStat;
      break;
     }
     case openComm: {// 打开串口
      comm = new Comm();
      comm.setName(commname);
      comm.setBps(bps);
      comm.setDataBit(databit);
      comm.setParityBit(paritybit);
      comm.setStopBit(stopbit);
      if (comm.open())
       ok = true;// 打开一个串口后,便能存取串口了
      what2Do = keepStat;
      break;
     }
     case keepStat:// 保持已有的状态
      break;
     }
     if (ok) {// 如果串口对象存在并且打开着
      int[] numR = new int[1];
      final String str = comm.getMessage(numR);
      numReceived += numR[0];
      display.syncExec(new Runnable() {
       public void run() {
        if (disHex) {// 十六进制显示
         for (int i = 0; i < str.length(); i++)
          receiveText.append(Integer
            .toHexString(str.charAt(i))
            + " ");
        } else
         receiveText.append(str);
       }
      });
      if (autoSaveS) {// 如果自动保存
       FileWriter writer = null;// 初始化写文件流
       try {
        writer = new FileWriter(fileName, true);// 杜绝存在filename为空的情况
       } catch (IOException e) {
        e.printStackTrace();
       }
       try {// 保存信息
        writer.write(str);
        writer.flush();
       } catch (IOException e) {
        e.printStackTrace();
       }
       try {//关闭写文件流
        writer.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
     }
    }
   }
  });
  commT.start();
 }
 private void createReceive() {
  receiveText = new Text(shell, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
  GridData grLayout = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 5);
  grLayout.widthHint = 530;
  receiveText.setLayoutData(grLayout);
  final Composite composite = new Composite(shell, SWT.NONE);
  composite.setLayoutData(new GridData(115, 54));
  final GridLayout gridLayout_1 = new GridLayout();
  gridLayout_1.numColumns = 2;
  composite.setLayout(gridLayout_1);
  final Button button = new Button(composite, SWT.NONE);
  button.setText("清空接收");
  button.addSelectionListener(new SelectionAdapter() {// 清空文本框
     public void widgetSelected(SelectionEvent arg0) {
      receiveText.setText("");
     }
    });
  final Label label = new Label(composite, SWT.NONE);
  label.setLayoutData(new GridData(38, SWT.DEFAULT));
  label.setText("接收区");
  final Button button_1 = new Button(composite, SWT.NONE);
  button_1.setText("停止显示");
  button_1.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent arg0) {
    if (button_1.getText() == "停止显示") {
     button_1.setText("继续显示");
     if (what2Do != closeComm)// 串口存在对象时才能操作对象
      comm.receiving = false;
    } else {
     button_1.setText("停止显示");
     if (what2Do != closeComm)// 串口存在对象时才能操作对象
      comm.receiving = true;
    }
   }
  });
  final Composite composite_1 = new Composite(shell, SWT.NONE);
  composite_1.setLayoutData(new GridData(115, 41));
  composite_1.setLayout(new GridLayout());
  final Button button_2 = new Button(composite_1, SWT.CHECK);
  button_2.setText("自动清空");
  final Button button_3 = new Button(composite_1, SWT.CHECK);
  button_3.setText("十六进制显示");
 
  final Composite composite_2 = new Composite(shell, SWT.NONE);
  composite_2.setLayoutData(new GridData(114, 29));
  final GridLayout gridLayout_2 = new GridLayout();
  gridLayout_2.numColumns = 2;
  composite_2.setLayout(gridLayout_2);
  final Button button_4 = new Button(composite_2, SWT.CHECK);
  button_4.setLayoutData(new GridData(62, SWT.DEFAULT));
  button_4.setText("自动保存");
  final Button button_5 = new Button(composite_2, SWT.NONE);
  button_5.setLayoutData(new GridData(34, SWT.DEFAULT));
  button_5.setText("保存");// 默认为”保存“
  final Composite composite_3 = new Composite(shell, SWT.NONE);
  final GridData gd_composite_3 = new GridData(SWT.LEFT, SWT.TOP, false,
    false);
  gd_composite_3.heightHint = 28;
  gd_composite_3.widthHint = 113;
  composite_3.setLayoutData(gd_composite_3);
  composite_3.setLayout(new GridLayout());
  final Text text = new Text(composite_3, SWT.BORDER);// 用于显示保存路径
  final GridData gd_text = new GridData(SWT.FILL, SWT.FILL, true, false);
  gd_text.widthHint = 106;
  gd_text.heightHint = 13;
  text.setLayoutData(gd_text);
  text.setText(fileName);// 默认手动保存路径为:自动保存路径
  button_5.addSelectionListener(new SelectionAdapter() {// 监听按钮按下
     @Override
     public void widgetSelected(SelectionEvent arg0) {
      if (autoSaveS) {// 如果为自动保存
       FileDialog changeFN = new FileDialog(shell,
         SWT.OPEN);
       String tempN =null;
       tempN=changeFN.open();
       if (tempN != null){ // 文件名存在才改名
        fileName=tempN;
        text.setText(fileName);// 更新提示信息
       }
      } else {// 手动保存
       FileDialog saveF = new FileDialog(shell, SWT.SAVE);
       String tempN = saveF.open();
       if (tempN != null) {// 文件名存在---保存信息
        text.setText(fileName);// 更新提示信息
        FileOutputStream save = null;
        try {
         save = new FileOutputStream(tempN);
        } catch (IOException e) {
         e.printStackTrace();
        }
        try {// 保存当前信息
         save
           .write(receiveText.getText()
             .getBytes());
         save.flush();
        } catch (IOException e) {
         e.printStackTrace();
        }
        try {
         save.close();
        } catch

java串口调试助手开发记录相关推荐

  1. 基于qt4的串口调试助手开发

    程序全部代码:https://download.csdn.net/download/haojun1996/10501590 1. 课程设计内容 本课程设计的内容是设计一个基于QT的串口调试软件,同时支 ...

  2. java串口调试助手_基于 QML的 串口调试助手

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_38416696/arti ...

  3. C#开发串口调试助手实现modbusRTU通信

    今天给大家搞个项目,跟我来,走过路过不要错过,看大V如何玩C#工业软件开发,搞事的目的是:掌握MODBUSRTU通信协议,掌握简单型串口调试助手开发,掌握串口通信过程 硬件产品:串口RS232温湿度传 ...

  4. java串口助手_java 串口调试助手 源码

    [实例简介]简单的串口调试助手 [实例截图] [核心代码]import gnu.io.CommPortIdentifier; import gnu.io.NoSuchPortException; im ...

  5. 分享一款自己开发的串口调试助手(macOS系统,界面简介,使用方便)

    背景: Mac版本下有各种版本的串口调试助手,但要不内容繁多,要不界面不够简介,偶然机会在Window上看到一个版本,但Mac下没有,于是基于ORSSerialPort底层开发了一款适合自己的调试助手 ...

  6. 2021-02-08【Web作业开发记录】Java代码读取文件问题

    [Web作业开发记录]Java代码读取文件问题 1.问题分析 在项目中需要读取properties文件,而对于gradle项目,在java文件夹底下的properties文件在编译打包时会自动忽略,最 ...

  7. 仰邦LED(BX-Y08)二次开发的java版流程梳理记录

    仰邦LED-bx_y08二次开发的java版流程梳理记录 首次开发的项目是一个停车场主要显示剩余多少车辆 遇到很多难题;主要还要搞清楚二次开发LED的发送流程,在这记录下 //初始化API环境 仅一次 ...

  8. canoe开发从入门到精通pdf_阿里技术官手写801页PDF《精通Java Web整合开发》

    基础篇 第1~3章为基础篇,重点讲解基于开源架构Java EE应用开发的优势及其开发运行环境的安装配置,同时对JSP技术体系也进行了详细介绍. 基础篇的主要内容包括: Java Web应用开发技术选用 ...

  9. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

最新文章

  1. SpringBoot非官方教程 | 第八篇:SpringBoot整合mongodb
  2. Java Review - LinkedList源码解读
  3. ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略
  4. PMCAFF微课堂|猎豹清理大师亿万用户量产品背后的紫牛方法论,傅盛不会说的秘密...
  5. python如何注释掉一段代码_爬取出来的网页代码都被注释掉怎么解决?
  6. linux之使用indent格式化代码总结
  7. win10安装python
  8. 一个 冒泡排序 和 选择排序 的简单c程序
  9. DNN的Friendly URL剖析及应用
  10. mysql udf http,mysql下mysql-udf-http效率测试小记
  11. springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
  12. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-5.开源工具的优缺点选择和抽象方法的建议...
  13. ubuntu 20.04 编译yocto 错误集锦
  14. 明尼苏达大学双城分校计算机科学,明尼苏达大学双城分校计算机专业研究生需要满足哪些条件?...
  15. android 右边抽屉,android双抽屉:右抽屉切换
  16. 网页版网络聊天室设计与实现(Java+SSH+MySQL)
  17. 比较好的运动耳机,好用的运动耳机推荐
  18. 设计模式之禅之单一职责原则
  19. dubbo官网最新版导航
  20. 关于日本人的笑话合集(转载)

热门文章

  1. 联想智能引擎散热系统性能切换
  2. 论文中涉及的格式排版问题
  3. 云呼服务器网站,云呼 服务器
  4. xxx小学四年级(上) 学期
  5. c语言double型小数点后几位_c语言double类型默认保留几位小数?
  6. python机器识别追踪_Python+OpenCV实现实时眼动追踪的示例代码
  7. 数据大屏设计思路 6点
  8. 【概率论与数理统计】猴博士 笔记 p21-23 二维连续型求边缘分布函数和密度函数,已知两个边缘密度函数求f(x,y)
  9. 奇怪的supervisord 为啥老是退出
  10. 点一下等于手绘2小时,50步的产物合成路线图怎么(偷懒)画?