1.创建监听

package com.datago.serve.common.serialport;import com.datago.common.core.utils.StringUtils;
import com.datago.serve.common.config.SerialPortConfig;
import com.datago.serve.common.websocket.ScannerSocketServer;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import lombok.SneakyThrows;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;import java.util.Map;/*** @ProjectName serial-port* @Package com.datago.serialport.controller.boot* @Name MyLister* @Author HB* @Date 2022/7/13 10:38* @Version 1.0*/
public class SerialPortLister implements SerialPortEventListener {//1.返回数据public static String lightData;
//2.返回数据public static String servoData;@Override@SneakyThrowspublic void serialEvent(SerialPortEvent arg0) {if (arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();Map<String, SerialPort> comMap = SerialPortUtil.comMap;if (comMap.size() > 0) {SerialPort lightSerialPort = comMap.get(SerialPortConfig.light);if (StringUtils.isNotNull(lightSerialPort)) {byte[] bytes = serialPortUtil.readFromPorts(lightSerialPort);String byteStr = new String(bytes, 0, bytes.length).trim();if (!byteStr.equals("")) {//赋返回值lightData = byteStr;}}SerialPort servoSerialPort = comMap.get(SerialPortConfig.servo);if (StringUtils.isNotNull(servoSerialPort)) {byte[] bytes = serialPortUtil.readFromPorts(servoSerialPort);String byteStr = new String(bytes, 0, bytes.length).trim();if (!byteStr.equals("")) {//赋返回值   0正常运行1停止运行2有异常if (!byteStr.equals(servoData)){servoData = byteStr;SerialPortConfig.redisService.setCacheObject("servoData",servoData);//推送前端JSONObject object = JSONObject.fromObject("{\"code\":10000,\"message\":\"\",\"data\":\"\"}");object.put("turntableStatus",servoData);//0正常运行1停止运行2有异常ScannerSocketServer.sendInfo(object.toString(), null);}}}}}}
}

2.串口工具类

package com.datago.serve.common.serialport;import com.datago.common.core.utils.StringUtils;
import gnu.io.*;
import lombok.extern.slf4j.Slf4j;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;/*** @ProjectName serial-port* @Package com.datago.serialport.controller.boot* @Name SerialPortUtil* @Author HB* @Date 2022/7/13 09:58* @Version 1.0*/
@Slf4j
public class SerialPortUtil {private static SerialPortUtil serialPortUtil = null;static {//在该类被ClassLoader加载时就初始化一个serialTool对象if (serialPortUtil == null) {serialPortUtil = new SerialPortUtil();}}//私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象private SerialPortUtil() {}/*** <com名称,SerialPort>串口通信map,存储串口名称与串口信息*/public static Map<String, SerialPort> comMap =new HashMap<>();/*** 获取提供服务的SerialTool对象*/public static SerialPortUtil getSerialPortUtil() {if (serialPortUtil == null) {serialPortUtil = new SerialPortUtil();}return serialPortUtil;}/*** 打开串口*/public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbatis) {try {//通过端口名识别端口CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);//打开端口,并给端口名字一个timeout(打开操作的超时时间)CommPort commPort = portIdentifier.open(portName, 2000);//判断是不是串口if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;comMap.put(portName, serialPort);//设置一下串口的波特率等参数try {serialPort.setSerialPortParams(baudrate, databits, parity, stopbatis);} catch (UnsupportedCommOperationException e) {e.printStackTrace();}log.info("Open-------------{}" + portName + "sucessfully");return serialPort;} else {log.error("不是串口----------{}");}} catch (NoSuchPortException e) {log.error("没有找到端口--------------{}");e.printStackTrace();} catch (PortInUseException e) {log.error("端口被占用--------------{}");e.printStackTrace();}return null;}/*** 关闭串口*/public void closePort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();}}/*** 往串口发送数据*/public void sendToPort(SerialPort serialPort, byte[] order) {OutputStream out = null;try {out = serialPort.getOutputStream();out.write(order);out.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}}/**从串口读取数据*/public byte[] readFromPorts(SerialPort serialPort){InputStream in=null;byte[] bytes={};try {Thread.sleep(50);} catch (InterruptedException ex) {ex.printStackTrace();}try {in=serialPort.getInputStream();byte[] readBuffer = new byte[1];int bufflenth=in.read(readBuffer);while (bufflenth > 0){bytes= byteMerger(bytes,readBuffer);bufflenth=in.read(readBuffer);}}catch (IOException e){e.printStackTrace();}finally {try {in.close();in = null;} catch (IOException e) {e.printStackTrace();}}return  bytes;}public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){byte[] byte_3 = new byte[byte_1.length+byte_2.length];System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);return byte_3;}/**添加监听器*/public void addListener(SerialPort port,SerialPortEventListener listener){try {//给串口添加监听器port.addEventListener(listener);//设置当有数据到时唤醒监听接收线程port.notifyOnDataAvailable(true);//设置当通信中断时唤醒中断线程port.notifyOnBreakInterrupt(true);}catch (TooManyListenersException e){log.error("太多监听器-------------{}");e.printStackTrace();}}/**删除监听器*/public void removeListener(SerialPort port){//删除串口监听器port.removeEventListener();}//通过串口下发指令public static void sendMessage(String com,String param){//开启指定串口SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();SerialPort serialPort = SerialPortUtil.comMap.get(com);if (StringUtils.isNull(serialPort)) {//打开该对应portname名字的串口serialPort = serialPortUtil.openPort(com, 19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);//给对应的serialPort添加监听器serialPortUtil.addListener(serialPort, new SerialPortLister());}//发送数据try {byte[] bytes = param.getBytes();serialPortUtil.sendToPort(serialPort, bytes);} catch (Exception e) {throw new RuntimeException(e);}}
}

3.测试控制类

package com.datago.serve.controller;import com.datago.serve.common.serialport.SerialPortLister;
import com.datago.serve.common.serialport.SerialPortUtil;
import gnu.io.SerialPort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 类描述:TODO* 串口通讯* @author HBO* @date 2022-11-17 16:57**/
@RestController
@RequestMapping("/serial")
public class SerialPortController {@GetMapping(value = "/openSerial")public void openSerial(@RequestParam(value = "portName") String portName,@RequestParam(value = "port") Integer port) {SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();//打开该对应portname名字的串口SerialPort serialPort = serialPortUtil.openPort(portName, port, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);//给对应的serialPort添加监听器serialPortUtil.addListener(serialPort, new SerialPortLister());System.out.println("API开启串口通信");}@GetMapping(value = "/closeSerial")private void closeSerial(@RequestParam(value = "portName") String portName) {SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();SerialPort serialPort = SerialPortUtil.comMap.get(portName);serialPortUtil.removeListener(serialPort);serialPortUtil.closePort(serialPort);SerialPortUtil.comMap.remove(portName);System.out.println("API关闭串口通信");}@GetMapping(value = "/sendSerial")private void sendSerial(@RequestParam(value = "portName") String portName,@RequestParam(value = "code") String code) {SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();SerialPort serialPort = SerialPortUtil.comMap.get(portName);try {byte[] bytes = code.getBytes();serialPortUtil.sendToPort(serialPort, bytes);} catch (Exception e) {throw new RuntimeException(e);}}}

4.实际项目应用

//通过串口给伺服发送数据   参数:转台转速+旋转角度+侧相机焦距(伺服)//查询所属项目获取参数DgProject dgProject = dgProjectService.selectDgProjectByProjectId(projectId);if (StringUtils.isNotNull(dgProject)) {String s = dgProject.getTurntableSpeed() + dgProject.getTurntableAngle() + dgProject.getSideCameraFocal();SerialPortUtil.sendMessage(SerialPortConfig.servo, s);}//  光源串口通讯 侧光源亮度(光源控制器)+底光源亮度(光源控制器)+通道A+B+Cif (StringUtils.isNotNull(dgProject)) {String s = dgProject.getSideLightBrightness() + "-" + dgProject.getBottomLightBrightness()+ "-" + SerialPortConfig.passagewayA + "-" + SerialPortConfig.passagewayB + "-" + SerialPortConfig.passagewayC;SerialPortUtil.sendMessage(SerialPortConfig.light, s);//获取返回数据String lightData = SerialPortLister.lightData;String s1 = setCameraParameterResult + "," + lightData;}}

Java与多串口通讯(二)相关推荐

  1. java serialport_java SerialPort串口通讯的使用

    api文档 maven依赖 com.fazecast jSerialComm [2.0.0,3.0.0) 基于事件的阅读用法示例 可供读取的数据示例 以下示例显示了使用此事件触发器的一种方法: Ser ...

  2. java实现 串口通讯

    参考 Java实现串口通信_我不吃芹菜的博客-CSDN博客_java 串口 java 串口通讯,直接控制报警灯的灯亮和播放音乐. 报警灯接口文档:接收16进制数组 . 报警灯指令文档: 工具方法: h ...

  3. Java 串口 mysql_java串口通讯

    使用java进行串口通信确实不是串口通讯操作的主流方法,另外写好的的java程序无法随意的迁移.不过对熟悉java的同学确实挺有帮助,下面是我使用java语言进行串口通讯的过程. 1 usb转串口安装 ...

  4. JAVA通信编程(五)——串口通讯的补充说明

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在<JAVA通讯编程(一)--串 ...

  5. JAVA通信编程(一)——串口通讯

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. 串行口方式二 波特率_一文就能看懂“串口通讯”的概念、3个通讯方式、9大注意事项...

    串行通信是数据处理设备和外围设备之间最广泛使用的信息传输方法.每个设备可能是您的个人电脑或移动设备在运行串行协议.该协议是一种安全可靠的通信形式,由源主机(发送方)和目的主机(接收方)制定一套规则.为 ...

  7. java串口通讯包_java串口通讯

    Java进行串口通讯,一般需要相关的开源jar包,比较通用的为RXTXComm.jar和comm.jar,其中RXTXComm.jar为在comm.jar基础上进行了封装,对操作系统等一些底层做了适配 ...

  8. java天平数据,java RS232串口通讯(电子天平数据抓取)

    写这篇文章是为了记录RS232串口通讯,当时有个央企项目里需要实现自动抓取RS232串口数据,需要支持主要浏览器:Chrome,Firefox,IE8以上等.看了很多有关rs232的资料和也找了很多方 ...

  9. Java串口通讯 基于Java的串口通讯demo

    自认为更好的方法 https://blog.csdn.net/qq_34775102/article/details/107212822 效果图 1.导入RXTXcomm.jar 链接:https:/ ...

最新文章

  1. TensorRT简介
  2. 如何判断java对象是否为String数组
  3. andriod sdk哪些是必须下载安装的包
  4. 【机器学习】传统目标检测算法之级联分类器Cascade
  5. 任务记录:OEA 框架中的多类型树控件
  6. libreoffice使用_使用LibreOffice Calc管理您的财务
  7. 福大软工—第七次作业需求分析
  8. Mysql运维管理-一主多从宕机从库切换主库继续和从库同步过程16
  9. B key-M key-BM key
  10. 优缺点 快速扫描 硬盘监测_对手中SSD的性能做到心中有数,十款SSD测试软件介绍...
  11. 2017-01-27-一句话木马原理详解
  12. wow工程修理机器人图纸_魔兽世界修理机器人-魔兽世界工程修理机器人图纸哪有啊?魔兽世界 – 手机爱问...
  13. 特斯拉指控华裔工程师窃密案升级 要求小鹏披露源代码
  14. dede mysql x_mysql 插入数据时中文变x87xE7xA7x91xE7x82这种?
  15. 如何把我们的网站变成黑白色或是灰色
  16. 3366 打豆豆 瞄准线 源码程序
  17. 任务栏没有计算机快捷方式,电脑程序在运行但是任务栏没有图标怎么处理 电脑程序在运行但是任务栏没有图标如何处理...
  18. java写response实现文件下载
  19. 社会化商业应用的未来
  20. 某些有趣的API接口(2)

热门文章

  1. 向量空间中的:线性相关与线性无关
  2. CorelDraw 9、12、X3文件打开慢加速补丁
  3. 双十一狂欢,“枣堂”课程优惠促销开始啦!
  4. 执行未来计划每日打卡
  5. 数据结构:竞标赛排序 原理简单
  6. ZBLG:非递归zipbomb炸弹,比例为28000000:1
  7. Java实现一个简单的两人五子棋游戏(六) 行棋方变换
  8. mysql数据对比_MySQL —— 如何快速对比数据?
  9. HDU2066一个人的旅行(SPFA)
  10. 基于C语言实现(控制台)外卖派单模拟系统【100010620】