java如何与RS232进行通信
下载虚拟串口软件:
链接: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进行通信相关推荐
- 通过JAVA与串口(RS232)通信实例
通过JAVA与串口(RS232)通信实例 博客分类: J2SE JavaVBthread 最近了解到的需求是需要需激光打刻机进行(RS232)串口通信, 这里使用的是RXTX开源包实现的. 之前 ...
- gRPC中Java和node进行异构通信-互为客户端和服务端
场景 gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...
- 主板rs232接口测试软件,简洁的RS232串口通信电路与串口通信测试程序
RS232串口通信电路往往是采用专用的串口传输芯片MAX232(5V)或MAX3232(3.3V),芯片起到驱动.匹配.隔离.保护等作用,这种电路常用于实际系统中的远距离串口通信.多数爱好者搭建串口通 ...
- 简单的Java服务器和客户端的通信
系列文章: ESP8266的AP模式与STA模式简单测试 简单的Java服务器和客户端的通信 STM32 ESP8266和Java服务器透传模式下的双向通信 jsp向servlet传输数据 Servl ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- 【java笔记】线程间通信(2):生产者和消费者案例分析
[java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...
- 程控电源CANoe上位机面板(CAN\ETH测试、RS232串口通信、编写设计思路)
程控电源CANoe上位机面板 编写此面板的目的 编写思路 一.通讯方式 1.RS232串口连接 2.CANoe与RS232串口相关的函数 3.帧格式命令字 4.校验码 二.面板设计 1.所需文件说明 ...
- Android Java层和Native层通信入门指南开篇
Android Java层和Native层通信入门指南开篇 引言 做Android平台系统开发的小伙伴,应该经常会遇到要打通Android Framework层和C/C++层通信的通道问 ...
- RS232不能通信的问题
RS232不能通信,根据PCB图检查了硬件电路是否导通,短路状态使用串口工具发送消息收到消息可以收发,编程方面大概率无误. 由原理图可见,地.TXD和RXD设计错误,没有反着接. 用杜邦线Rx连Tx, ...
最新文章
- 银河麒麟svn: E215000: GNOME Keying被锁定,并且我们处于非交互方式
- Best Time to Buy and Sell Stock(动态规划)
- ubuntu16.04 Linux+xfce4的文件夹出现两种背景颜色+文件夹中右键打开终端失灵了.
- k均值算法 二分k均值算法_如何获得K均值算法面试问题
- K 近邻法(K-Nearest Neighbor, K-NN)
- 一步步教你开发鸿蒙系统应用,So Easy
- .NET 4.0 使用 asyn await
- Linux常用命令大全
- Hi3518E_V200 SDK编译笔记 第一季
- HART协议命令与UART串口解析
- 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析
- 抗饱和积分器 matlab,抗积分饱和
- 如何利用 C# 爬取「财报说」中的股票数据?
- 易语言开发微信机器人插件
- matlab拟合代码总结
- macOS app动态修改app图标,图标为icns格式
- mount挂载硬盘出错 linux 下分区格式为lvm
- 程序员 大牛 面试
- javascript - 字符串的操作
- 联想小新触摸板驱动_联想 小新Air 13.3触摸板怎么用?