如何从Arduino串口输入流中提取指定数据段(如000.00LPM)
解决方案
核心思路
- 先完整接收Arduino发送的每一次数据包(避免分段接收导致的不完整数据)
- 用正则表达式匹配
xxx.xxLPM格式的流量数据段 - 提取后更新UI或存储数据,同时清空缓冲区准备下一次接收
修改后的代码
// 确保dataBuffer是类的成员变量,用于持续拼接串口数据 private String dataBuffer = ""; private void Serial_EventBasedReading(SerialPort activePort){ activePort.addDataListener(new SerialPortDataListener(){ public int getListeningEvents(){return SerialPort.LISTENING_EVENT_DATA_RECEIVED;} public void serialEvent(SerialPortEvent event){ byte[] newData = event.getReceivedData(); // 拼接本次收到的字节数据到缓冲区 for(int i=0;i<newData.length;i++){ dataBuffer += (char)newData[i]; } // 检查是否收到完整的数据包(假设Arduino发送的数据包以换行结尾,若没有则可根据长度或固定标记判断) if(dataBuffer.contains("\n")){ // 使用正则表达式匹配"数字.数字LPM"格式的内容 String pattern = "\\d+\\.\\d+LPM"; java.util.regex.Pattern r = java.util.regex.Pattern.compile(pattern); java.util.regex.Matcher m = r.matcher(dataBuffer); if(m.find()){ String flowData = m.group(); // 提取到的"000.00LPM"数据 // 更新UI必须在Swing事件线程中执行,避免线程安全问题 javax.swing.SwingUtilities.invokeLater(() -> { jTextArea_lgfc1.setText(flowData); // 显示提取的流量数据 // 这里可以添加存储逻辑,比如写入文件或保存到变量 // 示例:saveFlowData(flowData); }); } // 清空缓冲区,准备接收下一次的数据包 dataBuffer = ""; } } }); }
关键说明
- 数据包完整性判断:如果Arduino发送的字符串没有换行符,你可以根据固定长度判断(比如示例字符串的总长度是固定的),或者让Arduino在每次发送的末尾添加一个特殊标记(比如
###),然后用dataBuffer.contains("###")来判断是否完整接收。 - 正则表达式解释:
\d+\.\d+LPM表示匹配1个以上数字 + 小数点 + 1个以上数字 + LPM,刚好对应你需要的000.00LPM格式。 - Swing线程安全:所有UI组件的更新必须在Swing事件调度线程中执行,所以用
SwingUtilities.invokeLater包裹UI更新代码,避免界面卡顿或异常。 - 数据存储:你可以在提取到
flowData后,添加自己的存储逻辑,比如写入本地文件、存入数据库或者保存到类成员变量供后续使用。
内容的提问来源于stack exchange,提问作者Sudheer Mishra
相关产品推荐
相关产品推荐

