这是我的毕业设计,要求是将电脑串口(USB)接收到的数据打包上传到互联网,花了几天时间了解了java读取串口和制作图形界面的方法,做了一个小程序实现了这个功能,这里只是简单记录一下java读取串口的方法。
首先查到java读取串口数据,需要下载一个叫javacomm20-win32
的包,这个 包是官方提供的,已经过时了,看名字也知道只支持32位的系统。由于是64位系统的电脑,几番搜寻后发现了一个叫RXTX
的扩展包,支持Linux,mac,Win32,和Win64,这个类继承自javax.comm
,所以下载进行配置后就可以像使用javax.comm
一样进行使用串口了。下载地址为:http://rxtx.qbang.org/pub/rxtx/
- 注意,下载
rxtx-2.2pre1-bins.zip
这个文件,其他版本会报错或者不支持Win64。
下载完成解压后就可以看到各个版本的文件夹了,选择相应的版本进入,如我是64位Win10,就进入win64的文件夹,复制rxtxSerial.dll
文件到jre目录\bin 文件夹
,我的jre目录
在C盘,所以我要复制到:C:\Program Files\Java\jre8\bin
里面。完成过后再将外面的 RXTXcomm.jar
文件复制到 jre目录\lib\ext
文件夹里面。
完成以后就可以进行java串口的开发了,先新建一个class,代码如下:
package com;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
public class SerialBean implements SerialPortEventListener {
private static String PortName;
private static CommPortIdentifier portId;
private static SerialPort serialPort;
private static OutputStream out;
private static InputStream in;
public static int baud = 115200;
public SerialBean(String com, int baud) {
SerialBean.PortName = com;
SerialBean.baud = baud;
}
// 初始化串口,将输入流返回用于事件读取
public void Initialize() {
try {
portId = CommPortIdentifier.getPortIdentifier(PortName);
// 由对象打开串口,并为串口命名
serialPort = (SerialPort) portId.open("JAVA_SERIAL", 2000);
// 注册一个SerialPortEventListener事件来监听串口事件
serialPort.addEventListener(this);
// 数据可用则触发事件
serialPort.notifyOnDataAvailable(true);
// 打开输入输出流
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
// 设置串口参数,波特率115200,8位数据位,1位停止位,无奇偶校验
serialPort.setSerialPortParams(baud, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (PortInUseException e) {
System.out.println("该串口正在使用中");
} catch (NoSuchPortException e) {
System.out.println("该串口当前不可使用");
} catch (UnsupportedCommOperationException e) {
System.out.println("错误的串口参数配置");
} catch (TooManyListenersException e) {
System.out.println("该串口已存在监听器");
} catch (IOException e) {
System.out.println("输入输出流打开失败");
}
}
// 关闭串口
public void ClosePort() {
serialPort.close();
}
// 监听串口事件
@Override
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.BI://Break interrupt,通讯中断
case SerialPortEvent.OE://Overrun error,溢位错误
case SerialPortEvent.FE://Framing error,传帧错误
case SerialPortEvent.PE://Parity error,校验错误
case SerialPortEvent.CD://Carrier detect,载波检测
case SerialPortEvent.CTS://Clear to send,清除发送
case SerialPortEvent.DSR:// Data set ready,数据设备就绪
case SerialPortEvent.RI://Ring indicator,响铃指示
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:// Output buffer is empty,输出缓冲区清空
break;
case SerialPortEvent.DATA_AVAILABLE://Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端
String r = "";
int c;
try {
if (in != null) {
while (in.available() > 0) {
c = in.read();
Character d = new Character((char) c);
r = r.concat(d.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.print(r);
break;
}
}
}
这个程序只能进行串口读取,串口读取的操作需要注册事件,当串口有数据时触发函数serialEvent
,然后再对接收到的数据进行处理,主要是对字符串进行一个拼接操作。主方法中只需要进行串口的初始化操作即可。主方法如下:
package com;
import java.io.IOException;
import java.util.Enumeration;
import gnu.io.*;
public class SerialCom {
public static void main(String[] args) {
//打开串口3
SerialBean serialBean = new SerialBean("COM3", 115200);
serialBean.Initialize();
}
public static void listPortChoices() {
CommPortIdentifier portId;
Enumeration en = CommPortIdentifier.getPortIdentifiers();
// iterate through the ports.
while (en.hasMoreElements()) {
portId = (CommPortIdentifier) en.nextElement();
System.out.println("当前可用串口:");
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println(portId.getName());
}
}
}
}
listPortChoices()
函数并没有使用,这个函数可以输出当前电脑上的可用串口。构造SerialBean
对象时,输入的COM3
和115200
分别表示端口号和所使用的波特率,由所连接的设备决定,我这里是由一个单片机通过USB转串口模块与电脑连接,单片机串口波特率为115200,USB转串口模块被电脑分配到COM3口。