`
yedaya
  • 浏览: 21301 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用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的协议分析,处理得代码,但老板认为我不务正业,只能以后再私下研究了。

  • 大小: 11.1 KB
  • 大小: 20.3 KB
  • 大小: 38.1 KB
  • 大小: 20.9 KB
0
0
分享到:
评论
2 楼 zbmartin 2014-04-03  
兄弟,我问下,我添加了监听,可是为啥监听那个方法不起作用啊
1 楼 SuperMarioBros 2011-05-10  
哥们 能提供个下载吗 代码不全啊StatusMessage 这个类 就没有啊 谢谢了啊

相关推荐

    rxtx包,用于串口通信

    RXTX库的出现弥补了Java标准库在串口通信方面的不足,提供了丰富的API接口,便于开发人员进行串口数据的读写操作。 二、RXTX的安装与配置 在使用RXTX库之前,首先需要下载对应的版本。例如,mfz-rxtx-2.2-20081207...

    RXTX依赖包.zip

    例如,你可以使用RXTX创建一个简单的串口服务器,监听特定端口的数据,或者向硬件发送命令。 在RXTX2.2版本中,包含了针对不同系统的二进制文件,确保了跨平台兼容性。"mfz-rxtx-2.2-win-x86"是适用于32位Windows...

    RXTX.rar RXTX串口通信包

    RXTX是一个开源的Java库,专门用于实现串行(串行端口)和并行通信。这个“RXTX.rar”压缩包包含了你需要的所有组件,以便在Java应用程序中进行串口通信。当你遇到"The import gnu cannot be resolved"错误时,这...

    Java使用开源Rxtx实现串口通讯 串口开发

    3. **事件监听**:Rxtx支持串口事件,比如数据到达事件、线程中断事件等,开发者可以通过注册监听器来响应这些事件。 4. **异步通信**:Rxtx提供非阻塞的串口通信模式,允许在不阻塞主线程的情况下处理串口数据,这...

    java串口RXTX包

    RXTX库不仅支持基本的串口通信,还提供了高级特性,如事件驱动的通信模式,允许你注册监听器以异步接收数据。此外,RXTX还支持多线程操作,可以在多个线程间安全地共享串口资源。 总之,RXTX库为Java开发者提供了一...

    Springboot + rxtx 实现串口读写应用部分源码

    - 使用 `SerialPortEventListener` 监听串口事件,如数据到达事件,以便实时处理接收到的数据。 - `SerialPortEvent` 类包含了事件类型,如 DATA_AVAILABLE(数据可用)。 5. **线程安全**: - 由于串口操作可能...

    mina-rxtx-2.2 实现串口通讯

    而RXTX则是一个用于Java的串行和并行通信库,它使得Java开发者可以轻松地进行串口编程。本文将深入探讨如何利用MINA与RXTX来实现串口通信。 首先,让我们了解一下RXTX。RXTX是Java中的一个开源项目,它提供了一组...

    Rxtx jar包及Example

    总结一下,Rxtx是一个用于Java串行通信的重要库,它包含jar包和源代码,以及示例代码帮助开发者理解和使用。通过这个库,开发者可以轻松地与串行端口进行数据交换,从而实现各种与硬件设备交互的需求。在实际开发中...

    RXTX资源包

    RXTX串口JAR包,用来开发调用串口的桌面程序,测试好用。

    串口编程rxtx的jar包

    通过RXTX,Java开发者可以使用`gnu.io`包下的类和接口,如`SerialPort`、`CommPortIdentifier`等,实现串口的打开、读写、配置参数等功能。 2. **串口配置**: 在使用RXTX进行串口通信前,需要对串口进行配置,包括...

    关于java Eclipse环境下配置rxtx包的过程-配置成功

    RXTX 包是一个开源的串口通信库,提供了 Java 语言的串口通信接口,支持各种串口设备的通信。 在配置 RXTX 包之前,需要下载 RXTX 包的安装文件,下载地址是 http://rxtx.qbang.org/wiki/index.php/Download。下载...

    rxtx-2.1.7.jar串口通信gnu.io包不存在问题

    例如,以下是一个简单的RXTX串口通信示例: ```java import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; public class Serial...

    rxtx串口通讯总结

    它通过串行接口(如RS-232、USB等)进行一对一的数据交换,适用于短距离、低速率的通信场景。在嵌入式系统、物联网设备、自动化设备等领域,串口通讯有着广泛的应用。 **RXTX库介绍** RXTX是一个开源的Java库,...

    rxtx-2.2串口开发工具包

    本文将深入探讨rxtx-2.2串口开发工具包的使用、配置以及API调用方法。 首先,rxtx-2.2的核心在于其提供的动态链接库(dll)文件和Java类库(jar)文件。其中,rxtxSerial.dll是用于串行通信的动态库,而...

    Java串口通信RXTX包

    3. **事件驱动**:RXTX支持事件驱动的编程模型,可以通过注册监听器来响应串口的数据到达、线程中断等事件。 4. **流处理**:RXTX提供输入流和输出流接口,可以无缝集成到Java的IO框架中,使得串口通信与其他IO操作...

    java-串口操作 rxtx实例

    使用RXTX,你可以实现打开串口、设置波特率、数据位、校验位、停止位,以及发送和接收数据等功能。 在这个实例中,我们看到提到了"单例"设计模式。单例模式确保一个类只有一个实例,并提供一个全局访问点。在串口...

    rxtx串口通信实例

    在IT领域,串口通信是一种常见且重要的通信方式,尤其在设备控制、嵌入式系统以及物联网(IoT)应用中。"RXTX"是一个开源的Java...这个"rxtx串口通信实例"为初学者提供了一个很好的起点,帮助他们快速上手串口通信开发。

    串口开发依赖包 (rxtx/modbus)

    本文将详细讲解与标题“串口开发依赖包 (rxtx/modbus)”相关的知识点,包括rxtx库、Modbus协议、串口开发(RS232和RS485)以及在Linux环境下如何使用这些资源。 首先,**rxtx** 是一个开源Java库,它提供了串行通信...

    JAVA访问串口RXTX包(含演示代码 linux下测试可用)

    JAVA访问串口RXTX包,包含演示代码,windows 64位系统和linux 64位下测试可以使用。演示代码用了netty包,开发工具Idea, windows下安装包方法: a.复制rxtxSerial.dll 到%JAVA_HOME%\jreX/bin/ b.复制RXTXcomm....

Global site tag (gtag.js) - Google Analytics