import gnu.io.*;import java.io.*;import java.util.*;

@SuppressWarnings("rawtypes")public class SerialReader extends Observable implementsRunnable,SerialPortEventListener{staticCommPortIdentifier portId;int delayRead = 100;int numBytes; //buffer中的实际数据字节数

private static byte[] readBuffer = new byte[1024]; //缓存串口读入的数据

staticEnumeration portList;

InputStream inputStream;

OutputStream outputStream;staticSerialPort serialPort;

HashMap serialParams;

Thread readThread;//端口是否打开了

boolean isOpen = false;//端口读入数据事件触发后,等待n毫秒后再读取,以便让数据一次性读完

public static final String PARAMS_DELAY = "delay read"; //延时等待端口数据准备的时间

public static final String PARAMS_TIMEOUT = "timeout"; //超时时间

public static final String PARAMS_PORT = "port name"; //端口名称

public static final String PARAMS_DATABITS = "data bits"; //数据位

public static final String PARAMS_STOPBITS = "stop bits"; //停止位

public static final String PARAMS_PARITY = "parity"; //奇偶校验

public static final String PARAMS_RATE = "rate"; //波特率

public booleanisOpen(){returnisOpen;

}/*** 初始化端口操作的参数.

*@throwsSerialPortException

*

*@see

*/

publicSerialReader(){

isOpen= false;

}public voidopen(HashMap params){

serialParams=params;if(isOpen){

close();

}try{//参数初始化

int timeout =Integer.parseInt( serialParams.get( PARAMS_TIMEOUT )

.toString() );int rate =Integer.parseInt( serialParams.get( PARAMS_RATE )

.toString() );int dataBits =Integer.parseInt( serialParams.get( PARAMS_DATABITS )

.toString() );int stopBits =Integer.parseInt( serialParams.get( PARAMS_STOPBITS )

.toString() );int parity =Integer.parseInt( serialParams.get( PARAMS_PARITY )

.toString() );

delayRead=Integer.parseInt( serialParams.get( PARAMS_DELAY )

.toString() );

String port=serialParams.get( PARAMS_PORT ).toString();//打开端口

portId =CommPortIdentifier.getPortIdentifier( port );

serialPort= ( SerialPort ) portId.open( "SerialReader", timeout );

inputStream=serialPort.getInputStream();

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

serialPort.setSerialPortParams( rate, dataBits, stopBits, parity );

isOpen= true;

}catch( PortInUseException e ){System.out.println("端口"+serialParams.get( PARAMS_PORT ).toString()+"已经被占用"+e);

}catch( TooManyListenersException e ){System.out.println("端口"+serialParams.get( PARAMS_PORT ).toString()+"监听者过多"+e);

}catch( UnsupportedCommOperationException e ){System.out.println("端口操作命令不支持"+e);

}catch( NoSuchPortException e ){System.out.println("端口"+serialParams.get( PARAMS_PORT ).toString()+"不存在"+e);

}catch( IOException e ){System.out.println("打开端口"+serialParams.get( PARAMS_PORT ).toString()+"失败"+e);

}

serialParams.clear();

Thread readThread= new Thread( this);

readThread.start();

}public voidrun(){try{

Thread.sleep(50);

}catch( InterruptedException e ){

e.printStackTrace();

}

}public voidstart(){try{

outputStream=serialPort.getOutputStream();

}catch(IOException e) {

e.printStackTrace();

}try{

readThread= new Thread(this);

readThread.start();

}catch(Exception e) {

e.printStackTrace();

}

}//start() end

public voidrun(String message) {try{

Thread.sleep(4);

}catch(InterruptedException e) {

e.printStackTrace();

}try{if(message!=null&&message.length()!=0)

{

System.out.println("发送数据:"+message);

outputStream.write(message.getBytes());//往串口发送数据,是双向通讯的。

}

}catch(IOException e) {

e.printStackTrace();

}

}public voidclose(){if(isOpen){try{

serialPort.notifyOnDataAvailable(false);

serialPort.removeEventListener();

inputStream.close();

serialPort.close();

isOpen= false;

}catch(IOException ex){

ex.printStackTrace();

System.out.println("关闭串口失败");

}

}

}public voidserialEvent( SerialPortEvent event ){try{

Thread.sleep( delayRead );

}catch( InterruptedException e ){

e.printStackTrace();

}switch( event.getEventType() ){case SerialPortEvent.BI: //10

case SerialPortEvent.OE: //7

case SerialPortEvent.FE: //9

case SerialPortEvent.PE: //8

case SerialPortEvent.CD: //6

case SerialPortEvent.CTS: //3

case SerialPortEvent.DSR: //4

case SerialPortEvent.RI: //5

case SerialPortEvent.OUTPUT_BUFFER_EMPTY: //2

break;case SerialPortEvent.DATA_AVAILABLE: //1

try{//多次读取,将所有数据读入

while (inputStream.available() > 0) {

numBytes=inputStream.read(readBuffer);

}//打印接收到的字节数据的ASCII码

for(int i=0;i

}//numBytes = inputStream.read( readBuffer );

changeMessage( readBuffer, numBytes );

}catch( IOException e ){

e.printStackTrace();

}break;

}

}//通过observer pattern将收到的数据发送给observer//将buffer中的空字节删除后再发送更新消息,通知观察者

public void changeMessage( byte[] message, intlength ){

setChanged();byte[] temp = new byte[length];

System.arraycopy( message,0, temp, 0, length );

notifyObservers( temp );

}public voidopenSerialPort(String message){

HashMap params = new HashMap();

String port="COM1";

String rate= "9600";

String dataBit= ""+SerialPort.DATABITS_8;

String stopBit= ""+SerialPort.STOPBITS_1;int parityInt =SerialPort.PARITY_NONE;

params.put( SerialReader.PARAMS_PORT, port );//端口名称

params.put( SerialReader.PARAMS_RATE, rate ); //波特率

params.put( SerialReader.PARAMS_DATABITS,dataBit ); //数据位

params.put( SerialReader.PARAMS_STOPBITS, stopBit ); //停止位

params.put( SerialReader.PARAMS_PARITY, parityInt ); //无奇偶校验

params.put( SerialReader.PARAMS_TIMEOUT, 100 ); //设备超时时间 1秒

params.put( SerialReader.PARAMS_DELAY, 100 ); //端口数据准备时间 1秒

try{

open(params);//打开串口//LoginFrame cf=new LoginFrame();//addObserver(cf);//也可以像上面一个通过LoginFrame来绑定串口的通讯输出.

if(message!=null&&message.length()!=0)

{

String str="";for(int i=0;i<10;i++)

{

str+=message;

}

start();

run(str);

}

}catch(Exception e) {

e.printStackTrace();

}

}

}

rxtx for java_RXTX串口通信 java相关推荐

  1. 使用RXTX实现简单串口通信调试工具

    最终效果如下图: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.RXTXcomm.jar 添加到项目类库中. packag ...

  2. java 串口波特率_JAVA串口通信的方法

    以前经常用C语言操作串口,实现一些发送接收之类的小功能,最近项目中也用到了串口通信,不过语言变成了Java,这个搞起来略蛋疼. Java说起来就是各种库各种引用,所以得到某些需求先google搜一把~ ...

  3. java linux 串口_Linux Java 串口通信 | 学步园

    费了好大的劲搞定Linux系统上用Java写串口通信的问题. jdk中没有原生的串口api,网上找了半天的资料,大概知道了:Linux系统上用Java写串口程序,有两个包比较常用,一个是当年sun官方 ...

  4. java comm api_java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 首先确定你安装的JDK的位数,安装相应位数的jar包. 将rxtxSerial.dll.rxtxParallel.dll复制到\j ...

  5. java comm jar_java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64 下载地址:http://download.csdn.net/downl ...

  6. Java 如何串口通信以及常见报错解决

    文章目录 一.Java 串口通信部署 准备 部署 1. 配置 Java 环境 2. 新建项目,引入依赖. 3. 代码(网上荡的) 运行 二.Java 串口通信报错 1. JDK 有关错误 2. dll ...

  7. JAVA与下位机传感器进行DTU串口通信并将数据插入数据库

    最近在做一个物联网项目,需求是将传感器数据在无网络的环境下收集到服务器.思前想后,决定走DTU通信. 前提: 1.DTU相关配置请自行百度,本项目使用的是原子云4G DTU,需要准备4G物联网卡. 相 ...

  8. Java通过串口通信实现温度监测

    开发环境  JDK1.8 + Rxtx2.1.7 + Eclipse 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐 ...

  9. 基于java的串口通信

    文章目录 前言 一.RXTX是什么? 二.环境搭建 引入库 三.代码实现 SerialPortManager类 Tools类 重要代码解析 读取数据 写数据 写EPC号 询查单张标签 CRC校验 测试 ...

  10. java基于RXTXcomm.jar的串口通信

    java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64       下载地址:http://download.csdn.net ...

最新文章

  1. 五 Django 1.5.4 User Authentication 用户认证
  2. c语言实践 1/1+1/2+1/3+1/4+...+1/n
  3. Android相机的实现
  4. 前端学习(2122):项目演示
  5. ListView和SlidingDrawer
  6. Cannot find class [xxx] for bean with name ‘‘ defined in class
  7. matlab2c使用c++实现matlab函数系列教程- polyval函数
  8. RxJava -- 从 create 开始 (一)
  9. (1)、win10 本地 安装 rabbitmq
  10. javascript如何设置名字输入不合法
  11. 张尧学等人获奖,理由不充分
  12. 一名2012计算机应届毕业生的求职之路
  13. 计算分辨率长宽比(等比例缩放)
  14. kotlin读取文件算法
  15. linux服务器网络不稳定,Linux服务器故障排查指南7:网络缓慢状况
  16. FileZilla FTP服务器源代码分析
  17. 将自己写的网站发布到外网sunny-ngrok
  18. DBLINK使用的思考
  19. 如何关闭windows10易升更新程程序
  20. ThreeJs 打包完成贴图贴图消失问题

热门文章

  1. 差分编码 matlab,差分编码FSK调制解调matlab源程序.doc
  2. DEDECMS5.7自动采集更新伪原创插件高级版GBK
  3. “双态IT”成就业务“互联网+”转型
  4. VS2015编译eXosip2-4.1.0 osip2-4.1.0
  5. opencms学习笔记
  6. 墨卡托与经纬度转换工具
  7. 网易im 服务器消息格式,网易云信快速集成以及消息类型自定义
  8. centos安装office及PDF阅读器
  9. 如何集中远程管理各种USB设备,还不了解一下?
  10. ASP.NET程序设计_新闻发布系统