在做过一年多的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;
-
-
- 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
- {
-
- portId = CommPortIdentifier.getPortIdentifier(portName);
-
-
- 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");
-
-
- serialcomm.start();
- } catch (Exception ex)
- {
- }
- }
-
- }