获取windows中活跃的Com口

2023-11-08

获取windows中活跃的Com口

记录于2021年11月9日
今天对我来说是个很特殊的一天,母胎SOLO二十一周年(无奈 Orz),闲暇之余写下此文章,记录一下我的日常



前言

这几天做的项目与硬件有点干系,需要用java与串口完成通信,当然完成通信前需要找到系统中活跃串口,今天给大家介绍一下如何找到活跃串口,本文用的包是javacomm20-win32,这个包比较老,若读者的电脑是64位,建议使用RXTX包,这两个包几乎是一样的。
包如何安装本文不做赘述,网上安装教程很多


以下是本篇文章正文内容,下面案例可供参考
若大佬们发现本文不正确的地方,请私信斧正!(抱拳)

一、如何寻找活跃COM口?

要想找到活跃COM口,我们需要时刻关注COM口状态的变化,当某个COM口状态发生改变,我们就认为此COM口为活跃COM口,所以,在我们的程序运行的最初,需要记录下所有COM口的状态,然后用线程去检测COM

二、代码实现

1.导入包

import javax.comm.*;	//使用Com20的需要导入的包
//import gnu.io.*;		//使用RXTX需要导入的包
import java.util.*;
import java.util.concurrent.*

2.获取初始COM口

	Enumeration portList;	//保存所有Com口的枚举类型对象
	HashSet<CommPortIdentifier> before = new HashSet<CommPortIdentifier>(),	//保存初始COM口
								after = new HashSet<CommPortIdentifier>();	//保存监控时依旧存在的COM口
	CommPortIdentifier portId;	
	
	portList = CommPortIdentifier.getPortIdentifiers();	//获取程序最初运行时的com口	
	while (portList.hasMoreElements()) {
		portId = (CommPortIdentifier) portList.nextElement();	
		before.add(portId);		//将初始Com口添加到集合
	}

3.监控线程

public void run(){
		ArrayList<CommPortIdentifier> addarray = new ArrayList<CommPortIdentifier>(),	//保存新增的COM口
									deletearray = new ArrayList<CommPortIdentifier>();	//保存被删除的COM口
		for(;;){	//需要让此线程一直监控
			portList = CommPortIdentifier.getPortIdentifiers();		//重新获取当前所有Com口的枚举
			while (portList.hasMoreElements()){
				after.add((CommPortIdentifier) portList.nextElement());	//保存重新获得的COM口
			}
			/**
			*遍历重新获取Com口的集合,如果改变后的某个COM在初始COM口集合中没有发现,
			*则意味此COM口是新增的COM口,并把此COM口添加至顺序表中保存
			*/
			for(CommPortIdentifier ci : after){		
				if(!before.contains(ci)){	
					//获取到COM口后可以与其建立IO,实现数据的发送和接受,这里只打印出COM口名
					System.out.println("添加了  "+ ci.getName()+"  Com口");	
					addarray.add(ci);			//向保存已添加的com顺序表中添加
				}
			}
			if(addarray.size()==0){		//若遍历结束,且顺序表中无元素,则意味没有找到新添加的COM口
				System.out.println("尚未找到添加的Com口");
			}
			for(CommPortIdentifier ci : before){
				if(!after.contains(ci)){
					System.out.println("移除了  "+ ci.getName()+"  Com口");
					deletearray.add(ci);		//向保存已删除顺序表中添加
				}
			}
			if(deletearray.size()==0){
				System.out.println("尚未找到被移除的Com口");
			}
			
			for(CommPortIdentifier ci : addarray)		//更新初始Com集合
				before.add(ci);
			for(CommPortIdentifier ci : deletearray)
				before.remove(ci);
			after.clear();
			addarray.clear();
			deletearray.clear();
			try{
				Thread.sleep(1000);			//每次检测的时间间隔为1秒(时间可更改)
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}

3.完整代码

import javax.comm.*;
//import gnu.io.*;	
import java.util.*;
import java.util.concurrent.*;

class ComDetect implements Runnable{
	Enumeration portList;
	SerialPort serialPort;
	HashSet<CommPortIdentifier> before = new HashSet<CommPortIdentifier>(),
								after = new HashSet<CommPortIdentifier>();
	CommPortIdentifier portId;	

	ComDetect(){
		portList = CommPortIdentifier.getPortIdentifiers();	
		while (portList.hasMoreElements()) {
			portId = (CommPortIdentifier) portList.nextElement();	
			before.add(portId);		
		}
	}

	@Override
	public void run(){
		ArrayList<CommPortIdentifier> addarray = new ArrayList<CommPortIdentifier>(),
									deletearray = new ArrayList<CommPortIdentifier>();
		for(;;){
			portList = CommPortIdentifier.getPortIdentifiers();		
			while (portList.hasMoreElements()){
				after.add((CommPortIdentifier) portList.nextElement());	
			}
			for(CommPortIdentifier ci : after){
				if(!before.contains(ci)){
					System.out.println("添加了  "+ ci.getName()+"  Com口");
					addarray.add(ci);			
				}
			}
			if(addarray.size()==0){
				System.out.println("尚未找到添加的Com口");
			}
			for(CommPortIdentifier ci : before){
				if(!after.contains(ci)){
					System.out.println("移除了  "+ ci.getName()+"  Com口");
					deletearray.add(ci);		
				}
			}
			if(deletearray.size()==0){
				System.out.println("尚未找到被移除的Com口");
			}
			
			for(CommPortIdentifier ci : addarray)		
				before.add(ci);
			for(CommPortIdentifier ci : deletearray)
				before.remove(ci);
			after.clear();
			addarray.clear();
			deletearray.clear();
			try{
				Thread.sleep(1000);			
			}catch(InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args){
		ExecutorService exec = Executors.newCachedThreadPool();		//用执行器为我们托管线程
		exec.execute(new Thread(new ComDetect()));
	}
}


总结

提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了如何找到活跃COM口而未对获取COM做任何处理,读者可按需加上处理的代码片。
觉得本文对自己有帮助,请点个免费的赞还有留下评论吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取windows中活跃的Com口 的相关文章

随机推荐

Powered by Hwhale