JAVA操作串口有感

简介:
在做过一年多的RXTX操作串口项目有现在把一些平时遇到的问题在这里写写: 
RXTX是一个开源包,主要是在COMM开源包中做扩张,以前的COMM包只能在WINDOWS下面对串口或并口做操作,扩充后的RXTX可以在LINUX和MAC下对串口和并口做操作。  现在跨平台: 

在RXTX网站下载JAR包和动态库 
http://users.frii.com/jarvi/rxtx/download.html 

下载后配置环境 

Windows 

拷贝RXTXcomm.jar 文件到 \jre\lib\ext 目录下 
拷贝rxtxSerial.dll文件到 \jre\bin目录下 

Mac OS X (x86 and ppc) (there is an Installer with the source) 

MAC下面我自己没有配置环境成功,后来找一个MAC下RXTX的安装把环境配置好的。 
http://www.jdivelog.org/how-to/mac-os-x/下载安装环境配置文件RXTX_Tiger.pkg 

Linux (only x86, x86_64, ia64 here but more in the ToyBox) 

拷贝RXTXcomm.jar 文件到 /jre/lib/ext 目录下 
拷贝librxtxSerial.so 文件到 /jre/lib/[machine type] (i386 for instance)目录下 
并将拷贝文件释放权限给所有用户 

Solaris (sparc only so far) 

拷贝RXTXcomm.jar 文件到 /jre/lib/ext 目录下 
拷贝librxtxSerial.so 文件到 /jre/lib/[machine type]目录下 
并将拷贝文件释放权限给所有用户 

环境搭建好后开始写代码实现 

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TooManyListenersException;

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

public class SerialComm implements SerialPortEventListener, Runnable
{
	public final static String PORT_OWER = "MonitorApp";

	private boolean isOpen;

	private boolean isStart;

	private boolean isSave;

	private boolean isPrint;

	private Thread readThread;

	private String portName;

	private String portAddress;

	private CommPortIdentifier portId;

	private SerialPort serialPort;

	private DataInputStream inputStream;

	private OutputStream outputStream;

	private SimpleDateFormat formatter;

	// prase data with process
	private String dataProtocol;

	private Object readWriteLock = new Object();


	public SerialComm() {
		isOpen = false;
		isStart = false;
		isSave = true;
		isPrint = false;
		formatter = new SimpleDateFormat("[yyyy-MM-dd hh:mm:ss,SSS]");

		portName = "COM1";
		portAddress = "LOCAL";
		dataProtocol = "Gooseli";
	}

	public void init(String port, String protocol) throws Exception
	{
		portName = port;
		portAddress = portName;
		dataProtocol = protocol;

		init();
	}

	public void init(String port, String address, String protocol) throws Exception
	{
		portName = port;
		portAddress = address;
		dataProtocol = protocol;

		init();
	}

	public void init() throws IOException, Exception, Exception
	{
		if (isOpen)
		{
			close();
		}

		try
		{
			//传送串口名创建CommPortIdentifier对象服务。
			portId = CommPortIdentifier.getPortIdentifier(portName);

			//使用portId对象服务打开串口,并获得串口对象
			serialPort = (SerialPort) portId.open(PORT_OWER, 2000);

			//通过串口对象获得读串口流对象
			inputStream = new DataInputStream(serialPort.getInputStream());

			//通过串口对象获得写串口流对象
			outputStream = serialPort.getOutputStream();

			isOpen = true;
		} catch (NoSuchPortException ex)
		{
			throw new Exception(ex.toString());
		} catch (PortInUseException ex)
		{
			throw new Exception(ex.toString());
		}
	}

	public void start() throws Exception
	{
		if (!isOpen)
		{
			throw new Exception(portName + " has not been opened.");
		}

		try
		{
			//创建对象线程
			readThread = new Thread(this);
			readThread.start();

			//设置串口数据时间有效
			serialPort.notifyOnDataAvailable(true);

			//增加监听
			serialPort.addEventListener(this);

			isStart = true;

		} catch (TooManyListenersException ex)
		{
			throw new Exception(ex.toString());
		}
	}

	public void run()
	{
		String at = "at^hcmgr=1\r";

		String strTemp = at + (char) Integer.parseInt("1a", 16) + "z";

		writeComm(strTemp);
		isPrint = true;
	}

	public void stop()
	{
		if (isStart)
		{
			serialPort.notifyOnDataAvailable(false);
			serialPort.removeEventListener();

			isStart = false;
		}
	}

	public void close()
	{
		stop();

		if (isOpen)
		{
			try
			{
				inputStream.close();
				outputStream.close();
				serialPort.close();

				isOpen = false;
			} catch (IOException ex)
			{
			}
		}
	}

	//如果串口有数据上报则主动调用此方法
	public void serialEvent(SerialPortEvent event)
	{
		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:
			readComm();
			break;
		default:
			break;
		}
	}

	public void readComm()
	{
		StringBuffer readBuffer = new StringBuffer();
		String scannedInput = "";
		Date currentTime = null;
		String TimeStamp = "";
		int c;
		char a;
		try
		{
			InputStreamReader fis = new InputStreamReader(inputStream, "utf-8");
			while ((c = fis.read()) != -1)
			{
				readBuffer.append((char) c);
			}
			scannedInput = readBuffer.toString().trim();
			currentTime = new Date();

			TimeStamp = formatter.format(currentTime);

		} catch (IOException ex)
		{
			ex.printStackTrace();

		} catch (Exception ex)
		{

			ex.printStackTrace();
		}

	}

	public void writeComm(String outString)
	{
		synchronized (readWriteLock)
		{
			try
			{
				outputStream.write(outString.getBytes());
			} catch (IOException ex)
			{

			}
		}
	}

	public static void main(String[] args)
	{
		SerialComm serialcomm = new SerialComm();

		try
		{
			serialcomm.init("COM3", "Air");// windows下测试端口
			
			// serialcomm.init("/dev/ttyUSB0", "Air");//linux下测试端口
			serialcomm.start();
		} catch (Exception ex)
		{
		}
	}

}


相关文章
|
1月前
|
存储 Java 数据处理
|
3月前
|
SQL Java 数据库连接
java链接hive数据库实现增删改查操作
java链接hive数据库实现增删改查操作
146 0
|
4月前
|
Java API
java 操作es api
java 操作es api
44 0
|
3月前
|
消息中间件 Java
Java操作RabbitMQ单一生产-消费者模式
Java操作RabbitMQ单一生产-消费者模式
31 0
|
1天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
23 2
|
1月前
|
自然语言处理 Java
这是什么操作?java中的变量竟然可以先使用后声明?
这是什么操作?java中的变量竟然可以先使用后声明?
14 0
|
1月前
|
SQL Java
使用java中的String类操作复杂的字符串
使用java中的String类操作复杂的字符串
9 0
|
1月前
|
Java
java操作字符串
java操作字符串
9 1
|
1月前
|
SQL Java 关系型数据库
Java查询操作
Java查询操作
9 0
|
2月前
|
存储 Java
java Map集合相关介绍和方法使用操作
java Map集合相关介绍和方法使用操作
21 2