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]目录下
并将拷贝文件释放权限给所有用户
环境搭建好后开始写代码实现
Java代码
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)
{
}
}
}
转载于:https://blog.51cto.com/lujinxiong/1844844
JAVA操作串口有感相关推荐
- JAVA 操作 SCL2008 大屏幕(含SDK开发包和代码示例)
JAVA 操作 SCL2008 大屏幕 一. 下载SDK开发包和一些依赖的DLL动态链接库 在 pom.xml 中新增 RXTX 依赖: <!-- java 操作串口包 --> <d ...
- java开发串口步骤
在做过一年多的RXTX操作串口项目有现在把一些平时遇到的问题在这里写写: RXTX是一个开源包,主要是在COMM开源包中做扩张,以前的COMM包只能在WINDOWS下面对串口或并口做操作,扩充后的R ...
- 利用Java实现串口全双工通讯
一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统.本文介绍了一个简单的通过串口实现全 ...
- java 全双工服务器_利用Java实现串口全双工通讯_JAVA实例教程_IT部落
本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程 一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系 ...
- java串口发送十六进制数,本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与接收。 源码:...
本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下 1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码:SerialPortDemo 效果图如下: ...
- Java读取串口数据
本文主要实现读取员工刷卡信息 将淘宝买的刷卡IC卡读取器插入Windows笔记本的USB接口,安装驱动,设备管理器会自动添加一个模拟的COM3串口 本次使用的Java环境为 java version ...
- java读写串口数据
本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...
- 基于java的串口通信
文章目录 前言 一.RXTX是什么? 二.环境搭建 引入库 三.代码实现 SerialPortManager类 Tools类 重要代码解析 读取数据 写数据 写EPC号 询查单张标签 CRC校验 测试 ...
- java 实现串口通信
最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳.java也可以操作硬件? 后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便. 特拿出来和大家一起分 ...
最新文章
- java char 默认值_java 中char 的初始值
- 使用subprocessm模块管理进程
- racte margin 居中 失效_上干货,微信用情侣签名她肯定很开心,微信个性签名居中隐藏技巧...
- eclipse中查看某个方法(函数)被谁调用
- 表单和字都居中_APP 分享 | 6 款黑科技工具,低调收藏,每一款都很强大!
- 收藏 | 深度学习检测小目标常用方法
- 特斯拉副总裁回应“质量不合格”报道:离谱 已准备起诉
- 使用Gitosis搭建Git服务器
- 游戏设计亦或课件设计
- License Server Version 11.9 Installation on Windows Server 2003 Hangs
- ntp时间同步软件_NTP服务器的搭建和时间同步
- gnuwin32从全量备份中单表还原_入门MySQL——备份与恢复
- 易语言PHP非对称加密,openssl调用大集合[易语言源码] | 贝贝吧
- c语言实现61850协议,C语言实现61850库实现代码
- 【射频识别技术】期末重点整理
- iOS Socket 客户端 基本使用
- 北大计算机python教程_北京大学数据结构与算法(C++版),全套视频教程学习资料通过百度云网盘下载...
- NMOS与PMOS的区分及使用
- 系统清理维护与安全防护软件
- python序列类型映射_python学习笔记(基础:变量,序列,映射) | 学步园
热门文章
- django-celery beat报错 error pid
- 机电传动控制 第一周作业
- Flume-NG源码阅读之Interceptor(原创)
- Linux Kernel代码艺术——数组初始化
- C#算法 质因数 最大公约数与最小公倍数
- 炼丹手册——数据增广
- 离线在远程linux服务器配置vscode-python环境以及在容器中配置
- php 7 中对数值 * 100 出现很多小数_PHP快速入门第二讲:数据类型
- html4 form日期,bootstrap4日期时间选择器插件
- mysql有哪些特色SQL语句_Linux-MySQL-有哪些常用sql语句