java基于RXTXcomm.jar的串口通信
java基于RXTXcomm.jar的串口通信
RXTX的下载及配置
- mfz-rxtx-2.2-20081207-win-x64
下载地址:http://download.csdn.net/download/baidu_30541191/9383178 - RXTXComm.jar的API文档
下载地址:http://download.csdn.net/download/baidu_30541191/9383209 - 首先确定你安装的JDK的位数,安装相应位数的jar包。
- 将rxtxSerial.dll、rxtxParallel.dll复制到<JAVA_HOME>\jre\bin目录下
- 将RXTXcomm.jar复制到<JAVA_HOME>\jre\lib\ext目录下
- 到eclipse中右击项目--->Build Path---> Configure Build Path --> Libraries --> Add External JARs...--->找到<JAVA_HOME>/jre/lib/ext目录下的RXTXcomm.jar--->打开-->OK。
- 到此为止所有的准备工作都已经做完了,开始学习吧!
API概述
- 接口
- CommDriver 可负载设备(the loadable device)驱动程序接口的一部分
- CommPortOwnershipListener 传递各种通讯端口的所有权事件
- ParallelPortEventListener 传递并行端口事件
- SerialPortEventListener 传递串行端口事件
- 类
- CommPort 通讯端口 CommDriver 可负载设备(the loadable device)驱动程序接口的一部分
- CommPortOwnershipListener 传递各种通讯端口的所有权事件
- ParallelPortEventListener 传递并行端口事件
- SerialPortEventListener 传递串行端口事件
- SerialPortEvent 异常类
- NoSuchPortException 当驱动程序不能找到指定端口时抛出
- PortInUseException 当碰到指定端口正在使用中时抛出
- UnsupportedCommOperationException 驱动程序不允许指定操作时抛出
重要类详述
- CommPort类
- 描述被底层系统支持的端口的抽象类。包含一些高层的IO控制方法,这些方法对于所有不同的通讯端口来说是通用的。SerialPort(串口) 和ParallelPort(并口)都是它的子类。
- CommPortIdentifier
- 主要用于对串口进行管理和设置,是对串口进行访问控制的核心类。主要方法如下:
addPortName(String, int, CommDriver) 添加端口名到端口列表里addPortOwnershipListener(CommPortOwnershipListener) 添加端口拥有的监听器removePortOwnershipListener(CommPortOwnershipListener) 移除端口拥有的监听器getCurrentOwner() 得到当前占有端口的对象或应用程序getName() 得到端口名称getPortIdentifier(CommPort) 得到参数打开的端口的CommPortIdentifier类型对象getPortIdentifier(String) 得到以参数命名的端口的CommPortIdentifier类型对象getPortIdentifiers() 得到系统中的端口列表getPortType() 得到端口的类型isCurrentlyOwned() 判断当前端口是否被占用open(FileDescriptor) 用文件描述的类型打开端口open(String, int) 打开端口,两个参数:程序名称,延迟时间(毫秒数)
- 主要用于对串口进行管理和设置,是对串口进行访问控制的核心类。主要方法如下:
- SerialPort
- 描述RS-232串行通信端口的底层接口,它定义了串口通信所需的最小功能集。可以直接对串口进行读、写及设置工作。
- 串口参数的函数
getBaudRate() 得到波特率getParity() 得到检验类型getDataBits() 得到数据位数 getStopBits() 得到停止位数setSerialPortParams(int, int, int, int) 设置串口参数依次为(波特率,数据位,停止位,奇偶检验)close() 关闭串口getOutputStream() 得到OutputStream类型的输出流getInputStream() 得到InputStream类型的输入流
- 事件及事件方法
isCD() 是否有载波isCTS() 是否清除发送isDSR() 数据是否准备就绪isDTR() 数据终端是否准备就绪isRI() 是否响铃侦测isRTS() 是否要求发送addEventListener(SerialPortEventListener) 向SerialPort对象中添加串口事件监听器removeEventListener() 移除SerialPort对象中的串口事件监听器getEventType() 得到发生的事件类型返回值为int型sendBreak(int) 设置中断过程的时间,参数为毫秒值setRTS(boolean) 设置或清除RTS位setDTR(boolean) 设置或清除DTR位notifyOnBreakInterrupt(boolean) 设置中断事件notifyOnCarrierDetect(boolean) 设置载波监听事件notifyOnCTS(boolean) 设置清除发送事件notifyOnDataAvailable(boolean) 设置串口有数据的事件notifyOnDSR(boolean) 设置数据备妥事件notifyOnFramingError(boolean) 设置发生错误事件notifyOnOutputEmpty(boolean) 设置发送缓冲区为空事件notifyOnParityError(boolean) 设置发生奇偶检验错误事件notifyOnRingIndicator(boolean) 设置响铃侦测事件
- 事件及事件方法
- 串口参数的静态成员变量
成员变量 说明 成员变量 说明 成员变量 说明 DATABITS_5 数据位为5 STOPBITS_2 停止位为2 PARITY_ODD 奇检验DATABITS_6 数据位为6 STOPBITS_1 停止位为1 PARITY_MARK 标记检验DATABITS_7 数据位为7 STOPBITS_1_5 停止为1.5 PARITY_NONE 空格检验DATABITS_8 数据位为8 PARITY_EVEN 偶检验 PARITY_SPACE 无检验
- 串口参数的静态成员变量
参考代码:
package Dao;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.TooManyListenersException;import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;public class SerialPortDao implements Runnable, SerialPortEventListener {private static boolean isOpen=false;static Set<CommPortIdentifier> portList=new HashSet<CommPortIdentifier>();final static String appName="MyApp";private static InputStream is;private static OutputStream os;private static SerialPort serialPort;byte[] readBuffer=new byte[100];public Set<CommPortIdentifier> getPortList(){Enumeration tempPortList; //枚举类CommPortIdentifier portIp;tempPortList=CommPortIdentifier.getPortIdentifiers();/*不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。* 注意这里的端口不仅仅是指串口,也包括并口。* 这个方法还可以带参数。* getPortIdentifiers(CommPort)获得与已经被应用程序打开的端口相对应的CommPortIdentifier对象。 * getPortIdentifier(String portName)获取指定端口名(比如“COM1”)的CommPortIdentifier对象。*/while(tempPortList.hasMoreElements()){//在这里可以调用getPortType方法返回端口类型,串口为CommPortIdentifier.PORT_SERIALportIp=(CommPortIdentifier) tempPortList.nextElement();portList.add(portIp);}return portList;}public boolean openSerialPort(CommPortIdentifier portIp,int delay){try {serialPort=(SerialPort) portIp.open(appName, delay);/* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。* 如果端口正被其他应用程序占用,将使用 CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。* 每个端口都关联一个 InputStream 和一个OutputStream。* 如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据流对象,除非有close 被调用。* 有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。*/} catch (PortInUseException e) {return false;}try {is=serialPort.getInputStream();/*获取端口的输入流对象*/os=serialPort.getOutputStream();/*获取端口的输出流对象*/} catch (IOException e) {return false;}try {serialPort.addEventListener(this);/*注册一个SerialPortEventListener事件来监听串口事件*/} catch (TooManyListenersException e) {return false;}serialPort.notifyOnDataAvailable(true);/*数据可用*/try {/*设置串口初始化参数,依次是波特率,数据位,停止位和校验*/serialPort.setSerialPortParams(4800, SerialPort.DATABITS_8,SerialPort.STOPBITS_1 , SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {return false;}return true;}public boolean closeSerialPort(){if(isOpen){try {is.close();os.close();serialPort.notifyOnDataAvailable(false);serialPort.removeEventListener();serialPort.close();isOpen = false;} catch (IOException e) {return false;}}return true;}public boolean sendMessage(String message){try {os.write(message.getBytes());} catch (IOException e) {return false;}return true;}@Overridepublic void serialEvent(SerialPortEvent event) {/** 此处省略一下事件,可酌情添加* SerialPortEvent.BI:/*Break interrupt,通讯中断* SerialPortEvent.OE:/*Overrun error,溢位错误* SerialPortEvent.FE:/*Framing error,传帧错误* SerialPortEvent.PE:/*Parity error,校验错误* SerialPortEvent.CD:/*Carrier detect,载波检测 * SerialPortEvent.CTS:/*Clear to send,清除发送 * SerialPortEvent.DSR:/*Data set ready,数据设备就绪* SerialPortEvent.RI:/*Ring indicator,响铃指示* SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){ /*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/try {while(is.available()>0){is.read(readBuffer);//收到的数据再此,可视情况处理}SPCommandDao.startDoMessage(new String (readBuffer));//这一句是我的自定义类,处理接受到的信息,可删除} catch (IOException e) {}}}@Overridepublic void run() {try {Thread.sleep(50);//每次收发数据完毕后线程暂停50ms} catch (InterruptedException e) {e.printStackTrace();}}}
java基于RXTXcomm.jar的串口通信相关推荐
- java comm api_java基于RXTXcomm.jar的串口通信
java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 首先确定你安装的JDK的位数,安装相应位数的jar包. 将rxtxSerial.dll.rxtxParallel.dll复制到\j ...
- java comm jar_java基于RXTXcomm.jar的串口通信
java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64 下载地址:http://download.csdn.net/downl ...
- RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法
RXTXcomm.jar 读取串口数据时报 Underlying input stream returned zero bytes 异常解决方法 一.示例程序 1.依赖 2.示例代码 3.测试读取文件 ...
- linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc
PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信 课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...
- linux 嵌入式串口通信,基于linux的嵌入式串口通信综述.doc
PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...
- 基于PC与单片机串口通信的温度监控系统程序设计
基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...
- VS2013基于对话框的MFC串口通信简单案例教程
本例程是在VS2013环境下,使用MFC做的是一个简单的串口通信程序. 虚拟的串口软件工具下载地址:https://pan.baidu.com/s/1D-oddZk3Z_ioXBUpXE7ksw 密码 ...
- 嵌入式作业(七):基于Ardunio的STM32串口通信
嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...
- 基于FPGA的UART串口通信实验(VHDL语言实现)
一.前言: 最近在做UART串口通信的相关实验时,在网上查了很多资料,发现网上的大部分文章只注重理论,不注重代码,很多代码有错误不说,而且难以理解.故在完成此实验后,起了写一篇博客的心思,以供有想做相 ...
最新文章
- no argument specified with option /LIBPATH:错误的解决
- 阿里云重磅推出物联网安全运营中心Link SOC
- 根据根据图片的url怎么取得图片ImageView对象
- English as a medium of instruction
- asp.net中各种类型文件解析 收藏
- ad用户和计算机报错,AD常用排错工具
- 干货 | 如何系统学习 C 语言?
- 「数据ETL」从数据民工到数据白领蜕变之旅(六)-将Python的能力嫁接到SSIS中...
- [css] 怎么实现移动端的边框0.5px?
- 使用lhgDialog窗口组件,关闭窗口刷新父页面
- sk-learn中对数据集划分函数train_test_split和StratifiedShuffleSplit
- Electron —— Cannot find module ‘index.js’
- python交互式换行_如何在Python中进行换行(换行)?
- Ubuntu过去十年的10个关键时刻
- 简单解释为什么会存在hash冲突
- 行政地名、行政区划名、地名分类(矢量数据)
- PHP5.5 ~ PHP7.2新特性总结
- spectral-cluster聚类算法详解
- 做一个墨水屏电子钟,炫酷!
- Spark架构原理和生态系统