- 浏览: 21301 次
- 性别:
- 来自: 北京
最新评论
-
zbmartin:
兄弟,我问下,我添加了监听,可是为啥监听那个方法不起作用啊
使用rxtx扩展包监听串口数据(整合) -
SuperMarioBros:
哥们 能提供个下载吗 代码不全啊StatusMessage 这 ...
使用rxtx扩展包监听串口数据(整合)
最近看了JavaEye中一些有关使用RxTxComm.jar扩展包开发串口监听的代码,正好有个朋友让我做一个这方面的小软件,就把别人的代码整合了一下,做了一个小Demo。
项目结构其他的都是网上的代码,或我自己扩展的未完成的类:
软件可以接收串口传送的数据,显示在state标签后,并将数据返回给发送端。只是在本本上测试通过了,没有在真正的串口设备上测试。
使用了一个串口模拟的软件,模拟了一对串口设备com1,和com2,
使用串口调试助手发送模拟数据。
界面布局使用了GridBagLayout,相关代码在前一篇的博客中。
好了,贴代码了:
package gui; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.TooManyListenersException; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.UnsupportedCommOperationException; import javax.swing.DefaultComboBoxModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; public class SerialPortMoniterPanel extends JPanel implements SerialPortEventListener{ static final String STATE = "STATE: "; static final String COUNT = "COUNT: "; static final String ERROR = "ERROR, PLEASE RETRY !"; static int count = 0; JPanel panel; JLabel commLabel; //端口号 JComboBox commComboBox; JLabel BPSLabel; //波特率 JComboBox BPSComboBox; //BPS JLabel flowInLabel; //Flow Control In 输入流控制 JComboBox flowInBox; JLabel flowOutLabel; //Flow Control Out 输出流控制 JComboBox flowOutBox; JLabel dataBitsLabel; //Data Bits 数据位数 JComboBox dataBitsBox; JLabel stopBitsLabel; //Stop Bits 停止位 JComboBox stopBitsBox; JLabel parityLabel; //Parity 奇偶校验 JComboBox parityBox; JLabel logoLabel; JLabel stateLabel; JLabel countLabel; JButton connButton; static CommPortIdentifier portId; static Enumeration portList; InputStream inputStream; //由串口读入的流 OutputStream outputStream;// 向串口输出的流 SerialPort serialPort; ConnectAction action; Thread buttonThread; public SerialPortMoniterPanel(){ super(new BorderLayout()); initPanel(); add(panel,BorderLayout.CENTER); } public void initPanel(){ GridBagLayout layout = new GridBagLayout(); panel = new JPanel(layout); connButton = new JButton("CONNECTION"); action = new ConnectAction(); connButton.addActionListener(action); stateLabel = new JLabel(STATE); stateLabel.setHorizontalAlignment(JLabel.LEFT); countLabel = new JLabel(COUNT+String.valueOf(count)); countLabel.setHorizontalAlignment(JLabel.LEFT); logoLabel = new JLabel(); Image image = Toolkit.getDefaultToolkit().getImage("logo/logo.png"); Icon icon = new ImageIcon(image); logoLabel.setIcon(icon); commLabel = new JLabel("Port Name"); commComboBox = new JComboBox(getCOMArray().toArray()); BPSLabel = new JLabel("Baud Rate"); Object[] bpsArray = {300,600,1200,2400,4800,9600, 19200,38400,43000,56000, 57600, 115200 }; DefaultComboBoxModel model = new DefaultComboBoxModel(bpsArray); BPSComboBox = new JComboBox(model); flowInLabel = new JLabel("Flow Control In"); flowInBox = new JComboBox(); flowOutLabel = new JLabel("Flow Control Out"); flowOutBox = new JComboBox(); dataBitsLabel = new JLabel("Data Bits"); Object[] dataBitsArray = {8,7,6}; dataBitsBox = new JComboBox(dataBitsArray); stopBitsLabel = new JLabel("Stop Bits"); Object[] stopBitsArray = {1,2}; stopBitsBox = new JComboBox(stopBitsArray); parityLabel = new JLabel("Parity"); Object[] parityArray = {"NONE", "ODD", "EVEN"}; parityBox = new JComboBox(parityArray); GridBagHelper.addComponent(panel, stateLabel, 0, 1, 2, 1, 2, 0, 0.0, 0.0, GridBagConstraints.NONE, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, countLabel, 0, 2, 2, 1, 2, 0, 0.0, 0.0, GridBagConstraints.NONE, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, commLabel, 0, 4, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, commComboBox, 1, 4, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, BPSLabel, 2, 4, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, BPSComboBox, 3, 4, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, flowInLabel, 0, 5, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, flowInBox, 1, 5, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, flowOutLabel, 2, 5, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, flowOutBox, 3, 5, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, dataBitsLabel, 0, 6, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, dataBitsBox, 1, 6, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, stopBitsLabel, 2, 6, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, stopBitsBox, 3, 6, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, parityLabel, 0, 7, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, parityBox, 1, 7, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, logoLabel, 4, 4, 1, 4, 1, 0, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.EAST); GridBagHelper.addComponent(panel, connButton, 4, 8, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.BOTH, GridBagConstraints.WEST); } public static ArrayList<String> getCOMArray(){ ArrayList<String> comList = new ArrayList<String>(); portList = CommPortIdentifier.getPortIdentifiers(); //System.out.println(portList.toString()); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); //System.out.println(portId.getName()); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { comList.add(portId.getName()); } } return comList; } @Override public void serialEvent(SerialPortEvent event) { // TODO Auto-generated method stub switch (event.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: //声明一个20个字节的缓冲区。 byte[] readBuffer = new byte[20]; try { stateLabel.setText(STATE); int numBytes = 0; while (inputStream.available() > 0) { //将数据读入readBuffer中。 numBytes = inputStream.read(readBuffer); } stateLabel.setText(STATE+(new String(readBuffer)).trim()); System.out.println(new String(readBuffer).trim()); outputStream.write(readBuffer); //计数 count++; countLabel.setText(COUNT+String.valueOf(count)); } catch (IOException e) { System.out.println(e); } break; } } public void initConnect(){ try { serialPort = (SerialPort) portId.open("myapp", 2000);// 打开串口名字为myapp,延迟为2毫秒 } catch (PortInUseException e) { JOptionPane.showMessageDialog(null, ERROR); System.exit(0); } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { JOptionPane.showMessageDialog(null, ERROR); System.exit(0); } try { serialPort.addEventListener(this); // 给当前串口天加一个监听器 } catch (TooManyListenersException e) { JOptionPane.showMessageDialog(null, ERROR); System.exit(0); } serialPort.notifyOnDataAvailable(true); // 当有数据时通知 try { int bps = Integer.parseInt(String.valueOf(BPSComboBox.getSelectedItem())); //System.out.println(bps); serialPort.setSerialPortParams(bps, SerialPort.DATABITS_8, // 设置串口读写参数 SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); //serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN|SerialPort.FLOWCONTROL_RTSCTS_OUT); } catch (UnsupportedCommOperationException e) { JOptionPane.showMessageDialog(null, ERROR); System.exit(0); } JOptionPane.showMessageDialog(null, "CONNECTION SUCCESS"); } //联接事件 class ConnectAction implements Runnable, ActionListener { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if(null != buttonThread){ return; }else{ buttonThread = new Thread(this); buttonThread.start();//开启线程 } } @Override public void run() { // TODO Auto-generated method stub if(null != serialPort){ serialPort.close(); } String comString = String.valueOf(commComboBox.getSelectedItem()); try { portList = CommPortIdentifier.getPortIdentifiers(); // 得到当前连接上的端口 while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判断如果端口类型是串口 if (portId.getName().equals(comString)) { // 判断如果COM3端口已经启动就连接 initConnect(); } } } } catch (Exception e) { e.printStackTrace(); } buttonThread = null; } } }
对话框类:
package gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class CurrentStatePanel extends JPanel{ static int LENGTH = 16; JPanel panel; JLabel nameLabel; JLabel countLabel; JLabel stateLabel; StatusMessage message ; StatusMessage oldMessage; ArrayList<Integer>countList; public CurrentStatePanel(StatusMessage message){ super(new BorderLayout()); countList = new ArrayList<Integer>(); for(int i=0; i<LENGTH; i++){ countList.add(0); } this.message = message; this.oldMessage = message; refreshPanel(message); } public void refreshPanel(StatusMessage message){ this.removeAll(); initPanel(message); } public void initPanel(StatusMessage message){ GridBagLayout layout = new GridBagLayout(); panel = new JPanel(layout); panel.setBorder(BorderFactory.createTitledBorder("Current Status")); Image image = Toolkit.getDefaultToolkit().getImage("logo/on.png"); Icon onIcon = new ImageIcon(image); image = Toolkit.getDefaultToolkit().getImage("logo/off.png"); Icon offIcon = new ImageIcon(image); if(message.statusList.size()==0){ for(int i=0; i<LENGTH; i++){ message.statusList.add((byte)1); } } for(int i=0; i<LENGTH; i++){ if(message.statusList.get(i) != oldMessage.statusList.get(i)){ int temp = countList.get(i); countList.set(i, ++temp); //System.out.print(temp); } nameLabel = new JLabel(String.valueOf(i)); stateLabel = new JLabel(); stateLabel.setBorder(BorderFactory.createLoweredBevelBorder()); stateLabel.setIcon(message.statusList.get(i).byteValue()==1?onIcon:offIcon); countLabel = new JLabel(String.valueOf(countList.get(i))); GridBagHelper.addComponent(panel, nameLabel, i, 1, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.NONE, GridBagConstraints.CENTER); GridBagHelper.addComponent(panel, stateLabel, i, 2, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.NONE, GridBagConstraints.WEST); GridBagHelper.addComponent(panel, countLabel, i, 3, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.NONE, GridBagConstraints.CENTER); } add(panel,BorderLayout.CENTER); panel.repaint(); panel.revalidate(); oldMessage = message; } public static void main(String[] args){ JFrame frame = new JFrame(); frame.setSize(new Dimension(300,300)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final StatusMessage message = new StatusMessage(); final CurrentStatePanel panel = new CurrentStatePanel(message); frame.add(panel); frame.setVisible(true); JButton button = new JButton("change"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub StatusMessage message2 = new StatusMessage(); message2.statusList.clear(); for(int i=0; i<16; i++){ Random random = new Random(); message2.statusList.add((byte)(random.nextInt(2))); } panel.refreshPanel(message2); } }); frame.add(button,BorderLayout.NORTH); } }
本来还想写一些对ModBus的协议分析,处理得代码,但老板认为我不务正业,只能以后再私下研究了。
评论
2 楼
zbmartin
2014-04-03
兄弟,我问下,我添加了监听,可是为啥监听那个方法不起作用啊
1 楼
SuperMarioBros
2011-05-10
哥们 能提供个下载吗 代码不全啊StatusMessage 这个类 就没有啊 谢谢了啊
发表评论
-
Swing 动态错误提示框
2012-09-17 16:14 2529最近写了个swing 动态提示错误的提示框,本来想放在项目中的 ... -
java TextField 遇到的问题
2012-09-14 10:26 2489最近做swing开发,发现一个问题,不知道是java特意为之, ... -
获取系统分辨率(备忘)
2010-07-06 17:00 1038GraphicsDevice gd = GraphicsEnv ... -
Timer (备忘)
2010-07-06 09:35 644import java.awt.Dimension; imp ... -
使用定制JCheckBox 实现 “伪”三态复选框
2010-06-22 15:24 1653项目本来需要一个带有复选框的树形控件,于是我找到了JIDE里的 ... -
GridBagLayout 小结
2010-06-19 21:54 1749整合GridBagLayout 的使用从网上找Java Loo ... -
Swing 多线程 解决界面blocking
2010-06-19 21:51 961不要阻塞GUI通常我们在教程中看到添加一个按钮事件:①:but ...
相关推荐
RXTX库的出现弥补了Java标准库在串口通信方面的不足,提供了丰富的API接口,便于开发人员进行串口数据的读写操作。 二、RXTX的安装与配置 在使用RXTX库之前,首先需要下载对应的版本。例如,mfz-rxtx-2.2-20081207...
例如,你可以使用RXTX创建一个简单的串口服务器,监听特定端口的数据,或者向硬件发送命令。 在RXTX2.2版本中,包含了针对不同系统的二进制文件,确保了跨平台兼容性。"mfz-rxtx-2.2-win-x86"是适用于32位Windows...
RXTX是一个开源的Java库,专门用于实现串行(串行端口)和并行通信。这个“RXTX.rar”压缩包包含了你需要的所有组件,以便在Java应用程序中进行串口通信。当你遇到"The import gnu cannot be resolved"错误时,这...
3. **事件监听**:Rxtx支持串口事件,比如数据到达事件、线程中断事件等,开发者可以通过注册监听器来响应这些事件。 4. **异步通信**:Rxtx提供非阻塞的串口通信模式,允许在不阻塞主线程的情况下处理串口数据,这...
RXTX库不仅支持基本的串口通信,还提供了高级特性,如事件驱动的通信模式,允许你注册监听器以异步接收数据。此外,RXTX还支持多线程操作,可以在多个线程间安全地共享串口资源。 总之,RXTX库为Java开发者提供了一...
- 使用 `SerialPortEventListener` 监听串口事件,如数据到达事件,以便实时处理接收到的数据。 - `SerialPortEvent` 类包含了事件类型,如 DATA_AVAILABLE(数据可用)。 5. **线程安全**: - 由于串口操作可能...
而RXTX则是一个用于Java的串行和并行通信库,它使得Java开发者可以轻松地进行串口编程。本文将深入探讨如何利用MINA与RXTX来实现串口通信。 首先,让我们了解一下RXTX。RXTX是Java中的一个开源项目,它提供了一组...
总结一下,Rxtx是一个用于Java串行通信的重要库,它包含jar包和源代码,以及示例代码帮助开发者理解和使用。通过这个库,开发者可以轻松地与串行端口进行数据交换,从而实现各种与硬件设备交互的需求。在实际开发中...
RXTX串口JAR包,用来开发调用串口的桌面程序,测试好用。
通过RXTX,Java开发者可以使用`gnu.io`包下的类和接口,如`SerialPort`、`CommPortIdentifier`等,实现串口的打开、读写、配置参数等功能。 2. **串口配置**: 在使用RXTX进行串口通信前,需要对串口进行配置,包括...
RXTX 包是一个开源的串口通信库,提供了 Java 语言的串口通信接口,支持各种串口设备的通信。 在配置 RXTX 包之前,需要下载 RXTX 包的安装文件,下载地址是 http://rxtx.qbang.org/wiki/index.php/Download。下载...
例如,以下是一个简单的RXTX串口通信示例: ```java import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; public class Serial...
它通过串行接口(如RS-232、USB等)进行一对一的数据交换,适用于短距离、低速率的通信场景。在嵌入式系统、物联网设备、自动化设备等领域,串口通讯有着广泛的应用。 **RXTX库介绍** RXTX是一个开源的Java库,...
本文将深入探讨rxtx-2.2串口开发工具包的使用、配置以及API调用方法。 首先,rxtx-2.2的核心在于其提供的动态链接库(dll)文件和Java类库(jar)文件。其中,rxtxSerial.dll是用于串行通信的动态库,而...
3. **事件驱动**:RXTX支持事件驱动的编程模型,可以通过注册监听器来响应串口的数据到达、线程中断等事件。 4. **流处理**:RXTX提供输入流和输出流接口,可以无缝集成到Java的IO框架中,使得串口通信与其他IO操作...
使用RXTX,你可以实现打开串口、设置波特率、数据位、校验位、停止位,以及发送和接收数据等功能。 在这个实例中,我们看到提到了"单例"设计模式。单例模式确保一个类只有一个实例,并提供一个全局访问点。在串口...
在IT领域,串口通信是一种常见且重要的通信方式,尤其在设备控制、嵌入式系统以及物联网(IoT)应用中。"RXTX"是一个开源的Java...这个"rxtx串口通信实例"为初学者提供了一个很好的起点,帮助他们快速上手串口通信开发。
本文将详细讲解与标题“串口开发依赖包 (rxtx/modbus)”相关的知识点,包括rxtx库、Modbus协议、串口开发(RS232和RS485)以及在Linux环境下如何使用这些资源。 首先,**rxtx** 是一个开源Java库,它提供了串行通信...
JAVA访问串口RXTX包,包含演示代码,windows 64位系统和linux 64位下测试可以使用。演示代码用了netty包,开发工具Idea, windows下安装包方法: a.复制rxtxSerial.dll 到%JAVA_HOME%\jreX/bin/ b.复制RXTXcomm....