* 官方demo版只有一个线程实现和一个监听实现,所以都是main方法。知道需要连接的串口号,对于实际开发中不太实用,因为咱们一般都是自动获取的多嘛。。所以这文章就算是总结吧。
先说一下连接思路,由于串口设备需要热拨插,所以我必须写一个线程一直监控着端口的状态是否正常,所以可以按以下几个步骤进行解决。
1. 列出可用的串口列表;(如果某串口被占用证明是被打开通讯后的,此时不会在这个列表中,还有一般的串口号不会是什么 COM1 、COM2、COM3之类的,所以我会做一些过滤)
public static List<String> getAvailableSerialPortsName() {
List<String> result = new ArrayList<String>();
Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();
while (thePorts.hasMoreElements()) {
CommPortIdentifier com = (CommPortIdentifier) thePorts.nextElement();
switch (com.getPortType()) {
case CommPortIdentifier.PORT_SERIAL:
CommPort thePort = null;
try {//过滤COM1-3
thePort = com.open("CommUtil", 50);
if (!Pattern.compile("COM[1-3]\\b").matcher(com.getName()).matches()) {
result.add(com.getName());
}
} catch (PortInUseException e) {
// log.debug("Port, " + com.getName() + ", is in use.");
} catch (Exception e) {
log.error("Failed to open port " + com.getName());
} finally {
if (thePort != null) {
thePort.close();
}
}
}
}
return result;
}
2. 如果系统未正常连接时,会把串口列表中的端口放入队列中,然后每个串口都去打开连接测试,确保哪个串口可用;(连接串口时成功后发送串口指令,只有返回OK的才是我需要用的端口,并记录下串口名,而这里使用了SWT的UI线程,所以主线程是每3秒跑一次,里面等待设备返回状态的是2秒,所以基本上也能满足到测试连接的效果)
public static boolean connectTest(final String portName) {
CommPortIdentifier portIdentifier;
try {
portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned()) {
log.error("错误:串口被占用");
return false;
} else {
commPort = portIdentifier.open(TDUtil.class.getName(), 2000);
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
final InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
out.write("AT+CLIP=1\r".getBytes());
// 停顿2秒,为了话机返回数据给予时间
Display.getCurrent().timerExec(1000, new Runnable() {
public void run() {
try {
byte[] readBuffer = new byte[20];
in.read(readBuffer);
String result = new String(readBuffer, "GBK").trim();
if (result != null && result.indexOf("OK") != -1) {
log.debug(portName + "可用");
setProtName(portName);
} else {
log.debug(portName + "不可用");
setProtName(null);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (commPort != null) {
log.debug(portName + "串口关闭");
commPort.close();
}
}
}
});
} else {
log.error("Error: Only serial ports are handled by this example.");
return false;
}
}
} catch (NoSuchPortException e) {
log.error("不支持的串口异常!" + e.getMessage());
e.printStackTrace();
} catch (PortInUseException e) {
log.error("串口被战用异常!" + e.getMessage());
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
log.error("不支持的串口操作异常!" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error("IO异常!" + e.getMessage());
e.printStackTrace();
}
return false;
}
3. 把可用的端口记录到系统中,这样标识连接状态是正常的。如果非法拨出设备,线程会监控到没有可用的端口,此时再把状态置为不可用。等待着下次设备正常连接后重复上面的1、2操作,然后把原来的端口关闭即可。
分享到:
相关推荐
- **可能内容**:这个文件可能是包含一个基于rxtx库的串口通信示例程序,它展示了如何使用Java和rxtx库进行串口通信的具体代码实现。 - **学习要点**:通过阅读和理解代码,可以学习到如何在实际项目中应用rxtx库...
这个基于Java的串口开发包,RXTX.zip,包含了一系列的类和接口,使得开发者能够在Java程序中实现与硬件设备的串行通信,如Arduino、PLC或其他支持串口通信的设备。RXTX的使用极大地简化了Java程序员处理串口任务的...
Java串口通信库RXTX是一个开源项目,它为Java平台提供了串行通信接口,使得开发者可以方便地在Java程序中进行串口操作。RXTX库弥补了Java标准API在串口通信上的不足,提供了丰富的功能和强大的性能。下面我们将深入...
通过RXTX,Mina可以处理串口设备的数据传输,使得基于Java的应用程序能够与各种硬件设备进行无缝连接。 对于32位JDK的用户,本压缩包“mfz-rxtx-2.2-20081207-win-x86”提供的是RXTX库的32位版本,适用于运行在32位...
Java串口通信库RXTX是一个开源项目,它为Java平台提供了低级别的串行I/O功能,使得开发者能够轻松地与串行设备进行交互。RXTX库弥补了Java标准库在串行通信上的不足,提供了跨平台的支持,可以在Windows、Linux、Mac...
Java基于RXTX的串口调试软件代码是一个实用的开发工具,主要用于测试和调试通过串行通信连接的硬件设备。这个项目使用Eclipse作为集成开发环境(IDE),并选择了SWT(Standard Widget Toolkit)作为图形用户界面...
5. **流处理**:RXTX提供`InputStream`和`OutputStream`接口,可以直接通过Java的I/O流操作进行串口数据的读写,简化了编程模型。 6. **串口枚举**:RXTX提供方法用于获取系统上可用的串口列表,便于开发者选择合适...
总结来说,RXTX串口通讯包是Java进行串行通信的重要工具,它提供了丰富的API和跨平台的支持。这个压缩包包含了多种平台的RXTX 2.2版本,确保了不同系统下的应用都能顺利进行串口通信。对于有相关需求的开发者,这是...
Java串口通信库RXTX是一个开源项目,用于在Java应用程序中实现串行通信功能。这个包主要用于那些需要与硬件设备交互或者进行低级通信的Java应用,例如嵌入式系统、工业自动化、数据采集等领域。RXTX库提供了一个跨...
SpringBoot 是一个基于 Java 的轻量级框架,用于简化创建独立、生产级别的基于 Spring 应用的初始配置和常规管理。它集成了大量常用的第三方库配置,如数据访问/集成、安全、消息、缓存等,让开发者可以快速地开发出...
而RXTX则是一个用于Java的串行和并行通信库,它使得Java开发者可以轻松地进行串口编程。本文将深入探讨如何利用MINA与RXTX来实现串口通信。 首先,让我们了解一下RXTX。RXTX是Java中的一个开源项目,它提供了一组...
以下是一个简单的RXTX串口通信示例: ```java import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import java.io....
标题中的"java基于RXTXcomm.jar的串口通信所需dll"指的是RXTX库在Java应用中使用的动态链接库(DLL)文件,这些文件是RXTX库在Windows操作系统下运行所必需的。RXTXcomm.jar是RXTX的主要库文件,包含了Java类和接口...
串口通讯是指通过串行接口进行的数据传输,包括RS-232、RS-485等标准。在个人计算机上,串口通常指的是COM端口,用于连接各种外设,如调制解调器、GPS接收器等。在本项目中,"串口通讯小程序"可能是一个能够枚举和...
在实际开发中,首先需要在项目中引入SMSLIB的jar包,然后通过RXTX库配置串口通信。创建SMSLIB的实例,设置短信猫的相关参数(如波特率、数据位、校验位等),初始化并连接设备。接着,可以利用SMSLIB提供的API来编写...
5. **兼容性**:RXTX库兼容Java串行接口规范,可以与Java Communications API (javax.comm)无缝协作。 SMPP(Short Message Peer-to-Peer)协议,是专为短信服务设计的一种应用层协议,常用于短信网关。它允许服务...
RxTx库正是提供了这样的接口,使得Java程序员可以方便地进行串口操作。 RxTx库的设计基于事件驱动模型,这使得它能够高效处理串口通信中的异步事件。在源码中,`GPort`类是整个库的核心,它包含了与串口交互的所有...
关于标签,"JAVA"表示这是基于Java语言的库,"工具"表明RXTX是一个实用的开发工具,而"串口"则明确了它的核心功能是串行通信。这些标签帮助我们理解RXTX的主要用途和适用领域。 在提供的压缩包文件"mfz-rxtx-2.2-...
Java串口通信主要基于Java Communications API(CommAPI),这个API定义了一组接口和类,允许开发者读写串行端口的数据。`comm-2.0.jar` 是这个API的一个实现,它包含了一系列用于串口操作的核心类和接口,如`...
Java串口调试助手RXTX源码是一款专为Java开发者设计的工具,它基于RXTX库,用于实现Java程序与串行端口之间的通信。RXTX是一个开源的Java库,提供了对串行(RS-232)和并行(IEEE 1284)接口的支持,使得Java程序员...