本篇内容参考转载自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859

环境搭建

下载地址:http://fizzed.com/oss/rxtx-for-java

注意根据你的电脑选择相应的下载包,我的电脑是64位Windows

下载好后把目录中的rxtxParallel.dll和rxtxSerial.dll拷贝到

  1. JAVA_HOME\jre\bin

RXTXcomm.jar加入工程即可。

基础使用

  1. public class SerialPortManager {
  2. /**
  3. * 查找可用端口
  4. *
  5. * @return 可用端口名称列表
  6. */
  7. public static final List<String> findPorts() {
  8. //获得当前所有可用串口
  9. Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
  10. List<String> ports = new ArrayList<>();
  11. while (portList.hasMoreElements()) {
  12. String portName = portList.nextElement().getName();
  13. ports.add(portName);
  14. }
  15. return ports;
  16. }
  17.  
  18. /**
  19. * 打开串口
  20. *
  21. * @param portName 端口名称
  22. * @param baudrate 波特率
  23. * @return 串口对象
  24. * @throws PortInUseException 端口被占用
  25. */
  26. public static SerialPort openPort(String portName, int baudrate) throws PortInUseException {
  27. try {
  28. //通过端口名识别端口
  29. CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
  30. //打开端口,并给端口名字和一个Timeout
  31. CommPort commPort = portIdentifier.open(portName, 2000);
  32. //判断是不是串口
  33. if (commPort instanceof SerialPort) {
  34. SerialPort serialPort = (SerialPort) commPort;
  35. try {
  36. // 设置一下串口的波特率等参数
  37. // 数据位:8
  38. // 停止位:1
  39. // 校验位:None
  40. serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
  41. SerialPort.PARITY_NONE);
  42. } catch (UnsupportedCommOperationException e) {
  43. e.printStackTrace();
  44. }
  45. return serialPort;
  46. }
  47. } catch (NoSuchPortException e) {
  48. e.printStackTrace();
  49. }
  50. return null;
  51. }
  52.  
  53. /**
  54. * 关闭串口
  55. */
  56. public static void closePort(SerialPort serialPort) {
  57. if (serialPort != null) {
  58. serialPort.close();
  59. }
  60. }
  61.  
  62. /**
  63. * 发送数据
  64. *
  65. * @param serialPort 串口对象
  66. * @param order 待发送数据
  67. */
  68. public static void sendMessageToPort(SerialPort serialPort, byte[] order) {
  69. OutputStream out = null;
  70. try {
  71. out = serialPort.getOutputStream();
  72. out.write(order);
  73. out.flush();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. } finally {
  77. if (out != null) {
  78. try {
  79. out.close();
  80. out = null;
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }
  87.  
  88. /**
  89. * 读取数据
  90. */
  91. public static byte[] readFromPort(SerialPort serialPort) {
  92. InputStream in = null;
  93. byte[] bytes = {};
  94. try {
  95. in = serialPort.getInputStream();
  96. // 缓冲区大小为一个字节
  97. byte[] readBuffer = new byte[1];
  98. int bytesNum = in.read(readBuffer);
  99. while (bytesNum > 0) {
  100. bytes = ArrayUtils.concat(bytes, readBuffer);
  101. bytesNum = in.read(readBuffer);
  102. }
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. } finally {
  106. try {
  107. if (in != null) {
  108. in.close();
  109. in = null;
  110. }
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. return bytes;
  116. }
  117.  
  118. /**
  119. * 添加监听器
  120. *
  121. * @param serialPort 串口对象
  122. * @param listener 串口存在有效数据监听
  123. */
  124. public static void addListener(SerialPort serialPort, DataAvailableListener listener) {
  125. try {
  126. // 给串口添加监听器
  127. serialPort.addEventListener(new SerialPortListener(listener));
  128. // 设置当有数据到达时唤醒监听接收线程
  129. serialPort.notifyOnDataAvailable(true);
  130. // 设置当通信中断时唤醒中断线程
  131. serialPort.notifyOnBreakInterrupt(true);
  132. } catch (TooManyListenersException e) {
  133. e.printStackTrace();
  134. }
  135. }
  136.  
  137. /**
  138. * 串口监听
  139. */
  140. public static class SerialPortListener implements SerialPortEventListener {
  141.  
  142. private DataAvailableListener mDataAvailableListener;
  143.  
  144. public SerialPortListener(DataAvailableListener mDataAvailableListener) {
  145. this.mDataAvailableListener = mDataAvailableListener;
  146. }
  147.  
  148. public void serialEvent(SerialPortEvent serialPortEvent) {
  149. switch (serialPortEvent.getEventType()) {
  150. case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效数据
  151. if (mDataAvailableListener != null) {
  152. mDataAvailableListener.dataAvailable();
  153. }
  154. break;
  155. case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.输出缓冲区已清空
  156. break;
  157. case SerialPortEvent.CTS: // 3.清除待发送数据
  158. break;
  159. case SerialPortEvent.DSR: // 4.待发送数据准备好了
  160. break;
  161. case SerialPortEvent.RI: // 5.振铃指示
  162. break;
  163. case SerialPortEvent.CD: // 6.载波检测
  164. break;
  165. case SerialPortEvent.OE: // 7.溢位(溢出)错误
  166. break;
  167. case SerialPortEvent.PE: // 8.奇偶校验错误
  168. break;
  169. case SerialPortEvent.FE: // 9.帧错误
  170. break;
  171. case SerialPortEvent.BI: // 10.通讯中断
  172. ShowUtils.errorMessage("与串口设备通讯中断");
  173. break;
  174.  
  175. default:
  176. break;
  177. }
  178. }
  179. }
  180.  
  181. /**
  182. * 串口存在有效数据监听
  183. */
  184. public interface DataAvailableListener {
  185. /**
  186. * 串口存在有效数据
  187. */
  188. void dataAvailable();
  189. }
  190.  
  191. }

【Java】基于RXTX的Java串口通信的更多相关文章

  1. (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

    此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...

  2. 使用RXTX获取电脑串口

    RXTX是javacomm串口通信的一个扩展 RXTX开发所需文件的下载地址:http://rxtx.qbang.org/wiki/index.php/Download 解压之后可以看到支持各个平台的 ...

  3. AIR串口通信

    最近公司的项目中需要用到串口通信,项目是用基于AIR的,AIR本身是不支持串口通信的,本想用 c#或java另写一个负责串口通信的模块,又感觉很烦不想那么弄,就想到了ANE.可惜以前也没弄过 ANE, ...

  4. Android串口通信

    前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,希望可以帮助大家在学习的时候少走一些弯路,有 ...

  5. Java串口通信--------基于RXTX (附带资源地址)

    最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...

  6. java下的串口通信-RXTX

    关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...

  7. Java串口通信 RXTX 解决过程

    背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...

  8. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  9. java 串口通信实现流程

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...

随机推荐

  1. Django设置session过期时间

    settings.py #session 设置 SESSION_COOKIE_AGE = 60 * 10 # 设置过期时间10分钟,默认为两周 SESSION_SAVE_EVERY_REQUEST = ...

  2. [Codeforces 1228E]Another Filling the Grid(组合数+容斥)

    题目链接 解题思路: 容斥一下好久可以得到式子 \(\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}C_n^iC_n^j(k-1)^{ni+nj-ij}k^{n^2-(ni ...

  3. docker相关----解决tomcat容器启动成功,无法访问的问题

    使用docker安装了tomcat镜像,默认为latest最新的(8.5.50版本),依据tomcat镜像创建容器并同时做了端口映射 命令为:docker run --name tomcat01 -d ...

  4. 在Centos7上安装Oracle

    环境: 硬盘30G:2G RAM:Centos7:Oracle 11G: 1.创建组和用户 [zzd@localhost ~]$ su root #切换到root Password: [root@lo ...

  5. C++基类和派生类的析构函数

    1.派生类也不能继承基类的析构函数. 2.与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉. 3.构造函数和虚构函数 ...

  6. IntelliJ IDEA 2020 的Debug功能也太好用了,真香!

    写在前边 作为一个有点强迫症的程序员来说,所有的应用软件.开发工具都必须要升级到最高版本,否则就会很难受到坐立不安.日思夜想.茶饭不思.至于什么时候得的这种病我也记不清了,哈哈哈 IntelliJ I ...

  7. C#中? 和 ??的区别

    背景 最近在调试C#项目的时候,发现一个比较关于??的特殊用法,当时把我给惊到了,所以特意用这篇短短的笔记来记录一下我的解惑过程: 示例代码: showsomething(isNameNull ?? ...

  8. Nacos数据模型

    Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP. 以上都是nacos官网上面的图片及描述,综合一下 ...

  9. WeChall_Training: Encodings I (Training, Encoding)

    We intercepted this message from one challenger to another, maybe you can find out what they were ta ...

  10. num04---模板方法模式

    最近看书又遇到模板方法模式,具体是在同步器(AQS)的内容上.就顺便再来回顾下. 同步器AbstractQueuedSynchronizer(AQS)是一个抽象类.其中定义了           基本 ...