// 新增:存储全局串口和读取器实例
|
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 };
|