准备工作
1.下载
地址: http://fizzed.com/oss/rxtx-for-java

这里的下载是根据jdk安装的位数下载,我之前下载的是W64的版本,电脑系统也是64的,但是代码跑不起来,后来才发现我电脑的JDK是32位的。

2、
下载完成后将 rxtxParallel.dll 、 rxtxSerial.dll 、文件拷贝到放入<JAVA_HOME>\jre\bin中

3、Maven
方式一: 本地jar包直接引入

 <dependency><groupId>com.test</groupId><artifactId>rxtxcomm</artifactId><version>2.2</version><scope>system</scope><systemPath>${basedir}/lib/RXTXcomm.jar</systemPath></dependency>

方式二 : maven引入

 <dependency><groupId>org.bidib.jbidib.org.qbang.rxtx</groupId><artifactId>rxtxcomm</artifactId><version>2.2</version></dependency>

代码

public class SerialPortUtil implements SerialPortEventListener {private static final Logger log = LoggerFactory.getLogger(SerialPortUtil.class);// 串口对象引用static SerialPort serialPort;// 堵塞队列:用来存放串口发送到服务端的数据public BlockingQueue<String> msgQueue = new LinkedBlockingQueue();// 线程控制标识public static boolean flag = true;/*** 关闭串口** @param serialPort 要关闭的串口对象*/public void closeSerialPort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();}}/*** 给串口设置监听** @param serialPort serialPort 要读取的串口* @param listener   SerialPortEventListener监听对象* @throws TooManyListenersException 监听对象太多*/public void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws TooManyListenersException {//给串口添加事件监听serialPort.addEventListener(listener);//串口有数据监听serialPort.notifyOnDataAvailable(true);//中断事件监听serialPort.notifyOnBreakInterrupt(true);log.debug("给串口添加事件监听");}/*** 关闭监听** @param port*/public void removeListener(SerialPort port) {port.notifyOnRingIndicator(false);port.notifyOnParityError(false);port.notifyOnOverrunError(false);port.notifyOnOutputEmpty(false);port.notifyOnFramingError(false);port.notifyOnDSR(false);port.notifyOnDataAvailable(false);port.notifyOnCTS(false);port.notifyOnCarrierDetect(false);port.notifyOnBreakInterrupt(false);port.removeEventListener();}/*** 从串口读取数据** @param serialPort 要读取的串口* @return 读取的数据*/public byte[] readData(SerialPort serialPort) {InputStream is = null;byte[] bytes = null;try {//获得串口的输入流is = serialPort.getInputStream();//获得数据长度int bufflenth = is.available();while (bufflenth != 0) {//初始化byte数组bytes = new byte[bufflenth];is.read(bytes);bufflenth = is.available();}} catch (IOException e) {log.error("串口断开关闭监听");removeListener(serialPort);closeSerialPort(serialPort);} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}return bytes;}/*** 查找电脑上所有可用 com 端口** @return 可用端口名称列表,没有时 列表为空*/public final ArrayList<String> findSystemAllComPort() {/***  getPortIdentifiers:获得电脑主板当前所有可用串口*/Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();ArrayList<String> portNameList = new ArrayList<>();/***  将可用串口名添加到 List 列表*/while (portList.hasMoreElements()) {String portName = portList.nextElement().getName();//名称如 COM1、COM2....portNameList.add(portName);}return portNameList;}/*** 打开电脑上指定的串口** @param portName 端口名称,如 COM1,为 null 时,默认使用电脑中能用的端口中的第一个* @param b        波特率(baudrate),如 9600* @param d        数据位(datebits),如 SerialPort.DATABITS_8 = 8* @param s        停止位(stopbits),如 SerialPort.STOPBITS_1 = 1* @param p        校验位 (parity),如 SerialPort.PARITY_NONE = 0* @return 打开的串口对象,打开失败时,返回 null*/public final SerialPort openSerialPort(String portName, int b, int d, int s, int p) {CommPort commPort = null;try {//当没有传入可用的 com 口时,默认使用电脑中可用的 com 口中的第一个if (StringUtils.isEmpty(portName)) {List<String> comPortList = findSystemAllComPort();if (comPortList != null && comPortList.size() > 0) {portName = comPortList.get(0);}}log.debug("开始打开串口:portName=" + portName + ",baudrate=" + b + ",datebits=" + d + ",stopbits=" + s + ",parity=" + p);//通过端口名称识别指定 COM 端口CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);/*** open(String TheOwner, int i):打开端口* TheOwner 自定义一个端口名称,随便自定义即可* i:打开的端口的超时时间,单位毫秒,超时则抛出异常:PortInUseException if in use.* 如果此时串口已经被占用,则抛出异常:gnu.io.PortInUseException: Unknown Application*/commPort = portIdentifier.open(portName, 5000);/*** 判断端口是不是串口* public abstract class SerialPort extends CommPort*/if (commPort instanceof SerialPort) {serialPort = (SerialPort) commPort;// 设置串口监听器this.setListenerToSerialPort(serialPort,this);/*** 设置串口参数:setSerialPortParams( int b, int d, int s, int p )* b:波特率(baudrate)* d:数据位(datebits),SerialPort 支持 5,6,7,8* s:停止位(stopbits),SerialPort 支持 1,2,3* p:校验位 (parity),SerialPort 支持 0,1,2,3,4* 如果参数设置错误,则抛出异常:gnu.io.UnsupportedCommOperationException: Invalid Parameter* 此时必须关闭串口,否则下次 portIdentifier.open 时会打不开串口,因为已经被占用*/serialPort.setSerialPortParams(b, d, s, p);log.debug("打开串口 " + portName + " 成功...");return serialPort;} else {log.error("当前端口 " + commPort.getName() + " 不是串口...");}} catch (NoSuchPortException e) {e.printStackTrace();} catch (PortInUseException e) {log.warn("串口 " + portName + " 已经被占用,请先解除占用...");e.printStackTrace();} catch (UnsupportedCommOperationException e) {log.warn("串口参数设置错误,关闭串口,数据位[5-8]、停止位[1-3]、验证位[0-4]...");e.printStackTrace();if (commPort != null) {//此时必须关闭串口,否则下次 portIdentifier.open 时会打不开串口,因为已经被占用commPort.close();}}catch (TooManyListenersException e){log.warn("监听对象太多");e.printStackTrace();}log.error("打开串口 " + portName + " 失败...");return null;}@Overridepublic void serialEvent(SerialPortEvent event) {System.out.println("串口监听"+event.getEventType());switch (event.getEventType()) {/**  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,输出缓冲区清空*/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:try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}byte[] bytes = this.readData(serialPort);System.out.println(event.getEventType());if (bytes != null) {String weight = new String(bytes);if (StringUtils.isNotBlank(weight)) {System.out.println("收到的数据长度:" + bytes.length);System.out.println("重量为:" + weight);msgQueue.add(weight);}}break;}}
}

测试工具

虚拟串口工具 Configure Virtual Serial Port Driver
串口通信工具 友善串口调试助手

串口通信RXTXcomm使用相关推荐

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

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

  2. 使用RXTXcomm进行串口通信

    RXTXcomm 串口通信 虚拟串口和串口调试助手的使用 虚拟串口软件:VSPD,https://www.eltima.com/cn/products/vspdxp/ VSPD会自动识别出本台计算上有 ...

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

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

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

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

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

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

  6. java串口发送十六进制数,本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与接收。 源码:...

    本文实例为大家分享了Java实现串口通信的具体代码,供大家参考,具体内容如下 1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码:SerialPortDemo 效果图如下: ...

  7. java实现上位机与下位机串口通信

    串口通信是在工程应用中很常见.在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用.在说个之前先来简单解释一下上位机与下位机的概念. 上位机与下位机 通常上位机指的 ...

  8. 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021.5.10 1.串口通信简介 1.1 波特率 1.2 数据位 1.3 停止位 1.4 奇偶校验位 2.GPS模块串口通信配置 2.1 驱动安装 2.2 插入GPS模块 ...

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

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

最新文章

  1. Java 8 Lambda
  2. python3 request模块 https certificate verify failed 错误
  3. mysql模糊查询后分页_jsp模糊查询后的数据进行分页,但点击下一页后就查询全部的了...
  4. .NET Core跨平台:使用.NET Core开发一个初心源商城总括
  5. 前端学习(1580):初始react
  6. java web 开发基础_javaweb开发基础(一)
  7. linux使用苹果字体,Ubuntu 8.04字体美化之安装苹果丽黑字体教程(图)
  8. 【Kafka】KafkaConsumer is not safe for multi-threaded access
  9. 什么都不懂的人怎么样可以建立自己的网站
  10. 国外LEAD赚钱教程:EMU篇(五)国外lead常用工具汇总
  11. 超市便利店零售POS收银前台,好用的零售收银软件盘点机PDA收银机,批发销售出库单开单,超市零售批发进销存收银开单管理软件
  12. 3D建模场景怎么做?
  13. 三级管输入输出特性曲线的分析
  14. 特殊符号大全(无穷的想象力)
  15. Shader初级(纹理坐标篇)
  16. android拦截所有短信源码,拦截垃圾短信咱可别手软 安卓和苹果系统手机处理方法不同...
  17. Word文档 | 删除回车符
  18. Android Studio连接驱动装不上应用程序无法正常启动(oxc000007b)
  19. 渗透学习日记day20
  20. 转载自鸿燕藏锋-ETL讲解(很详细!!!)

热门文章

  1. solrcloud mysql_Mysql数据导入SolrCloud
  2. 【最新】十项网络安全标准下载与最全解读(免费下载)
  3. xss漏洞之——钓鱼页面
  4. 基于python+django框架+Mysql数据库的在线外卖点餐系统设计与实现
  5. 专业影像编辑软件Vegas pro17注册机下载安装
  6. 关于货币兑换的循环语句和函数调用
  7. excel数据导入sql sever 数据库
  8. 凡是过往,皆为序章。
  9. 解决root账号登陆linux桌面时google-chrome无法打开的问题
  10. 安卓(android)使用GPS,获取经纬度