应用场景
公司是物联网行业的,由于项目需要用到
RS-232接口
与传感器设备进行通信,而我们后台是使用JAVA
语言开发的,那么毋庸置疑,此次的串口通信开发也用JAVA
语言实现。服务器操作系统为Windows Server 2008 R2 Enterprise
。
整体步骤
- 机器硬件测试
- 安装JAVA运行环境
- 下载第三方库
- 写代码调试运行
机器硬件测试
首先我们需要用一个软件来测试服务器的串口是否正常,如果能够用软件正常打开串口,基本上就认为硬件是没问题的了。我使用的是串口调试助手这个软件,可以很轻松地测试机器的串口。
安装JAVA运行环境
作为一位JAVA开发者,我相信很多人都做过这个事情,但是今天我还是要重复一遍。
-
从Oracle网站下载JRE或者JDK。如果只是运行JAVA程序,安装JRE即可。这里一定要注意,下载与操作系统匹配的文件,否则会出现各种奇葩的问题,浪费宝贵的时间。
-
安装好JRE或者JDK后,要在操作系统的高级设置里添加
JAVA_HOME
这个环境变量,并补充PATH
这个环境变量。设置后以后,在命令行里敲java -version
命令检查结果。
下载第三方库
- 到 RXTX 下载文件,这里同样注意选择与操作系统匹配的文件,我们的操作系统是64位的,所以点 Windows-x64 这个链接,下载下来的文件是个压缩包,我们解压开。
- 文件清单如下,其中
RXTXcomm.jar
rxtxParallel.dll
rxtxSerila.dll
三个文件是最关键的,其他的几个txt文件是一些描述文件,看看就好,我们主要看Install.txt
这个文件。
-
Install.txt
文件里详细说明了安装步骤,将RXTXcomm.jar
复制到<JAVA_HOME>\jre\lib\ext
目录下,将rxtxSerial.dll
复制到<JAVA_HOME>\jre\bin
目录下,将rxtxParallel.dll
复制到<JAVA_HOME>\jre\bin
目录下。
写代码调试运行
- 引入项目依赖
<dependency>
<groupId>org.rxtx</groupId>
<artifactId>rxtx</artifactId>
<version>2.1.7</version>
</dependency>
- 代码具体实现
/** 串口对象 */
private SerialPort serialPort;
/**
* 初始化
*/
private void init() {
// 通信的串口
final String crtComName = "COM1";
try {
// 打开串口并获取串口对象
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(crtComName);
// 设置超时时间为2000ms
serialPort = (SerialPort) portIdentifier.open(crtComName, 2000);
// 设置参数(包括波特率,数据位,停止位,奇偶校验)
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// 设置当有数据到达时唤醒监听接收线程
serialPort.notifyOnDataAvailable(true);
// 设置当通信中断时唤醒中断线程
serialPort.notifyOnBreakInterrupt(true);
// 接收并处理数据
serialPort.addEventListener(new DataReceivedListener());
log.info("打开串口[{}]成功", crtComName);
} catch (Exception e) {
log.error("打开串口[{}]发生异常!!!", crtComName, e);
}
}
/**
* 数据接收监听器
*/
private class DataReceivedListener implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
// 这里可以写自己的逻辑
}
}
}
- 解释
SerialPort对象是对串口的一个抽象,可以缓存该对象,在事件触发了之后,可以从该对象中获取输入流和输出流,从而实现从串口中读取数据或者往串口发送数据。
/**
* 从串口中读取数据
*/
private void readDataFromSerialPort() {
InputStream inputStream = null;
try {
inputStream = serialPort.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream(inputStream.available());
// 使用流的方式从串口中读取数据
byte[] buffer = new byte[4096];
int length;
while ((length = inputStream.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
// TODO
} catch (Exception e) {
log.error("从串口[{}]读取数据发生异常", serialPort.getName(), e);
} finally {
IOUtil.closeQuietly(inputStream);
}
}
- 总结
在Windows系统下做串口开发的步骤大概就是这样了,很简单,按照步骤一步一步来就行了。
网友评论