Java如何拿到串口的详细信息

前言

如题,我们知道java实际上不擅长这些硬件底层的操作,而如果想要用java来实现串口操作,实际上有点麻烦,大家在网上也能找到资料,相信大多都是用的RXTX的那个包,虽然这玩意有点老,但是另一个包更老,还不支持64位,所以也就凑合着用RXTX了。
但是我们使用RXTX时,获取端口列表,却只能拿到COM1、COM2这样子的端口名,要知道,你插不同的设备,不同的USB口,电脑自动分配的COM口是不一样的,那么该如何自动的定位COM口来通信呢?总不能让用户自己选择吧,用户自己翻翻设备管理器,试试看是哪个端口?这样子一方面,用户体验肯定不好,另一方面,你这个工具是不是写的不够自动化?
那么该怎么做呢?搞过C++/C# 甚至是MATLAB的朋友,肯定觉得这玩意很简单,我们直接拿到串口设备的详细信息不就好了,还可以拿到它的供应商什么的?没错,在以上这几个语言里,这玩意很容易得到,但是Java就要绕一个弯了。

探索

首先在电脑中找到串口信息。
这个有一点基础的人,肯定都知道打开设备管理器即可。
大家可以看到如图所示,端口这里不仅仅写了端口号,在端口号的前面还写有一些Virtual Serial Port的字样,其实这个是我虚拟出来的串口,平常的应该不是这样。
我记得应该是类似通用端口COM1 这样的字眼,不过无所谓,我们主要想拿到COM口前的这些字,比如 Virtual Serial Port或者是USB-Serial CH340(COM4),而不是仅仅COM4 ,当然具体是什么取决于诸位的电脑系统。
在这里插入图片描述
那么该怎么拿这些信息呢,我能不能直接读取上图中的信息呢?很抱歉,我觉得java应该是不行的,或者说我目前没有找到直接读取设备管理器的信息,如果有大佬知道希望能够赐教!
不过,别慌,我知道怎么间接读取串口信息!
那就是,注册表!!!
win+R 快捷键,或者开始菜单输入运行或者run回车即可进入运行界面
在这里插入图片描述
如图,输入regedit,即可进入注册表
在这里插入图片描述
大家可以看到在上图的路径HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
这个路径我们可以看到COM1、COM2、COM3、COM4 ,我这个电脑中可用的端口,但是还是没有详细的信息啊,只有个端口号。
别急,这个路径先记下来,我们再来看看另一个路径:
HKLM\SYSTEM\CurrentControlSet\Enum\USB
这个路径下面有很多的跟乱码一样的文件,我们照着图片中的内容打开,是不是看到了右侧 FriendlyName 这个对应的内容,没错,这正是我们所需要的!
在这里插入图片描述

继续

那么问题来了,我们怎么操作,或者说读取这个内容呢?
或者说Java该怎么读取注册表呢?
如果你在网上查java该怎么读取注册表?你大概会得到以下答案:大概有三种方式了,使用API,使用jar,使用JNI。你会发现这三种方式,要么就是满足我们的需求,要么就是太麻烦了 ,我就读个串口信息,还要用JNI,老天别搞好不好!
所以我们不用这三种方法:
我们还有一个间接的方式那就是,使用cmd命令!!!
windows提供了这么一个命令:reg
只要在Cmd命令行输入对应的Reg命令,我们就可以读写增删注册表!
该怎么用呢?
首先打开win+R打开运行输入cmd回车
在这里插入图片描述
进入命令行界面
在这里插入图片描述
我们先来试试第一个路径:
输入:
reg query “HKLM\HARDWARE\DEVICEMAP\SERIALCOMM”
回车,我们可以看到注册表的信息我们已经拿到了!
在这里插入图片描述
我们再来试试第二个路径
输入:
reg query “HKLM\SYSTEM\CurrentControlSet\Enum\USB”
在这里插入图片描述
这个时候,你可能有所疑问!这不是我想要的数据啊,我想要的是FriendlyName啊!
我们拿到这个数据存入list列表,取出来在执行一次不就拿到了下一层目录了吗?
但是又有人可能有疑问,那么我最终拿到数据,不是要遍历好多次,假如这个cmd命令执行一次是0.063秒,那么多次之后岂不是有可能长达4秒!
没错,这就是我刚开始遇到的问题!4秒这个时间太长了,对于我做的这个项目,如果需要4秒,那我甚至还不如不要这个自动判定!
那么我最后又是怎么解决的呢!
先这样,再这样,最后这样,你们懂了吗?
哈哈哈,开个玩笑。
不妨诸位输入这个指令看一下
reg query “HKLM\SYSTEM\CurrentControlSet\Enum\USB” /s
在这里插入图片描述
大家是不是感觉屏幕狂闪,没错,/s 意思就是拿到该目录下的所有目录,这样我们就不用一次次的遍历的,一次就拿到所有的数据了!
但是有朋友发现,wtf!说了这么多还是没有FriendlyName啊!
你怎么搞的!
别急,你再试着输一下下面的指令:
reg query “HKLM\SYSTEM\CurrentControlSet\Enum\USB” /s /v FriendlyName
在这里插入图片描述
你看,这信息不就拿到了!
当然,大家有没有发现一个问题,我们可用的端口只有四个,而我们搜索出来的却有七个,
不要忘了我们的第一条路径后,两个结合我们是不是就可以确定端口了!

最后

那么最后一个问题就来了,用cmd reg我们是拿到了我们想拿到的数据了!
那么该怎么用java拿到这些东西呢
时间有限,我的代码在公司拿不回来,我就说个思路吧,下次给大家补上,不过这也不难:
首先摆在眼前的问题就是,java怎么用cmd!
Runtime.exec(),大家可以搜一下这个函数,应该网上很好找的
使用Runtime.exec(),在加上输入流和输出流,我们就可以拿到信息。
最后再从数据中,提取一下,就可以了!

嗯,就这么多了,十点了,告辞了,诸位!

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值