yaowanxin
11 小时以前 cb2a01ee7dea28a2661720060b03c41dc372acb5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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 };