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位版本,内含如何安装的说明。不明白可以直接去官网下载

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

  1. 51单片机串口通讯c语言程序,如何使用51单片机实现串口通信

    描述 STC51单片机一般带有1个串口,有的带有2个串口,串口一般用于下载程序和串口通信.串口通信特别适合控制设备,所以工控机的电脑上一般都带有串口. 51单片机的串口引脚为P3.0引脚与P3.1引脚 ...

  2. 第十九节 串口通讯与终端设备

    本章主要讲解串口和终端设备的基本使用,并且通过这个过程解构如何使用ioctl 系统调用向设备文件写入特别的命令,控制硬件.我们需要熟悉ioctl 的使用,是因为在后面编写驱动时,某些硬件需要向内核提供 ...

  3. c#调api串口通讯

    c#调api串口通讯 原文:c#调api串口通讯 在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort类是否有问题,所以最后决定用纯API函数实现串口读写. 先 ...

  4. 乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本

    代码地址如下: http://www.demodashi.com/demo/13650.html 文章目录 一.前言: 二.`esp8266`的串口分布情况: 三.`esp8266`的串口通讯时候,应 ...

  5. 西门子1200串口通讯应用知识点

    串口通讯是所有电气工程师以及嵌入式工程师所必须掌握的技能,串口通讯实在是运用太广泛了,如果对串口通讯不了解或者一知半解,怎么能说自己是一名合格的电气工程师呢? 1.串行异步(UART)"异步 ...

  6. PLC通讯实现-C#实现AB5000 PLC串口通讯DTL32(七)

    PLC通讯实现-C#实现AB5000 PLC串口通讯DTL32(七) 背景 抽象设计 AB串口通讯实现DTL32 背景 本人近十年的工作都与工业软件相关.其中工控系统开发过程中有一个必要环节就是跟各大 ...

  7. 树莓派3B+:串口通讯

    树莓派3B+:串口通讯 背景 一.树莓派串口通讯是什么? 二.使用步骤 1.树莓派串口知识 2.查看当前的串口使用及映射关系 3.释放串口ttyAMA0 3.代码控制串口,验证是否可用 三.minic ...

  8. PLC通讯实现-C#实现西门子PLC串口通讯W95_S7(四)

    PLC通讯实现-C#实现西门子PLC串口通讯W95_S7(四) 背景 抽象设计 西门子串口通讯实现W95_S7 背景 本人近十年的工作都与工业软件相关.其中工控系统开发过程中有一个必要环节就是跟各大厂 ...

  9. 关于嵌入式linux下的串口通讯问题---回车、换行、缓冲

    嵌入式Linux串口通讯测试问题:   经过实验,从Linux(PC)通过串口向嵌入式Linux开发板发送数据时,串口初始化完毕后遇到回车(0x0d)或换行(0x0a)才开始从串口接收数据,回车或换行 ...

最新文章

  1. 技术图文:Matlab向量 VS. Python列表
  2. How to include custom library into maven local repository?--转
  3. 非专业计算机考试基础内容,全国高等教育自学考试指定教材:计算机应用基础·非计算机专业公共基础科·代码00018...
  4. jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...
  5. LeetCode 611. 有效三角形的个数(双指针)
  6. 用MATLAB实现神经网络
  7. js设计模式——3.观察者模式
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的智能养生平台系统
  9. .htaccess使用说明
  10. Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
  11. 黑盒测试方法-----状态转换图
  12. 侦测单IP是否为路由器,级联PC的原理
  13. 免费临时邮箱,一次性邮箱
  14. pytest.fixture如何像testng的beforeMethod一样使用
  15. EasyRecovery15数据恢复注意事项及主要功能介绍
  16. SSL数字证书下载流程是怎么样的
  17. 程序员年薪30万,却被丈母娘果断拒绝!网友:就不能一起奋斗吗
  18. 计算机英语实用教程课后答案,计算机英语实用教程课后题参考答案.doc
  19. 4G和大数据让山西走出一条移动医疗道路
  20. 一些世界上著名杀软的专杀工具下载地址

热门文章

  1. 坐骨神经痛怎么调养比较好
  2. 用PS打造无限旋转阶梯级
  3. 本地python库离线包批量导出和导入
  4. 数独求解算法_我如何回到一个老问题,终于写了一个数独求解算法
  5. java 多人聊天室_Java高效NIO之多人聊天室
  6. layout_weight属性的用法和意义
  7. 全球第一经典语录,被500万人疯狂转载!
  8. redis提权漏洞处理
  9. 「Adobe国际认证」关于 Photoshop 图层详解
  10. Android触摸事件分发