实例介绍
【实例简介】windows下 如打不开串口的话,请参考这里 https://stackoverflow.com/questions/15955530/commportidentifier-getportidentifiers-is-empty
【实例截图】
【核心代码】
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 = 530; // 程序界面高度 public final int HEIGHT = 390; // 数据显示区 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 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, 505, 200); add(mScrollDataView); // 串口设置 mSerialPortPanel.setBorder(BorderFactory.createTitledBorder("串口设置")); mSerialPortPanel.setBounds(10, 220, 170, 130); 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); // 操作 mOperatePanel.setBorder(BorderFactory.createTitledBorder("操作")); mOperatePanel.setBounds(200, 220, 315, 130); mOperatePanel.setLayout(null); add(mOperatePanel); mDataInput.setBounds(25, 25, 265, 50); 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(180, 95, 90, 20); mOperatePanel.add(mSendData); } /** * 初始化数据 */ private void initData() { mCommList = SerialPortManager.findPorts(); // 检查是否有可用串口,有则加入选项中 if (mCommList == null || mCommList.size() < 1) { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { for (String s : mCommList) { mCommChoice.addItem(s); } } mBaudrateChoice.addItem("4800"); 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(); // 获取波特率,默认为4800 int baudrate = 4800; 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); } }); } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)