// Java程序设计大作业 方牧心 3110000155
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import gnu.io.*;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class SerialTool extends JFrame {
private static final long serialVersionUID = 1L;
JPanel conStatus, conStatus1, receive, receive1, send, send1;
JComboBox<Object> cBPort, cBBaud, cBData, cBStop, cBParity;
JTable table;
JScrollPane tablePane;
DefaultTableModel tableModel;
JButton bOpenClose, bClear, bSend;
JTextArea textArea;
CommPortIdentifier portId;
SerialPort serialPort;
InputStream input;
OutputStream output;
String ascii1, ascii2; // 当前正在读入的ASCII
final int timeout = 5000; // 超时时间
long countNumber; // 记录读取行数
int lastColumn, lastRow; // 记录表格最后位置
boolean opened = false; // 是否正在监听窗口
public SerialTool() {
// 设置窗口给标题
super("MarkdownEditor");
setSize(700, 450);
setLocation(200, 50);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(new BorderLayout());
addWindowListener(new WindowsListen());
// 构造面板
conStatus = new JPanel(new FlowLayout());
conStatus.setBorder(BorderFactory.createTitledBorder("Con Status"));
conStatus1 = new JPanel(new BorderLayout());
receive = new JPanel(new BorderLayout());
receive.setBorder(BorderFactory.createTitledBorder("Receive"));
receive1 = new JPanel(new FlowLayout());
send = new JPanel(new FlowLayout());
send.setBorder(BorderFactory.createTitledBorder("Send"));
send1 = new JPanel(new BorderLayout());
// 遍历串口构造选择框
cBPort = new JComboBox<Object>();
Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
cBPort.addItem(portId.getName());
}
}
// 构造选择框
Object[] oBBaud = { 1200, 2400, 4800, 9600, 14400, 19200, 38400 };
cBBaud = new JComboBox<Object>(oBBaud);
Object[] oBData = { 5, 6, 7, 8 };
cBData = new JComboBox<Object>(oBData);
Object[] oBStop = { "1", "1.5", "2" };
cBStop = new JComboBox<Object>(oBStop);
Object[] oBParity = { "NONE", "ODD", "EVEN", "MARK", "SPACE" };
cBParity = new JComboBox<Object>(oBParity);
// 初始化组件
bOpenClose = new JButton("Open");
bOpenClose.addActionListener(new ButtonListener());
bClear = new JButton("Clear");
bClear.addActionListener(new ButtonListener());
bSend = new JButton("Send");
bSend.addActionListener(new ButtonListener());
bSend.setEnabled(false);
table = new JTable();
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
tcr.setHorizontalAlignment(SwingConstants.CENTER);
table.setDefaultRenderer(Object.class, tcr);
table.setShowGrid(false);
tableModel = (DefaultTableModel) table.getModel();
tablePane = new JScrollPane(table);
tableInit();
textArea = new JTextArea();
// 组合生成界面
add(conStatus1, BorderLayout.NORTH);
add(receive, BorderLayout.CENTER);
add(send, BorderLayout.SOUTH);
conStatus1.add(conStatus, BorderLayout.CENTER);
conStatus1.add(bOpenClose, BorderLayout.EAST);
conStatus.add(new JLabel("Port"));
conStatus.add(cBPort);
conStatus.add(new JLabel("Baud"));
conStatus.add(cBBaud);
conStatus.add(new JLabel("Data"));
conStatus.add(cBData);
conStatus.add(new JLabel("Stop"));
conStatus.add(cBStop);
conStatus.add(new JLabel("Parity"));
conStatus.add(cBParity);
receive.add(receive1, BorderLayout.NORTH);
receive.add(tablePane, BorderLayout.CENTER);
receive1.add(bClear);
send.add(bSend, BorderLayout.WEST);
send.add(send1, BorderLayout.CENTER);
send1.add(new JLabel("Send Data"), BorderLayout.NORTH);
send1.add(textArea, BorderLayout.CENTER);
// 界面组织完毕,显示
setVisible(true);
}
public static void main(String[] args) {
new SerialTool();
}
// 处理按钮动作
public class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 开始/停止按钮
if (e.getSource() == bOpenClose) {
if (opened)
stopReceive();
else
startReceive();
}
// 清屏按钮
if (e.getSource() == bClear) {
tableInit();
}
// 发送数据按钮
if (e.getSource() == bSend) {
sendMessage();
}
}
}
// 开始监听
public void startReceive() {
bOpenClose.setText("Close"); // 更改按钮
opened = true; // 更改全局标记
bSend.setEnabled(true); // 激活Send按钮
cBPort.setEnabled(false);
cBBaud.setEnabled(false);
cBData.setEnabled(false);
cBStop.setEnabled(false);
cBParity.setEnabled(false);
try {
// 打开串口
portId = CommPortIdentifier.getPortIdentifier(cBPort
.getSelectedItem().toString());
serialPort = (SerialPort) portId.open("SerialTool", timeout);
// 根据输入获取参数
int baud = Integer.parseInt(cBBaud.getSelectedItem().toString());
int data = Integer.parseInt(cBData.getSelectedItem().toString());
int stop = 0;
if (cBStop.getSelectedItem().toString().equals("1"))
stop = SerialPort.STOPBITS_1;
if (cBStop.getSelectedItem().toString().equals("1.5"))
stop = SerialPort.STOPBITS_1_5;
if (cBStop.getSelectedItem().toString().equals("2"))
stop = SerialPort.STOPBITS_2;
int parity = 0;
if (cBParity.getSelectedItem().toString().equals("EVEN"))
parity = SerialPort.PARITY_EVEN;
if (cBParity.getSelectedItem().toString().equals("MARK"))
parity = SerialPort.PARITY_MARK;
if (cBParity.getSelectedItem().toString().equals("NODE"))
parity = SerialPort.PARITY_NONE;
if (cBParity.getSelectedItem().toString().equals("ODD"))
parity = SerialPort.PARITY_ODD;
if (cBParity.getSelectedItem().toString().equals("SPACE"))
parity = SerialPort.PARITY_SPACE;
// 获取输入输出流
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// 设置监听、激活事件
serialPort.addEventListener(new SerialListener());
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(baud, data, stop, parity);
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TooManyListenersException e) {
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
}
// 停止监听
public void stopReceive() {
bOpenClose.setText("Open"); // 更改按钮
opened = false; // 更改全局标记
// 按钮可用性调整
bSend.setEnabled(false);
cBPort.setEnabled(true);
cBBaud.setEnabled(true);
cBData.setEnabled(true);
cBStop.setEnabled(true);
cBParity.setEnabled(true);
// 关闭串口
try {
serialPort.notifyOnDataAvailable(false);
serialPort.removeEventListener();
input.close();
output.close();
serialPort.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 发送消息
public void sendMessage() {
String temp = "";
// 每两位字符转化为16进制数字发送,忽略空格
for (int i = 0; i < textArea.getText().length(); i++) {
if (textArea.getText().charAt(i) == ' ')
continue;
temp = temp + textArea.getText().charAt(i);
if ((temp.length() == 2) || (i == textArea.getText().length() - 1)) {
try {
output.write(Integer.parseInt(temp, 16));
output.flush();
} catch (NumberFormatException | IOException e) {
e.printS