java实现与RS232串口的通信
发布日期:2021-07-20 20:53:56
浏览次数:69
分类:技术文章
本文共 5342 字,大约阅读时间需要 17 分钟。
操作前软件环境准备:
1.下载虚拟串口VSPD V6.0或V6.9,在本机上模拟串口。
2.下载友善串口测试助手,方便串口通信测试
java部分:
网上搜到有两个开源类库可以进行操作:
comm.jar(2.0版本支持windows,3.0支持linux),我测试只支持32位环境(启动时win32com.dll报错)
1.下载comm.jar、win32com.dll和javax.comm.properties。
介绍:comm.jar提供了通讯用的java API,win32com.dll提供了供comm.jar调用的本地驱动接口,javax.comm.properties是这个驱动的类配置文件
2.拷贝javacomm.jar到<JAVA_HOME>\jre\lib\ext目录下面;
3.拷贝javax.comm.properties到<JAVA_HOME>\jre\lib目录下面;
4.拷贝win32com.dll到<JAVA_HOME>\jre\bin目录下面;
RXTXComm.jar,支持64位环境
①jar包下载
拷贝 RXTXcomm.jar 到 <JAVA_HOME>\jre\lib\ext目录中;
拷贝 rxtxSerial.dll 到 <JAVA_HOME>\jre\bin目录中; 拷贝 rxtxParallel.dll 到 <JAVA_HOME>\jre\bin目录中;②maven配置(同样要拷贝到jdk/jre目录下)
org.bidib.jbidib.org.qbang.rxtx rxtxcomm 2.2
Demo:
入口:
public class UserRepositoryTests{ static BlockingQueue queue = new LinkedBlockingQueue (); @Test public void test3() throws InterruptedException{ List portNameList = new ArrayList (); portNameList.add("COM4"); portNameList.add("COM6"); portNameList.add("COM8"); try { /* * Rs232Dto dto = JacksonUtil.fromJSON( * "{\"opCode\":\"01H\",\"param1\":\"huilu\",\"param2\":\"www.baidu.com\"}", * Rs232Dto.class); System.out.println(dto); */ RxtxBuilder.init(portNameList); CommUtil comm4 = RxtxBuilder.comms.get(0); CommUtil comm6 = RxtxBuilder.comms.get(1); CommUtil comm8 = RxtxBuilder.comms.get(2); while (true) { String msg = queue.take(); if (msg.contains("4")) { if (msg.contains("H") ) { comm4.send("4fail"); }else { comm4.send("4success"); } } if (msg.contains("6")) { if (msg.contains("H") ) { comm6.send("6fail"); }else { comm6.send("6success"); } } if (msg.contains("8")) { if (msg.contains("H") ) { comm8.send("8fail"); }else { comm8.send("8success"); } } Thread.sleep(100); } } finally { //comm4.ClosePort(); comm6.ClosePort(); comm8.ClosePort(); } }}
串口监听响应类的构建器:
package com.star.demo.project.test;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import gnu.io.CommPortIdentifier;public class RxtxBuilder { static Listcomms = new ArrayList (); static void init(List names) { Enumeration portList = CommPortIdentifier.getPortIdentifiers(); // 得到当前连接上的端口 while (portList.hasMoreElements()) { CommPortIdentifier temp = (CommPortIdentifier) portList.nextElement(); if (temp.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判断如果端口类型是串口 if (names.contains(temp.getName())) { // 判断如果端口已经启动就连接 System.err.println("端口---" + temp.getName() + "启动监听"); CommUtil comm = new CommUtil(temp, temp.getName()); comms.add(comm); } } } }}
串口监听响应类:
package com.star.demo.project.test;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.util.Date;import java.util.Enumeration;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 CommUtil implements SerialPortEventListener { InputStream inputStream; // 从串口来的输入流 OutputStream outputStream;// 向串口输出的流 SerialPort serialPort; // 串口的引用 CommPortIdentifier portId; int count = 0; public CommUtil(CommPortIdentifier temp ,String name) { try { portId = temp; serialPort = (SerialPort) portId.open("My" + name, 2000); } catch (PortInUseException e) { } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { } try { serialPort.addEventListener(this); // 给当前串口添加一个监听器 } catch (TooManyListenersException e) { } serialPort.notifyOnDataAvailable(true); // 当有数据时通知 try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, // 设置串口读写参数 SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { } } @Override public 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[20]; try { while (inputStream.available() > 0) { //System.out.println("data size---"+inputStream.available()); int numBytes = inputStream.read(readBuffer); //System.out.println("data---"+numBytes); } //System.out.println("content-"+ count++ +"--"+new String(readBuffer).trim()); String req = new String(readBuffer); System.out.println(Thread.currentThread()+"---"+new String(readBuffer).trim()); UserRepositoryTests.queue.offer(req); } catch (IOException e) { e.printStackTrace(); } break; } } public void send(String content) { try { outputStream.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public void ClosePort() { if (serialPort != null) { serialPort.close(); } }}
转载地址:https://blog.csdn.net/liao0801_123/article/details/88884217 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月22日 03时10分45秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
UGUI 列表循环使用
2019-04-27
使用命令行运行unity并执行某个静态函数(运用于命令行打包和批量打包)
2019-04-27
web.py框架
2019-04-27
web.py学习笔记
2019-04-27
python的代码缩进
2019-04-27
A* Pathfinding Project (Unity A*寻路插件) 使用教程
2019-04-27
bash学习笔记
2019-04-27
sqlite学习
2019-04-27
手把手教你实现Unity与Android的交互
2019-04-27
手把手教你使用Unity的Behavior Designer
2019-04-27
Unity3D摄像机裁剪——NGUI篇
2019-04-27
lua深拷贝一个table
2019-04-27
app运行提示Unable to Initialize Unity Engine
2019-04-27
spring boot 与 Ant Design of Vue 实现修改按钮(十七)
2019-04-27
spring boot 与 Ant Design of Vue 实现删除按钮(十八)
2019-04-27
spring boot 与 Ant Design of Vue 实现新增角色(二十)
2019-04-27
spring boot 与 Ant Design of Vue 实现修改角色(二十一)
2019-04-27
spring boot 与 Ant Design of Vue 实现删除角色(补二十一)
2019-04-27