下载虚拟串口软件

链接:https://pan.baidu.com/s/1AXKXdyl9rbm3SSt0y7Q6PQ 
提取码:3aqp

两个版本的破解过程大致一样,都是先安装,6.9版本将压缩包crack文件中的两个文件复制到安装目录下,替换原来的.exe和.dll文件;7.1版本只需要将压缩包中的.dll文件复制到安装目录下替换就行了。

打开软件添加虚拟串口,一般都是成对添加的(添加COM7、COM8)后如图所示(根据自己的需求添加串口)

添加完成后到设备管理器中查看,发现多了两个虚拟串口如图:

我也不知我我添加的端口为啥不是在端口(COM和LPT)下面,因为我看其他人的截图,添加的虚拟端口是在 端口(COM和LPT)下面,但是不影响我们的实验。

下载串口调试软件:

链接:https://pan.baidu.com/s/14e-mflzDx6mBxIt9pejN3Q 
提取码:n7bi

可以直接先打开两个调试窗口,分别用来表示COM7和COM8串口。两个串口的参数一定要设置的一样才可以正常的收发数据。如图:

注意在串口调试工具中选择相应的串口,并打开串口,如何串口是打开的在最右侧的图片上有提示,例如COM7[9600-N-8-1] 说明COM7端口是打开的 而COM17 []号里没有什么东西,说明COM17端口没有开启

COM7向COM8端口发送数据,COM8向COM7发送数据

说明端口正常

Java代码的编写和调试

这一部分将是我们的重点,要与串口通信首先要在项目添加RXTXcomm.jar包(放在项目中的lib目录下,并添加到build Path中)(win64位下载地址:https://pan.baidu.com/s/1f6aNfcVNSEmAovTcGlfjNw(提取码:iec1));另外,还需要将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用。【在解压以后的包中有install.txt文档里面有需要放到的路径介绍(Copy RXTXcomm.jar ---> <JAVA_HOME>\jre\lib\ext  ;Copy rxtxSerial.dll ---><JAVA_HOME>\jre\bin;Copy rxtxParallel.dll ---> <JAVA_HOME>\jre\bin)】

或者将RXTXcomm.jar加入到自己得工程项目中也行

注:安装到%JAVA_HOME%/jre/bin时--需要安装的是tomacat下的jdk文件中,记住一定要是tomcat运行调用的jdk下,包括开发环境时,也是tomcat的jdk下(因为有时开发配置时开发jdk与tomcat运行jdk不是同一个jdk,这里指tomcat运行jdk,在eclipse的window-preferences下的servers中jdk)

如果不是tomacat下的jdk会报错:java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver

解决方法就是把上面的几个文件导入到正确的路径下。

相关代码:

package com.springsecurity.demo.testRxtx;import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import gnu.io.*;/*** @version 1.0* @author: hjb* @date: 2021-08-31 13:54*/
public class RxtxUtil extends Thread implements SerialPortEventListener {// 监听器,我的理解是独立开辟一个线程监听串口数据static CommPortIdentifier portId; // 串口通信管理类static Enumeration<?> portList; // 有效连接上的端口的枚举InputStream inputStream; // 从串口来的输入流static OutputStream outputStream;// 向串口输出的流SerialPort serialPort; // 串口的引用// 堵塞队列用来存放读到的数据private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<String>();/*** SerialPort EventListene 的方法,持续监听端口上是否有数据流*/@Overridepublic void serialEvent(SerialPortEvent event) {switch (event.getEventType()) {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:// 当有可用数据时读取数据byte[] readBuffer = new byte[1024];try {int numBytes = -1;while (inputStream.available() > 0) {numBytes = inputStream.read(readBuffer);if (numBytes > 0) {msgQueue.add(new Date() + "真实收到的数据为:-----"+ new String(readBuffer,"gbk"));readBuffer = new byte[1024];// 重新构造缓冲对象,否则有可能会影响接下来接收的数据} else {msgQueue.add("额------没有读到数据");}}} catch (IOException e) {}break;}} // SerialPortEventListener {/**** 通过程序打开COM4串口,设置监听器以及相关的参数** @return 返回1 表示端口打开成功,返回 0表示端口打开失败*/public int startComPort(String portName) {// 通过串口通信管理类获得当前连接上的串口列表portList = CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {// 获取相应串口对象portId = (CommPortIdentifier) portList.nextElement();System.out.println("设备类型:--->" + portId.getPortType());System.out.println("设备名称:---->" + portId.getName());// 判断端口类型是否为串口if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判断如果COM7串口存在,就打开该串口if (portId.getName().equals(portName)) {try {// 打开串口名字为COM_7(名字任意),延迟为2毫秒serialPort = (SerialPort) portId.open(portName, 2000);} catch (PortInUseException e) {e.printStackTrace();return 0;}// 设置当前串口的输入输出流try {inputStream = serialPort.getInputStream();outputStream = serialPort.getOutputStream();} catch (IOException e) {e.printStackTrace();return 0;}// 给当前串口添加一个监听器try {serialPort.addEventListener(this);} catch (TooManyListenersException e) {e.printStackTrace();return 0;}// 设置监听器生效,即:当有数据时通知serialPort.notifyOnDataAvailable(true);// 设置串口的一些读写参数try {// 比特率、数据位、停止位、奇偶校验位serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {e.printStackTrace();return 0;}return 1;}}}return 0;}//处理返回后的消息@Overridepublic void run() {// TODO Auto-generated method stubtry {System.out.println("--------------任务处理线程运行了--------------");while (true) {// 如果堵塞队列中存在数据就将其输出if (msgQueue.size() > 0) {System.out.println(msgQueue.take());}}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package com.springsecurity.demo.testRxtx;import java.io.IOException;/*** @version 1.0* @author: hjb* @date: 2021-08-31 13:53*/
public class TestRxtxUtil {public static void main(String[] args) {RxtxUtil cRead = new RxtxUtil();int i = cRead.startComPort("COM8");if (i == 1) {// 启动线程来处理收到的数据cRead.start();try {String st = "哈哈----你好";System.out.println("发出字节数:" + st.getBytes("gbk").length);cRead.outputStream.write(st.getBytes("gbk"), 0,st.getBytes("gbk").length);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println("端口打开失败!");return;}}
}

注意事项:

我们在调试端口时,分别用两个端口调试工具连接了端口,如图所示

这种状态下,在用Java代码去测试会报端口被占用的错误

gnu.io.PortInUseException: Unknown Application

例如我代码里面用的时COM8向COM7端口发送消息,所以需要把COM8的调试工具关掉

点击关闭串口即可,在运行代码就可以正常运行了

发送返回信息:

如果想一次收到更多的消息内容,可以将new byte[1024] 的值写成更大的值

java如何与RS232进行通信相关推荐

  1. 通过JAVA与串口(RS232)通信实例

    通过JAVA与串口(RS232)通信实例 博客分类: J2SE JavaVBthread  最近了解到的需求是需要需激光打刻机进行(RS232)串口通信,  这里使用的是RXTX开源包实现的.  之前 ...

  2. gRPC中Java和node进行异构通信-互为客户端和服务端

    场景 gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

  3. 主板rs232接口测试软件,简洁的RS232串口通信电路与串口通信测试程序

    RS232串口通信电路往往是采用专用的串口传输芯片MAX232(5V)或MAX3232(3.3V),芯片起到驱动.匹配.隔离.保护等作用,这种电路常用于实际系统中的远距离串口通信.多数爱好者搭建串口通 ...

  4. 简单的Java服务器和客户端的通信

    系列文章: ESP8266的AP模式与STA模式简单测试 简单的Java服务器和客户端的通信 STM32 ESP8266和Java服务器透传模式下的双向通信 jsp向servlet传输数据 Servl ...

  5. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  6. 【java笔记】线程间通信(2):生产者和消费者案例分析

    [java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...

  7. 程控电源CANoe上位机面板(CAN\ETH测试、RS232串口通信、编写设计思路)

    程控电源CANoe上位机面板 编写此面板的目的 编写思路 一.通讯方式 1.RS232串口连接 2.CANoe与RS232串口相关的函数 3.帧格式命令字 4.校验码 二.面板设计 1.所需文件说明 ...

  8. Android Java层和Native层通信入门指南开篇

        Android Java层和Native层通信入门指南开篇 引言    做Android平台系统开发的小伙伴,应该经常会遇到要打通Android Framework层和C/C++层通信的通道问 ...

  9. RS232不能通信的问题

    RS232不能通信,根据PCB图检查了硬件电路是否导通,短路状态使用串口工具发送消息收到消息可以收发,编程方面大概率无误. 由原理图可见,地.TXD和RXD设计错误,没有反着接. 用杜邦线Rx连Tx, ...

最新文章

  1. 银河麒麟svn: E215000: GNOME Keying被锁定,并且我们处于非交互方式
  2. Best Time to Buy and Sell Stock(动态规划)
  3. ubuntu16.04 Linux+xfce4的文件夹出现两种背景颜色+文件夹中右键打开终端失灵了.
  4. k均值算法 二分k均值算法_如何获得K均值算法面试问题
  5. K 近邻法(K-Nearest Neighbor, K-NN)
  6. 一步步教你开发鸿蒙系统应用,So Easy
  7. .NET 4.0 使用 asyn await
  8. Linux常用命令大全
  9. Hi3518E_V200 SDK编译笔记 第一季
  10. HART协议命令与UART串口解析
  11. 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析
  12. 抗饱和积分器 matlab,抗积分饱和
  13. 如何利用 C# 爬取「财报说」中的股票数据?
  14. 易语言开发微信机器人插件
  15. matlab拟合代码总结
  16. macOS app动态修改app图标,图标为icns格式
  17. mount挂载硬盘出错 linux 下分区格式为lvm
  18. 程序员 大牛 面试
  19. javascript - 字符串的操作
  20. 联想小新触摸板驱动_联想 小新Air 13.3触摸板怎么用?

热门文章

  1. 超全的回文题汇总-Palindrome
  2. iconfont多次下载合并
  3. linux系统应用学习(三)--- 动态库静态库
  4. oracle同步软件技术实现对比
  5. fever pitch 狂热, 极度兴奋
  6. 使用ViewPager实现帖子列表
  7. java 当前现成等待或睡眠10秒
  8. 多平台epub阅读器推荐
  9. 跨模态对齐 20220728
  10. 红玫瑰数java的意思,送玫瑰花数量的含义 不同朵数的玫瑰花代表什么