获取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(使用前将#替换为@)