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

本文实例为大家分享了Java使用开源Rxtx实现串口通讯的具体代码,供大家参考,具体内容如下

使用方法:

windows平台:

1、把rxtxParallel.dll、rxtxSerial.dll拷贝到:C:\WINDOWS\system32下。

2、如果是在开发的时候(JDK),需要把RXTXcomm.jar、rxtxParallel.dll、rxtxSerial.dll拷贝到..\jre...\lib\ext下;如:D:\Program Files\Java\jre1.6.0_02\lib\ext

3、而且需要把项目1.右键->2.Preperties(首选项)->3.Java Build Path->4.Libraries->5.展开RXTXcomm.jar->6.Native library location:(None)->7.浏览External Folder(选择至该项目的lib文件夹,如:E:/Item/MyItem/WebRoot/WEB-INF/lib).

import gnu.io.*;
import java.io.*;
import java.util.*;
import com.call.dao.*;

 public class SerialReader extends Observable implements Runnable,SerialPortEventListener
 {
 static CommPortIdentifier portId;
 int delayRead = 100;
 int numBytes; // buffer中的实际数据字节数
 private static byte[] readBuffer = new byte[1024]; // 4k的buffer空间,缓存串口读入的数据
 static Enumeration portList;
 InputStream inputStream;
 OutputStream outputStream;
 static SerialPort serialPort;
 HashMap serialParams;
 Thread readThread;//本来是static类型的
 //端口是否打开了
 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 boolean isOpen(){
  return isOpen;
 }
 /**
  * 初始化端口操作的参数.
  * @throws SerialPortException
  *
  * @see
  */
 public SerialReader()
 {
  isOpen = false;
 }

 public void open(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 )
  {
   // 端口"+serialParams.get( PARAMS_PORT ).toString()+"已经被占用";
  }
  catch ( TooManyListenersException e )
  {
   //"端口"+serialParams.get( PARAMS_PORT ).toString()+"监听者过多";
  }
  catch ( UnsupportedCommOperationException e )
  {
   //"端口操作命令不支持";
  }
  catch ( NoSuchPortException e )
  {
   //"端口"+serialParams.get( PARAMS_PORT ).toString()+"不存在";
  }
  catch ( IOException e )
  {
   //"打开端口"+serialParams.get( PARAMS_PORT ).toString()+"失败";
  }
  serialParams.clear();
  Thread readThread = new Thread( this );
  readThread.start();
 }

 public void run()
 {
  try
  {
   Thread.sleep(50);
  }
  catch ( InterruptedException e )
  {
  }
 }
 public void start(){
  try {
  outputStream = serialPort.getOutputStream();
   }
 catch (IOException e) {}
 try{
  readThread = new Thread(this);
  readThread.start();
 }
 catch (Exception e) { }
 } //start() end

 public void run(String message) {
 try {
  Thread.sleep(4);
   }
  catch (InterruptedException e) { }
  try {
  if(message!=null&&message.length()!=0)
  {
  System.out.println("run message:"+message);
   outputStream.write(message.getBytes());
  }
 } catch (IOException e) {}
 } 

 public void close()
 {
  if (isOpen)
  {
   try
   {
    serialPort.notifyOnDataAvailable(false);
    serialPort.removeEventListener();
    inputStream.close();
    serialPort.close();
    isOpen = false;
   } catch (IOException ex)
   {
   //"关闭串口失败";
   }
  }
 }

 public void serialEvent( 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;i++){
      // System.out.println("msg[" + numBytes + "]: [" +readBuffer[i] + "]:"+(char)readBuffer[i]);
      }
//     numBytes = inputStream.read( readBuffer );
     changeMessage( readBuffer, numBytes );
    }
    catch ( IOException e )
    {
     e.printStackTrace();
    }
    break;
  }
 }
 // 通过observer pattern将收到的数据发送给observer
 // 将buffer中的空字节删除后再发送更新消息,通知观察者
 public void changeMessage( byte[] message, int length )
 {
  setChanged();
  byte[] temp = new byte[length];
  System.arraycopy( message, 0, temp, 0, length );
  notifyObservers( temp );
 }
 static void listPorts()
 {
  Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
  while ( portEnum.hasMoreElements() )
  {
   CommPortIdentifier portIdentifier = ( CommPortIdentifier ) portEnum
    .nextElement();

  }
 }

 public void openSerialPort(String message)
 {
  HashMap<String, Comparable> params = new HashMap<String, Comparable>();
  otherDAO odao=new otherDAO();
  String port=odao.selectNumberById(15);
  String rate = "9600";
  String dataBit = ""+SerialPort.DATABITS_8;
  String stopBit = ""+SerialPort.STOPBITS_1;
  String parity = ""+SerialPort.PARITY_NONE;
  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);
 if(message!=null&&message.length()!=0)
 {
 String str="";
 for(int i=0;i<10;i++)
 {
  str+=message;
 }
  start();
  run(str);
 }
 } catch (Exception e) {
 }
 }
 static String getPortTypeName( int portType )
 {
  switch ( portType )
  {
   case CommPortIdentifier.PORT_I2C:
    return "I2C";
   case CommPortIdentifier.PORT_PARALLEL:
    return "Parallel";
   case CommPortIdentifier.PORT_RAW:
    return "Raw";
   case CommPortIdentifier.PORT_RS485:
    return "RS485";
   case CommPortIdentifier.PORT_SERIAL:
    return "Serial";
   default:
    return "unknown type";
  }
 }

 public HashSet<CommPortIdentifier> getAvailableSerialPorts()//本来static
 {
  HashSet<CommPortIdentifier> h = new HashSet<CommPortIdentifier>();
  Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();
  while ( thePorts.hasMoreElements() )
  {
   CommPortIdentifier com = ( CommPortIdentifier ) thePorts
    .nextElement();
   switch ( com.getPortType() )
   {
    case CommPortIdentifier.PORT_SERIAL:
     try
     {
      CommPort thePort = com.open( "CommUtil", 50 );
      thePort.close();
      h.add( com );
     }
     catch ( PortInUseException e )
     {
      System.out.println( "Port, " + com.getName()
       + ", is in use." );
     }
     catch ( Exception e )
     {
      System.out.println( "Failed to open port "
       + com.getName() + e );
     }
   }
  }
  return h;
 }
}

//ASCII表
//-------------------------------------------------------------
//     ASCII Characters
//
//Dec Hex  Char Code Dec Hex Char
//
//0  0   NUL   64 40 @
//1  1   SOH   65 41 A
//2  2   STX   66 42 B
//3  3   ETX   67 43 C
//4  4   EOT   68 44 D
//5  5   ENQ   69 45 E
//6  6   ACK   70 46 F
//7  7   BEL   71 47 G
//8  8   BS    72 48 H
//9  9   HT    73 49 I
//10 0A  LF    74 4A J
//11 0B  VT    75 4B K
//12 0C  FF    76 4C L
//13 0D  CR    77 4D M
//14 0E  SO    78 4E N
//15 0F  SI    79 4F O
//16 10  SLE   80 50 P
//17 11  CS1   81 51 Q
//18 12  DC2   82 52 R
//19 13  DC3   83 53 S
//20 14  DC4   84 54 T
//21 15  NAK   85 55 U
//22 16  SYN   86 56 V
//23 17  ETB   87 57 W
//24 18  CAN   88 58 X
//25 19  EM    89 59 Y
//26 1A  SIB   90 5A Z
//27 1B  ESC   91 5B [
//        92 5C  \
//28 1C  FS    93 5D ]
//29 1D  GS    94 5E ^
//30 1E  RS    95 5F _
//31 1F  US    96 60 `
//32 20 (space)   97 61 a
//33 21  !    98 62 b
//34 22  "
//        99 63 c
//35 23  #    100 64 d
//36 24  $
//37 25  %    101 65 e
//38 26  &    102 66 f
//39 27  '    103 67 g
//40 28  (    104 68 h
//41 29  )    105 69 i
//42 2A  *    106 6A j
//43 2B  +    107 6B k
//44 2C  ,    108 6C l
//45 2D  -    109 6D m
//46 2E  .    110 6E n
//47 2F  /    111 6F o
//48 30  0    112 70 p
//49 31  1    113 72 q
//50 32  2    114 72 r
//51 33  3    115 73 s
//52 34  4    116 74 t
//53 35  5    117 75 u
//54 36  6    118 76 v
//55 37  7    119 77 w
//56 38  8    120 78 x
//57 39  9    121 79 y
//58 3A  :    122 7A z
//59 3B  ;    123 7B {
//60 3C  <    124 7C |
//61 3D  =    125 7D }
//62 3E  >    126 7E ~
//63 3F  ?    127 7F 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Java实现串口通信

    1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611343 效果图如下: 2.RXTXcomm Java串口通信依赖的jar包RXTXcomm.jar 下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334 内含32位与64位版本 使用方法: 拷贝 RXTXcomm.jar 到 JAVA_HO

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • java 串口通信详细及简单实例

    java 实现串口通信 最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳.java也可以操作硬件? 后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便. 特拿出来和大家一起分享一下. 准备工作: 首先到SUN官网下载一个zip包:javacomm20-win32.zip 其中重要的有这几个文件: win32com.dll comm.jar javax.comm.properties 按照说明配置好环境,如下: 将win32com.dll复制到<J

  • java使用Rxtx实现串口通信调试工具

    本文实例为大家分享了java使用Rxtx实现串口通信调试工具的具体代码,供大家参考,具体内容如下 最终效果如下图: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.RXTXcomm.jar 添加到项目类库中. 代码: package serialPort; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream

  • Java实现的串口通信功能示例

    本文实例讲述了Java实现的串口通信功能.分享给大家供大家参考,具体如下: 用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip.其中要用到三个文件,配置如下: 1.comm.jar放置到 JAVA_HOME/jre/lib/ext; 2.win32com.dll放置到 JAVA_HOME/bin; 3.javax.comm.properties 两个地方都要放     jre/lib(也就是在JAVA文件夹下的jre)    JA

  • java 串口通信实现流程示例

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 3.在maven的pom.xml下添加 <dependency> <groupId>org.rxtx</groupId> <artifactId>rxtx</artifactId> <version>2.1.7</version&g

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

    本文实例为大家分享了Java使用开源Rxtx实现串口通讯的具体代码,供大家参考,具体内容如下 使用方法: windows平台: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.如果是在开发的时候(JDK),需要把RXTXcomm.jar.rxtxParallel.dll.rxtxSerial.dll拷贝到..\jre...\lib\ext下:如:D:\Program Files\Java\jre1.6.0_02\lib\

  • .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决

    说明 由于.net core 2.x 中,已经找不到 serialport 库,使用需要使用第三方框架,可以直接在 Nuget 中搜索 SerialPortStream 开源地址https://github.com/jcurl/SerialPortStream 为了方便使用,有人封装把它了起来,在 Nuget 中搜索 flyfire.CustomSerialPort 这是一个增强的自定义串口类,实现协议无关的数据帧完整接收功能,支持跨平台使用,使用 SerialPortStream 基础类库.

  • Android实现蓝牙串口通讯

    本文实例为大家分享了Android实现蓝牙串口通讯的具体代码,供大家参考,具体内容如下 最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对C#的学习,写一个给自己的备忘录,如果有大佬看到还请多多指教. 1.简介 Android设备中提供了一整套蓝牙的API,我这边只取了其中需要的部分. 初期权限 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission andr

  • Android串口通讯SerialPort的使用详情

    目录 1.什么是串口? 2.添加依赖 3.编写串口处理类 4.使用串口 5.总结 1.什么是串口? 在不会使用串口通讯之前,暂且可以把它理解为“一个可通讯的口”:使用篇不深入探讨理论及原理.能理解串口如何使用之后,可以查看浅谈Android串口通讯SerialPort原理 2.添加依赖 1.)在 module 中的 build.gradle 中的 dependencies 中添加以下依赖: dependencies { //串口 implementation 'com.github.lichee

  • 浅谈Java多线程实现及同步互斥通讯

    Java多线程深入理解本文主要从三个方面了解和掌握多线程: 1. 多线程的实现方式,通过继承Thread类和通过实现Runnable接口的方式以及异同点. 2. 多线程的同步与互斥中synchronized的使用方法. 3. 多线程的通讯中的notify(),notifyAll(),及wait(),的使用方法,以及简单的生成者和消费者的代码实现. 下面来具体的讲解Java中的多线程: 一:多线程的实现方式 通过继承Threa类来实现多线程主要分为以下三步: 第一步:继承 Thread,实现Thr

  • 浅谈linux下的串口通讯开发

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

  • Java应用开源框架实现简易web搜索引擎

    引言 应用 Java 的开源库,编写一个搜索引擎,这个引擎能爬取一个网站的内容.并根据网页内容进行深度爬取,获取所有相关的网页地址和内容,用户可以通过关键词,搜索所有相关的网址. 具体功能 (1) 用户可以指定爬取一个url对应的网页的内容. (2) 对网页内容进行解析,并获取其中所有的url链接地址. (3) 用户可以设定爬取深度,代表着从初始url对应的页面开始,可以爬取其中所有的url对应的网页内的url,以此类推.深度越大,能爬取到的网站越多. (4) 对爬取到的url内容进行保存.建立

  • C#串口通讯概念及简单的实现方法

    前言 最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可以同时向两端或者更多进行数据发送,它们之间的传输数据类型是byte,串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的端口,这些参数必须匹配. 听大佬说的几个关于串口通讯的术语,啥?啥,这是啥? 就让我这个"小白"给你说说:第一个波特率,这个东西在不同领域都有

  • 在windows下使用python进行串口通讯的方法

    Windows版本下的python并没有内置串口通讯的pyserial的库,所以需要自己下载.参照了网上的教程,有许多用的pip的安装方式,但是试了几个都没有用,所以想到用GitHub下载库文件,步骤分为: 1.在Github下载python-serial的库 https://github.com/pyserial/pyserial 2.下载完成后解压压缩包,找到serial文件夹,并找到python的安装位置(右击IDLE,然后查看python安装位置).我的地址为:C:\Users\NI Y

随机推荐