有沒有大佬幫忙解決下 用javaSwing 弄的串口通信工具會報這個錯誤 虛擬串口間通信沒問題 給硬體串口發資料接收不到回傳的值,還會導致軟體卡死 代碼在下面
package com.yang.serialport.ui;
import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import com.yang.serialport.manager.SerialPortManager;
import com.yang.serialport.utils.ByteUtils;
import com.yang.serialport.utils.ShowUtils;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
/**
* 主界面
*
* @author yangle
*/
@SuppressWarnings("all")
public class MainFrame extends JFrame {
// 程式界面寬度
public final int WIDTH = 930;
// 程式界面高度
public final int HEIGHT = 570;
// 資料顯示區
private JTextArea mDataView = new JTextArea();
private JScrollPane mScrollDataView = new JScrollPane(mDataView);
// 串口設定面板
private JPanel mSerialPortPanel = new JPanel();
private JLabel mSerialPortLabel = new JLabel("串口");
private JLabel mBaudrateLabel = new JLabel("波特率");
private JComboBox mCommChoice = new JComboBox();
private JComboBox mBaudrateChoice = new JComboBox();
private ButtonGroup mDataChoice = new ButtonGroup();
private JRadioButton mDataASCIIChoice = new JRadioButton("ASCII", true);
private JRadioButton mDataHexChoice = new JRadioButton("Hex");
// 操作面板
private JPanel mOperatePanel = new JPanel();
private JTextArea mDataInput = new JTextArea();
private JButton mSerialPortOperate = new JButton("打開串口");
private JButton mSendData = new JButton("發送資料");
//快捷面板
private JPanel mQuick = new JPanel();
private JButton m1 = new JButton("快捷操作1");
private JButton m2 = new JButton("快捷操作2");
// 串口串列
private List<String> mCommList = null;
// 串口物件
private SerialPort mSerialport;
public MainFrame() {
initView();
initComponents();
actionListener();
initData();
}
/**
* 初始化視窗
*/
private void initView() {
// 關閉程式
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
// 禁止視窗最大化
setResizable(false);
// 設定程式視窗居中顯示
Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
setBounds(p.x - WIDTH / 2 , p.y - HEIGHT / 2 , WIDTH, HEIGHT);
this.setLayout(null);
setTitle("串口工具");
}
/**
* 初始化控制元件
*/
private void initComponents() {
// 資料顯示
mDataView.setFocusable(false);
mScrollDataView.setBounds(10, 10, 905, 300);
add(mScrollDataView);
// 串口設定
mSerialPortPanel.setBorder(BorderFactory.createTitledBorder("串口設定"));
mSerialPortPanel.setBounds(10, 320, 200, 190);
mSerialPortPanel.setLayout(null);
add(mSerialPortPanel);
mSerialPortLabel.setForeground(Color.gray);
mSerialPortLabel.setBounds(10, 25, 40, 20);
mSerialPortPanel.add(mSerialPortLabel);
mCommChoice.setFocusable(false);
mCommChoice.setBounds(60, 25, 100, 20);
mSerialPortPanel.add(mCommChoice);
mBaudrateLabel.setForeground(Color.gray);
mBaudrateLabel.setBounds(10, 60, 40, 20);
mSerialPortPanel.add(mBaudrateLabel);
mBaudrateChoice.setFocusable(false);
mBaudrateChoice.setBounds(60, 60, 100, 20);
mSerialPortPanel.add(mBaudrateChoice);
mDataASCIIChoice.setBounds(20, 95, 55, 20);
mDataHexChoice.setBounds(95, 95, 55, 20);
mDataChoice.add(mDataASCIIChoice);
mDataChoice.add(mDataHexChoice);
mSerialPortPanel.add(mDataASCIIChoice);
mSerialPortPanel.add(mDataHexChoice);
mSerialPortOperate.setFocusable(false);
mSerialPortOperate.setBounds(45, 128, 105, 35);
mSerialPortPanel.add(mSerialPortOperate);
// 操作
mOperatePanel.setBorder(BorderFactory.createTitledBorder("發送資料"));
mOperatePanel.setBounds(217, 320, 330, 190);
mOperatePanel.setLayout(null);
add(mOperatePanel);
mDataInput.setBounds(20, 20, 290, 90);
mDataInput.setLineWrap(true);
mDataInput.setWrapStyleWord(true);
mOperatePanel.add(mDataInput);
/*mSerialPortOperate.setFocusable(false);
mSerialPortOperate.setBounds(45, 95, 90, 20);
mOperatePanel.add(mSerialPortOperate);*/
mSendData.setFocusable(false);
mSendData.setBounds(100, 128, 105, 35);
mOperatePanel.add(mSendData);
// 快捷
mQuick.setBorder(BorderFactory.createTitledBorder("快捷操作"));
mQuick.setBounds(554, 320, 361, 190);
mQuick.setLayout(null);
add(mQuick);
m1.setFocusable(false);
m1.setBounds(10,30,140,25);
mQuick.add(m1);
m2.setFocusable(false);
m2.setBounds(10,60,140,25);
mQuick.add(m2);
}
/**
* 初始化資料
*/
private void initData() {
mCommList = SerialPortManager.findPorts();
// 檢查是否有可用串口,有則加入選項中
if (mCommList == null || mCommList.size() < 1) {
ShowUtils.warningMessage("沒有搜索到有效串口!");
} else {
for (String s : mCommList) {
mCommChoice.addItem(s);
}
}
mBaudrateChoice.addItem("9600");
mBaudrateChoice.addItem("19200");
mBaudrateChoice.addItem("38400");
mBaudrateChoice.addItem("57600");
mBaudrateChoice.addItem("115200");
}
/**
* 按鈕監聽事件
*/
private void actionListener() {
// 串口
mCommChoice.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
mCommList = SerialPortManager.findPorts();
// 檢查是否有可用串口,有則加入選項中
if (mCommList == null || mCommList.size() < 1) {
ShowUtils.warningMessage("沒有搜索到有效串口!");
} else {
int index = mCommChoice.getSelectedIndex();
mCommChoice.removeAllItems();
for (String s : mCommList) {
mCommChoice.addItem(s);
}
mCommChoice.setSelectedIndex(index);
}
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
// NO OP
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
// NO OP
}
});
// 打開|關閉串口
mSerialPortOperate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("打開串口".equals(mSerialPortOperate.getText()) && mSerialport == null) {
openSerialPort(e);
} else {
closeSerialPort(e);
}
}
});
// 發送資料
mSendData.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendData(e);
}
});
}
/**
* 打開串口
*
* @param evt
* 點擊事件
*/
private void openSerialPort(java.awt.event.ActionEvent evt) {
// 獲取串口名稱
String commName = (String) mCommChoice.getSelectedItem();
// 獲取波特率,默認為9600
int baudrate = 115200;
String bps = (String) mBaudrateChoice.getSelectedItem();
baudrate = Integer.parseInt(bps);
// 檢查串口名稱是否獲取正確
if (commName == null || commName.equals("")) {
ShowUtils.warningMessage("沒有搜索到有效串口!");
} else {
try {
mSerialport = SerialPortManager.openPort(commName, baudrate);
if (mSerialport != null) {
mDataView.setText("串口已打開" + "\r\n");
mSerialPortOperate.setText("關閉串口");
}
} catch (PortInUseException e) {
ShowUtils.warningMessage("串口已被占用!");
}
}
// 添加串口監聽
SerialPortManager.addListener(mSerialport, new SerialPortManager.DataAvailableListener() {
@Override
public void dataAvailable() {
byte[] data = null;
try {
if (mSerialport == null) {
ShowUtils.errorMessage("串口物件為空,監聽失敗!");
} else {
// 讀取串口資料
data = SerialPortManager.readFromPort(mSerialport);
// 以字串的形式接收資料
if (mDataASCIIChoice.isSelected()) {
mDataView.append(new String(data) + "\r\n");
}
// 以十六進制的形式接收資料
if (mDataHexChoice.isSelected()) {
mDataView.append(ByteUtils.byteArrayToHexString(data) + "\r\n");
}
}
} catch (Exception e) {
ShowUtils.errorMessage(e.toString());
// 發生讀取錯誤時顯示錯誤資訊后退出系統
System.exit(0);
}
}
});
}
/**
* 關閉串口
*
* @param evt
* 點擊事件
*/
private void closeSerialPort(java.awt.event.ActionEvent evt) {
SerialPortManager.closePort(mSerialport);
mDataView.setText("串口已關閉" + "\r\n");
mSerialPortOperate.setText("打開串口");
mSerialport = null;
}
/**
* 發送資料
*
* @param evt
* 點擊事件
*/
private void sendData(java.awt.event.ActionEvent evt) {
// 待發送資料
String data = mDataInput.getText().toString();
if (mSerialport == null) {
ShowUtils.warningMessage("請先打開串口!");
return;
}
if ("".equals(data) || data == null) {
ShowUtils.warningMessage("請輸入要發送的資料!");
return;
}
// 以字串的形式發送資料
if (mDataASCIIChoice.isSelected()) {
SerialPortManager.sendToPort(mSerialport, data.getBytes());
}
// 以十六進制的形式發送資料
if (mDataHexChoice.isSelected()) {
SerialPortManager.sendToPort(mSerialport, ByteUtils.hexStr2Byte(data));
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/239229.html
標籤:非技術區
上一篇:請問有會提取微信62資料的嗎
下一篇:登錄攔截
