串口通讯demo-serial port communication 供参考
来源:互联网 发布:windows 2012 r2 编辑:程序博客网 时间:2024/05/22 22:43
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import serialException.NoSuchPort;
import serialException.NotASerialPort;
import serialException.PortInUse;
import serialException.ReadDataFromSerialPortFailure;
import serialException.SendDataToSerialPortFailure;
import serialException.SerialPortInputStreamCloseFailure;
import serialException.SerialPortOutputStreamCloseFailure;
import serialException.SerialPortParameterFailure;
import serialException.TooManyListeners;
/**
* 串口服务类,提供打开、关闭串口,读取、发送串口数据等服务(采用单例设计模式)
* @author zhong
*
*/
public class SerialTool {
private static SerialTool serialTool = null;
static {
//在该类被ClassLoader加载时就初始化一个SerialTool对象
if (serialTool == null) {
serialTool = new SerialTool();
}
}
//私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象
private SerialTool() {}
/**
* 获取提供服务的SerialTool对象
* @return serialTool
*/
public static SerialTool getSerialTool() {
if (serialTool == null) {
serialTool = new SerialTool();
}
return serialTool;
}
/**
* 查找所有可用端口
* @return 可用端口名称列表
*/
@SuppressWarnings("unchecked")
public static final ArrayList<String> findPort() {
//获得当前所有可用串口
Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
ArrayList<String> portNameList = new ArrayList<>();
//将可用串口名添加到List并返回该List
while (portList.hasMoreElements()) {
String portName = portList.nextElement().getName();
portNameList.add(portName);
}
return portNameList;
}
/**
* 打开串口
* @param portName 端口名称
* @param baudrate 波特率
* @return 串口对象
* @throws SerialPortParameterFailure 设置串口参数失败
* @throws NotASerialPort 端口指向设备不是串口类型
* @throws NoSuchPort 没有该端口对应的串口设备
* @throws PortInUse 端口已被占用
*/
public static final SerialPort openPort(String portName, int baudrate) throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse {
try {
//通过端口名识别端口
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
//打开端口,并给端口名字和一个timeout(打开操作的超时时间)
CommPort commPort = portIdentifier.open(portName, 2000);
//判断是不是串口
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
try {
//设置一下串口的波特率等参数 baudrate
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
throw new SerialPortParameterFailure();
}
System.out.println("Open " + portName + " sucessfully !");
return serialPort;
}
else {
//不是串口
throw new NotASerialPort();
}
} catch (NoSuchPortException e1) {
throw new NoSuchPort();
} catch (PortInUseException e2) {
throw new PortInUse();
}
}
/**
* 关闭串口
* @param serialport 待关闭的串口对象
*/
public static void closePort(SerialPort serialPort) {
if (serialPort != null) {
serialPort.close();
System.out.println("Close " + serialPort + " sucessfully !");
serialPort = null;
}
}
/**
* 往串口发送数据
* @param serialPort 串口对象
* @param order 待发送数据
* @throws SendDataToSerialPortFailure 向串口发送数据失败
* @throws SerialPortOutputStreamCloseFailure 关闭串口对象的输出流出错
*/
public static void sendToPort(SerialPort serialPort, byte[] order) throws SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {
OutputStream out = null;
try {
out = serialPort.getOutputStream();
out.write(order);
out.flush();
} catch (IOException e) {
throw new SendDataToSerialPortFailure();
} finally {
try {
if (out != null) {
out.close();
out = null;
}
} catch (IOException e) {
throw new SerialPortOutputStreamCloseFailure();
}
}
}
/**
* 从串口读取数据
* @param serialPort 当前已建立连接的SerialPort对象
* @return 读取到的数据
* @throws ReadDataFromSerialPortFailure 从串口读取数据时出错
* @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
*/
public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {
InputStream in = null;
byte[] bytes = null;
try {
in = serialPort.getInputStream();
int bufflenth = in.available(); //获取buffer里的数据长度
while (bufflenth != 0) {
bytes = new byte[bufflenth]; //初始化byte数组为buffer中数据的长度
in.read(bytes);
bufflenth = in.available();
}
} catch (IOException e) {
throw new ReadDataFromSerialPortFailure();
} finally {
try {
if (in != null) {
in.close();
in = null;
}
} catch(IOException e) {
throw new SerialPortInputStreamCloseFailure();
}
}
return bytes;
}
/**
* 添加监听器
* @param port 串口对象
* @param listener 串口监听器
* @throws TooManyListeners 监听类对象过多
*/
public static void addListener(SerialPort port, SerialPortEventListener listener) throws TooManyListeners {
try {
//给串口添加监听器
port.addEventListener(listener);
//设置当有数据到达时唤醒监听接收线程
port.notifyOnDataAvailable(true);
//设置当通信中断时唤醒中断线程
port.notifyOnBreakInterrupt(true);
} catch (TooManyListenersException e) {
throw new TooManyListeners();
}
}
}
package serialPort;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.IOException;
import java.io.InputStream;
import java.util.TooManyListenersException;
import serialException.NoSuchPort;
import serialException.NotASerialPort;
import serialException.PortInUse;
import serialException.ReadDataFromSerialPortFailure;
import serialException.SendDataToSerialPortFailure;
import serialException.SerialPortInputStreamCloseFailure;
import serialException.SerialPortOutputStreamCloseFailure;
import serialException.SerialPortParameterFailure;
public class EventListener implements SerialPortEventListener {
// 1.定义变量
SerialPort serialPort = null;
InputStream inputStream = null;// 输入流
Thread readThread = null;
// 2.构造函数:
// 实现初始化动作:获取串口COM21、打开串口、获取串口输入流对象、为串口添加事件监听对象
public EventListener() throws NoSuchPortException, PortInUseException {
try {
// 获取串口、打开窗串口、获取串口的输入流。
serialPort = SerialTool.openPort("COM5", 115200);
//向设备发送的命令
byte[] send = new byte[7];
send[0]=0x1B;
send[1]=0x2A;
send[2]=0x00;
send[3]=0x00;
send[4]=0x00;
send[5]=0x00;
send[6]=0x00;
try {
SerialTool.sendToPort(serialPort,send);
} catch (SendDataToSerialPortFailure e) {
e.printStackTrace();
} catch (SerialPortOutputStreamCloseFailure e) {
e.printStackTrace();
}
try {
SerialTool.readFromPort(serialPort);
} catch (ReadDataFromSerialPortFailure e) {
e.printStackTrace();
} catch (SerialPortInputStreamCloseFailure e) {
e.printStackTrace();
}
SerialTool.closePort(serialPort);
serialPort.close();
inputStream = serialPort.getInputStream();
// 向串口添加事件监听对象。
serialPort.addEventListener(this);
// 设置当端口有可用数据时触发事件,此设置必不可少。
serialPort.notifyOnDataAvailable(true);
} catch (IOException e) {
e.printStackTrace();
} catch (TooManyListenersException e) {
e.printStackTrace();
} catch (SerialPortParameterFailure e) {
e.printStackTrace();
} catch (NotASerialPort e) {
e.printStackTrace();
} catch (NoSuchPort e) {
e.printStackTrace();
} catch (PortInUse e) {
e.printStackTrace();
} finally {
// SerialTool.closePort(serialPort);
}
}
// 重写继承的监听器方法
@Override
public void serialEvent(SerialPortEvent event) {
// 定义用于缓存读入数据的数组
byte[] cache = new byte[1024];
// 记录已经到达串口COM21且未被读取的数据的字节(Byte)数。
int availableBytes = 0;
// 如果是数据可用的时间发送,则进行数据的读写
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
availableBytes = inputStream.available();
while (availableBytes > 0) {
inputStream.read(cache);
for (int i = 0; i < cache.length && i < availableBytes; i++) {
// 解码并输出数据
System.out.print((char) cache[i]);
}
availableBytes = inputStream.available();
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws NoSuchPortException,PortInUseException {
new EventListener();
}
}
异常类自已去定义,还要去下载架包RXTXcomm.jar
- 串口通讯demo-serial port communication 供参考
- iPhone serial port communication
- iPhone serial port communication
- c# 2.0 serial port communication
- serial port communication by java
- A communication class for serial port
- A communication class for serial port
- Java --- serial port communication example codes
- C#serial Port串口处理~
- Ubuntu 虚拟串口 Serial port
- Mac OS上使用串口(serial port)和虚拟机通讯
- WIZnet推出虚拟串口(Virtual Serial Port)
- 串口通信Serial Port类C++实现
- 串口通信Serial Port类C++实现
- 虚拟串口程序Virtual.Serial.Port.Driver
- Android 操作串口 (android serial port api)
- Mac OS 串口 Serial Port 读写
- Communication on a serial port in NET 2.0
- 动态稀疏矩阵的两个三元组进行相加的算法
- SELECT查询命令的使用
- Java+opencv3.2.0之环境配置
- 软件测试之使用jmeter进行压力测试
- 2.3 Spring的核心机制:依赖注入
- 串口通讯demo-serial port communication 供参考
- 十四、流程控制语句
- nodejs建站-回复评论
- thinkphp框架中“关联操作”的完整定义详解
- PHP5和7中的zval全介绍,内存管理,类型,引用计数(2)
- 学习笔记之——初识Kotlin
- Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景
- MFC View类对话框类之间指针的相互获取
- method swizzling使用一例