当前位置: 首页 > article >正文

java 实现串口通讯

1、引入依赖

<dependency>
	<groupId>org.scream3r</groupId>
	<artifactId>jssc</artifactId>
	<version>2.8.0</version>
</dependency>

2、配置启动串口

@Component
public class ContextHolder implements ApplicationContextAware{
	
	private static ApplicationContext applicationContext = null;
	
	@Override
	public void setApplicationContext(ApplicationContext arg0) throws BeansException {
		if(ContextHolder.applicationContext == null){
			ContextHolder.applicationContext  = arg0;
	    }
		System.out.println("========ApplicationContext配置成功,ContextHolder.getAppContext()获取applicationContext对象,applicationContext="+ ContextHolder.applicationContext+"========");
	}
	
	//获取applicationContext
    public static ApplicationContext getApplicationContext() {
       return applicationContext;
    }
    //通过name获取 Bean.
    public static Object getBean(String name){
       return getApplicationContext().getBean(name);
    }
    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz){
       return getApplicationContext().getBean(clazz);
    }
    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
       return getApplicationContext().getBean(name, clazz);
    }

}
@Slf4j
@Component
public class SerialPortCanContext{
    //串口映射
    public static Map<String, SerialPort> serialPortMap = new ConcurrentHashMap<>();


    @PostConstruct
    public void initSerialPort() throws Exception{
        String portName = "COM2";
        startSerialPort(portName);
    }
    /**
     * 初始化串口
     * @param portName
     */
    public synchronized void startSerialPort(String portName){
        //如果有之前的串口就关闭
        SerialPort serialPort1 = serialPortMap.get(portName);
        if (serialPort1 != null){
            try {
                serialPort1.removeEventListener();
                serialPort1.closePort();
            } catch (SerialPortException e) {
                log.error(e.getMessage());
            }
        }
        //生成新的串口并打开
        SerialPort serialPort = new SerialPort(portName);
        try {
            serialPort.openPort();
            serialPort.setParams(SerialPort.BAUDRATE_256000,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_EVEN);
            serialPort.addEventListener(new HhdSerialPortListener());
        } catch (SerialPortException e) {
            log.error(e.getMessage());
        }
        serialPortMap.put(portName,serialPort);
    }
}
/**
 * @author fangyuan
 * @description 串口监听器
 * @date 2023年11月7日09:08:43
 **/
public class SerialPortListener implements SerialPortEventListener {
    private static Logger logger= LoggerFactory.getLogger(HhdSerialPortListener.class);
    private SerialPortCanContext serialPortCanContext;
    public SerialPortListener() {
        this.serialPortCanContext = ContextHolder.getBean(SerialPortCanContext.class);
    }

    @Override
    public void serialEvent(SerialPortEvent serialPortEvent) {
        String portName = serialPortEvent.getPortName();
        if (StringUtils.isBlank(portName)){
            return;
        }
        //通过缓存拿到串口 没有就生成一下
        SerialPort serialPort = SerialPortCanContext.serialPortMap.get(portName);
        if (serialPort == null){
            serialPortCanContext.startSerialPort(portName);
        }
        try {
            String body = serialPort.readString();
            if (StringUtils.isBlank(body)){
                return;
            }
            logger.info("SerialPort : {}  received : {}",portName,body);
            int size = body.length() / 2;
            ByteBuf buf = Unpooled.buffer(size);
            buf.writeBytes(hexToBytes(body));
            //todo 再将buf数据进行后续处理
        } catch (SerialPortException e) {
            logger.error(e.getMessage());
        }
    }



    /**
     * 将16进制字符串转换为byte[]
     * @param hexStr
     * @return
     */
    public static byte[] hexToBytes(String hexStr) {
        int len = hexStr.length();
        hexStr = hexStr.toUpperCase();
        byte[] des;
        if (len % 2 != 0 || len == 0) {
            return null;
        } else {
            int halfLen = len / 2;
            des = new byte[halfLen];
            char[] tempChars = hexStr.toCharArray();
            for (int i = 0; i < halfLen; ++i) {
                char c1 = tempChars[i * 2];
                char c2 = tempChars[i * 2 + 1];
                int tempI = 0;
                if (c1 >= '0' && c1 <= '9') {
                    tempI += ((c1 - '0') << 4);
                } else if (c1 >= 'A' && c1 <= 'F') {
                    tempI += (c1 - 'A' + 10) << 4;
                } else {
                    return null;
                }
                if (c2 >= '0' && c2 <= '9') {
                    tempI += (c2 - '0');
                } else if (c2 >= 'A' && c2 <= 'F') {
                    tempI += (c2 - 'A' + 10);
                } else {
                    return null;
                }
                des[i] = (byte) tempI;
                // system.out.println(des[i]);
            }
            return des;
        }
    }
}

3、 模拟串口发送消息

3、1 安装 Configure Virtual Serial Port Driver

链接:https://pan.baidu.com/s/1fQ76Fh07kzqPeKho9nb7CA?pwd=6533
提取码:6533
解压后安装,将安装后的 这两个文件复制到安装目录并覆盖之前的文件
在这里插入图片描述

在这里插入图片描述

增加映射串口
在这里插入图片描述
打开 我点电脑----> 右键属性 -------> 设备管理 --------->端口查看
有数据表示串口映射成功
在这里插入图片描述

3、2 安装打开 sscom

链接:https://pan.baidu.com/s/13csdZ5XEkZ-E9r5XRYXWVA?pwd=6533
提取码:6533

在这里插入图片描述

3、3 发送消息

在这里插入图片描述

接收消息
在这里插入图片描述


http://www.kler.cn/a/133456.html

相关文章:

  • java面试题(jvm)
  • Vue的基础使用
  • Python中的HTML
  • LeetCode面试经典150题C++实现,更新中
  • 「QT」窗口类 之 QWidget 窗口基类
  • MySQL —— MySQL逻辑架构与查询过程
  • 将word中的表格无变形的弄进excel中
  • 论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models
  • 开发一款小程序游戏需要多少钱?
  • 【uniapp/uview1.x】u-upload 在 v-for 中的使用时, before-upload 如何传参
  • Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题
  • 【Linux】21、软中断、网络小包、SYN FLOOD 攻击、sar tcpdump
  • C语言-统计字符
  • 使用Golang调用摄像头
  • React新手必懂的知识点
  • Zabbix Proxy分布式监控
  • 大数据学习(22)-spark
  • C# WPF Threads 和 Dispatchers 有什么区别
  • 聊聊logback的MDCFilter
  • Java编程技巧:将图片导出成pdf文件
  • Linux | 信号
  • 【done】剑指offer68:二叉树最近公共祖先
  • IDEA远程一键部署SpringBoot到Docker
  • OpenAI GPT5计划泄露
  • 解析:什么是生成式AI?与其他类型的AI有何不同?
  • hyperledger fabric2.4测试网络添加组织数量