// 新增:存储全局串口和读取器实例 let port = null; let reader = null; let accumulatedData = ""; // 移到全局,便于关闭时重置 async function connect() { if ("serial" in navigator) { try { port = await navigator.serial.requestPort(); // 修改为全局变量 await port.open({ baudRate: 9600 }); reader = port.readable.getReader(); // 修改为全局变量 const decoder = new TextDecoder(); accumulatedData = ""; // 重置累积数据 console.log("串口连接成功,开始接收数据..."); while (true) { const { value, done } = await reader.read(); if (done) break; const decodedChunk = decoder.decode(value, { stream: true }); accumulatedData += decodedChunk; console.log("接收到数据块:", decodedChunk); processAccumulatedData(accumulatedData); } } catch (error) { console.error("串口错误:", error); } } function processAccumulatedData(data) { if (data.includes("\n")) { const messages = data.split("\n"); for (let i = 0; i < messages.length - 1; i++) { const completeMessage = messages[i]; console.log("完整消息:", completeMessage); handleMessage(completeMessage); } accumulatedData = messages[messages.length - 1]; } // 其他消息拆分示例保持不变 /* while (accumulatedData.length >= 32) { const message = accumulatedData.substring(0, 32); accumulatedData = accumulatedData.substring(32); handleMessage(message); } */ /* let startIndex = 0; while (true) { const start = accumulatedData.indexOf(0xAA, startIndex); if (start === -1) break; const end = accumulatedData.indexOf(0x55, start + 1); if (end === -1) break; const message = accumulatedData.substring(start, end + 1); accumulatedData = accumulatedData.substring(end + 1); handleMessage(message); startIndex = start; } */ } } // 新增:关闭连接函数 async function disconnect() { if (!port || !reader) { console.log("未建立连接,无需关闭"); return; } try { // 先取消读取器 await reader.cancel(); // 再关闭串口 await port.close(); console.log("串口连接已关闭"); // 重置全局变量 port = null; reader = null; accumulatedData = ""; } catch (error) { console.error("关闭连接失败:", error); } } export { connect, disconnect };