jSerialComm 库如何捕获所有类型的串口中断请求?
串口Java开发的jSerialComm与RXTX事件捕获差异
众所周知,jSerialComm是一款用于读取串口数据的高质量Java库;在此之前,RXTX也是串口开发场景中非常成熟的选型。
很多从RXTX迁移到jSerialComm的开发者都会有疑问:在jSerialComm中,要如何像使用RXTX那样捕获各类串口中断事件?
RXTX的传统事件监听实现
在RXTX的使用范式中,开启各类中断事件的捕获监听非常简单,只需要调用串口实例的通知开关方法即可,典型的开启代码如下:
serialPort.notifyOnFramingError(true); serialPort.notifyOnBreakInterrupt(true);
开启监听后,在统一的事件回调中,可以根据事件类型分支处理不同场景,典型的处理逻辑结构如下:
switch (event.getEventType()) { case SerialPortEvent.FE: break; case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: // 串口数据读取逻辑 break; default: break; }
开发者对于jSerialComm的实现困惑主要来自于:难道这个库只支持LISTENING_EVENT_DATA_AVAILABLE这一种事件?是不是只要写如下的判断逻辑,就完全不需要考虑其他类型的中断请求捕获了?
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) { return; }
jSerialComm的对应实现说明
- jSerialComm 本身支持全量串口事件捕获,并非仅支持数据可读这一种场景。和RXTX需要逐个调用方法开启对应事件通知的逻辑不同,jSerialComm只需要在注册串口监听器时,传入目标事件的位掩码,就可以一次性开启所有需要的事件捕获能力。
- 当前库支持的可监听事件类型包含:
LISTENING_EVENT_DATA_AVAILABLE:串口有可读数据LISTENING_EVENT_DATA_WRITTEN:写入串口的数据已全部发送完成LISTENING_EVENT_PORT_DISCONNECTED:串口被物理移除LISTENING_EVENT_BREAK_INTERRUPT:串口检测到中断信号LISTENING_EVENT_FRAMING_ERROR:串口检测到帧格式错误LISTENING_EVENT_PARITY_ERROR:串口检测到奇偶校验错误
- 如果需要监听所有支持的事件,注册监听器时直接传入
SerialPort.LISTENING_EVENTS_ALL参数即可,不需要手动逐个配置事件开关。 - 仅处理
LISTENING_EVENT_DATA_AVAILABLE的简化判断逻辑,只适用于完全不需要处理其他串口异常、状态事件的极简场景。如果需要捕获帧错误、中断信号、校验错误这类串口异常,就不能仅过滤数据可读事件:一方面要在注册监听器时把对应事件类型加入监听掩码,另一方面要在事件处理逻辑中增加对应类型的分支判断,才能实现和RXTX等价的全量中断事件捕获能力。
内容的提问来源于stack exchange,提问作者James Wang
相关产品推荐
相关产品推荐

