java串口通讯,可实现javaWeb页面同时控制多个串口,有demo

这篇博客分享了如何在JavaWeb中实现串口通讯,包括控制多个串口、实时监听数据变化以及数据转换。作者强调了针对不同串口需创建独立对象、设置定时器发送指令以实现数据更新,并提供了处理串口数据的转换方法。此外,还提到了需要注意的RXTX.jar版本选择和虚拟串口软件的使用问题。

java串口通讯,可实现javaWeb页面控制串口,调用串口数据,发送串口指令

前言

关于java实现串口通讯网上有很多例子,但是都是做客户端的demo,实际集成到javaWeb系统中会遇到很多问题。我之前做过一个项目,客户要求工控系统用web的形式做,这样做的会比较美观大方。因为商业原因,项目就不透漏了,我整理了一下,写了个demo供大家参考。

原理

RXTX.jar提供一系列串口相关操作,大家网上一搜应该都能找到一个java写的客户端程序操作串口,这个比较简单,相信大家一看就会,我就不多说了。下面我讲讲会遇到的问题

javaWeb操作串口遇到的问题

1.如何同时操作多个串口?
一开始我也走进了误区,作为java程序猿,总想着一个方法可以通用做很多事情,所以想着用一个方法操作多个串口,根据传入的串口名称同时操作不同的串口。然而在串口通讯这里,这个逻辑不对。java里面,一个串口就是一个对象,两个串口是两个对象,不能把所有串口当成一个对象然后去new。打开串口,关闭串口这些方法都是该对象的方法,需要对象存在才能执行,不能一个open()方法既能打开COM1又能打开COM2。所以,如果要操控多个串口,你需要写多个串口类对象。如COM01,COM02,COM03类,每个类里面都有打开串口和关闭串口之类的所有操作方法。如果要操作COM1,则使用COM01.open()方法;操作串口COM2则使用COM02.open()方法,以此类推。而且可以同时打开所有你要使用的串口,一直开着独立的串口监听,不需要交换一次数据关闭一次串口。(这里COM01类并不是我名字写错了,而是创建类的时候COM1名称不让用,特意改的)
在这里插入图片描述
2.如何实时监听串口数据变化?
把自己需要获取的串口数据对应的指令封装到一个方法中,然后开一个定时器,定时调用该方法发送指令。因为串口打开的同时我启动了监听,所以监听方法内可以接收到因该指令而返回的串口数据。在这个监听方法中把获取到的数据存入数据库,就能得到定时收到的数据,形成数据列,在前端通过图表的形式展现出来。这样实现实时监听串口数据变化的功能。因为定时器方法我单独写了,所以数据的刷新间隔可以根据用户需求而定,当然还得根据设备性能而定。建议5秒比较合适。具体代码如下所示:
这里封装需要获取的数据对应的指令
在监听方法内把获取到的数据写入到数据库中
3.现在的工控设备都是双工双向的,我要在实时监听串口数据变化的同时,还要发送另外的指令该怎么办?
在demo中,使用我的readFromPort()方法拿一次串口数据后,该串口上的数据就会消失。所以,我在监听串口的同时,可以另外写一个sendToPort()方法实时获取串口数据,这样我只需要在sendToPort()方法和监听方法中判断拿到的值如果为空就不处理即可。这样,即使一个串口指令被sendToPort()方法和监听都捕获一次也没关系。因为方法调用的,方法会先执行捕获。等监听捕获时,拿到的是空值,不处理。
4.拿到的串口数据如何处理?都是数字如何转换成明文?
因为485协议中串口通讯一般都是用的16进制,而java内串口通讯用的却是byte,我们需要用的又是明文。三者如何进行转换呢?
a) 首先根据设备厂商提供的通讯协议,结合485通讯协议整理出我们想要获取的数据分别需要发送什么指令,这个指令一般就是十六进制的。目前基本都是用的十六进制,若设备厂家用的十进制情况也是一样的,你换个进制转换方法即可,我的demo中都有。
b)知道指令后,把该指令转换成byte数据发送给串口。
c)串口收到指令后传回来的数据还是byte数据。
d)再把收到的byte数据转换成十六进制数据。
d)最后再根据设备厂家提供的通讯协议把十六进制数据转换成明文。(这里我已经写好了byte和十六进制以及十进制之间转换的方法,demo里面有。至于怎么根据厂家提供的通讯协议把十六进制转换成明文也有demo)
可以阅读另一篇博文:485通讯协议在java中的应用

下面是我根据通讯协议写的,把十六进制数据转换成明文的方法。

/**
	 * 串口COM1接收数据处理方法
	 * @param String 串口接收到的字符串数据
	 * @return dcPowerSupply 直流表电源数据对象
	 */
	public static DcPowerSupply dataConversion(String receiveData) {
		
		DcPowerSupply dcPowerSupply = new DcPowerSupply();
		dcPowerSupply.setId(DataUtil.UUID());
		dcPowerSupply.setDateTime(DateUtil.getDateTime());
		dcPowerSupply.setVoltage(DataUtil.hexChangeDecimal(receiveData.substring(6, 10))*10*DataUtil.RadixPoint(DataUtil.hexChangeDecimal(receiveData.substring(10, 14))));
		dcPowerSupply.setCurrent(DataUtil.hexChangeDecimal(receiveData.substring(14, 18))*DataUtil.RadixPoint(DataUtil.hexChangeDecimal(receiveData.substring(18, 22))));
		dcPowerSupply.setPower(DataUtil.hexChangeDecimal(receiveData.substring(38, 42))*DataUtil.RadixPoint(DataUtil.hexChangeDecimal(receiveData.substring(42, 46))));
		return dcPowerSupply;
	}

需要注意的问题

1.RXTX.jar的使用建议使用java1.7版本
2.如果服务器上没有串口,打开串口时会报错。这里可以优化一下,先查询现有串口,如果为null则抛异常,因为我这里服务器是定制的,不会有这个错,所以没有做这个处理了。
3.还有需要特别说明的是,串口是个物理存在的接口,位于计算机主机背面的一个类似于VGA的接口,它是9针的,跟VGA不一样。并不是所有电脑都有串口,现在新的电脑主板基本不会配置串口的,笔记本上更加是绝对不会有。所以,如果你测试的时候报错,请先确认你的电脑是否有串口。没有串口你去open是绝对会报错的。如果你没有拥有串口的电脑,可以在网上下载一个虚拟串口软件,当然这东西有好有坏,不行你就再换个下载试试。而且我测试的时候发现,有的电脑貌似虚拟串口都无法创建的。所以,如果不行,你还是弄个有串口的电脑测试吧,毕竟工欲善其事必先利其器。

demo下载

javaWeb实现串口通讯demo
demo下载后在eclipse中导入即可,用Tomcat运行后访问index.jsp页面即可看到测试方法的按钮
RXTX.jar依赖包
这是官网下载的包,有32位和64位版本,内含如何安装的说明。不明白可以直接去官网下载

评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值