import request from '@/utils/request';
|
// 新增:存储全局串口和读取器实例
|
let port = null;
|
let reader = null;
|
let accumulatedData = ""; // 移到全局,便于关闭时重置
|
let weightList = []; // 用于存储重量值的列表
|
|
async function sendWeightsToBackend(weights) {
|
try {
|
// 使用 await 等待 request 函数返回结果
|
const response = await request({
|
url: "/weight/handleWeights",
|
method: "POST",
|
data: weights, // 通常 request 函数使用 data 字段传递数据
|
});
|
// 根据 request 函数的实现判断响应是否成功
|
if (response.code !== 200) { // 假设 response 有 code 字段,200 表示成功
|
throw new Error(`Backend response error: ${response.message}`);
|
}
|
return response.data; // 假设响应数据在 data 字段中
|
} catch (error) {
|
console.error('发送重量数据到后端失败:', error);
|
throw error;
|
}
|
}
|
|
async function connect() {
|
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);
|
// 提取数值
|
const weightValue = extractWeightValue(completeMessage);
|
if (!isNaN(weightValue)) {
|
console.log("提取的重量值:", weightValue);
|
// 将有效重量值添加到列表
|
weightList.push(weightValue);
|
|
// 当列表长度达到 6 时,发送数据到后端并清空列表
|
if (weightList.length === 6) {
|
sendWeightsToBackend({
|
weights: weightList
|
})
|
.then(() => {
|
console.log('数据发送成功');
|
weightList = [];
|
})
|
.catch(() => {
|
console.log('发送失败,保留数据待重试');
|
});
|
}
|
}
|
}
|
|
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;
|
}
|
*/
|
}
|
}
|
// 新增提取重量数值的方法
|
function extractWeightValue(message) {
|
// 匹配数值部分,可处理正负号
|
const match = message.match(/-?\d+\.?\d*/);
|
if (match) {
|
return parseFloat(match[0]);
|
}
|
return NaN;
|
}
|
|
// 新增:关闭连接函数
|
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,weightList };
|