From 2ad852ee08e21ee681950f1d6058499248baf88e Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 18 七月 2025 15:04:22 +0800
Subject: [PATCH] 完成串口读取数据和处理

---
 src/utils/dataFetcher.ts |  170 ++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 110 insertions(+), 60 deletions(-)

diff --git a/src/utils/dataFetcher.ts b/src/utils/dataFetcher.ts
index 05bfdfe..e935fb5 100644
--- a/src/utils/dataFetcher.ts
+++ b/src/utils/dataFetcher.ts
@@ -1,68 +1,118 @@
-import {  getLatestWsData } from '../pipe_client';
+import { invoke } from '@tauri-apps/api/core';
 
-// const pipeName = 'tauri-pipe-server';
+import * as math from 'mathjs';
 
-// const dataSource = 'ws';  // pipe|ws
+// 瀹氫箟涓�涓被鍨嬶紝鐢ㄤ簬瀛樺偍鎵�鏈夋敞鍐岀殑鍥炶皟鍑芥暟
+type DataCallback = (data: number[]) => void;
+const dataCallbacks: DataCallback[] = [];
 
-export async function fetchForceData() {
-  try {
-    let response: string | null = null;
-    
-    // if (dataSource === 'pipe') {
-    //   if (!pipeName) throw new Error('Pipe name is required for pipe data source');
-    //   response = await sendToPipe(pipeName, 'GET_FORCE_DATA');
-    // } else if (dataSource === 'ws') {
-      response = await getLatestWsData();
-      if (!response) return null;
-    // }
-    
-    if (!response) return null;
-    
-    const jsonData = JSON.parse(response);
-    const forceData = jsonData[0];
-    if (Array.isArray(forceData) && forceData.length === 6) {
-      // 灏嗘暟缁勪腑鐨勬瘡涓暟鍒嗗埆*4000/4194303
-      for (let i = 0; i < forceData.length; i++) {
-        forceData[i] = forceData[i] * 4000 / 4194303;
-      }
-      return forceData;
-    }
-    
-    return null;
-  } catch (error) {
-    console.error('Error fetching force data:', error);
-    return null;
+// 娉ㄥ唽鏁版嵁鎺ユ敹鍥炶皟鍑芥暟
+export function registerDataCallback(callback: DataCallback) {
+  dataCallbacks.push(callback);
+}
+
+// 绉婚櫎鏁版嵁鎺ユ敹鍥炶皟鍑芥暟
+export function unregisterDataCallback(callback: DataCallback) {
+  const index = dataCallbacks.indexOf(callback);
+  if (index > -1) {
+    dataCallbacks.splice(index, 1);
   }
 }
 
-export function createDataReceiver( callback: (data: number[]) => void) {
-  let errorCount = 0;
-  const maxConsecutiveErrors = 5;
-  let showingError = false;
-  
-  return async () => {
-    try {
-      const forceData = await fetchForceData();
-      console.log('forceData111', forceData);
-      if (forceData) {
-        // 閲嶇疆閿欒璁℃暟
-        errorCount = 0;
-        if (showingError) {
-          showingError = false;
-          console.log('鏁版嵁閫氫俊宸叉仮澶�');
-        }
-        console.log('forceData222', forceData);
-        callback(forceData);
-      }
-    } catch (err) {
-      // 澧炲姞閿欒璁℃暟
-      errorCount++;
-      
-      // 鍙湪杩炵画閿欒杈惧埌闃堝�兼椂鏄剧ず閿欒淇℃伅锛岄伩鍏嶆棩蹇楀埛灞�
-      if (errorCount >= maxConsecutiveErrors && !showingError) {
-        showingError = true;
-        console.error('鏁版嵁閫氫俊鎸佺画澶辫触锛岃妫�鏌ユ湇鍔$鐘舵��:', err);
-      }
+// 澶勭悊浠嶳ust鍚庣鎺ユ敹鍒扮殑涓插彛鏁版嵁
+export function processSerialData(data: number[]): number[] | undefined {
+  // 瀵规帴鏀跺埌鐨勬暟鎹繘琛宑rc鏍¢獙,鍓嶄袱涓瓧鑺傛槸甯уご锛屽悗涓や釜瀛楄妭鏄牎楠屽��
+  // 鏍¢獙鏁版嵁鏄惁姝g‘
+  // 鍘婚櫎鍓嶄袱涓瓧鑺傚拰鍚庝袱涓瓧鑺�
+  const dataWithoutHeaderAndCRC = data.slice(0, -2);
+  const crc16 = crc16modbus(dataWithoutHeaderAndCRC);
+  // 鏍¢獙鏁版嵁鏄惁姝g‘
+  if (crc16[0] === data[data.length - 2] && crc16[1] === data[data.length - 1]) {
+    console.log('鏍¢獙鏁版嵁姝g‘');
+  }
+
+  const dataWithoutHeader = data.slice(2, -2);
+  // dataWithoutHeader 涓瘡涓変釜瀛楄妭杞崲鎴愪竴涓暟
+  const dataArray: number[] = [];
+  for (let i = 0; i < dataWithoutHeader.length; i += 3) {
+    const num = dataWithoutHeader[i] * 256 * 256 + dataWithoutHeader[i + 1] * 256 + dataWithoutHeader[i + 2];
+    dataArray.push(num);
+  }
+  console.log('dataArray', dataArray);
+  invoke('log_data', { data: JSON.stringify(dataArray) })
+     .then(() => console.log('Data logged successfully'))
+     .catch((e: any) => console.error('Failed to log data:', e));
+  // 瀵规帴鏀跺埌鐨勬暟鎹繘琛屽鐞�
+  if (Array.isArray(dataArray) && dataArray.length === 6) {
+    // 灏嗘暟缁勪腑鐨勬瘡涓暟鍒嗗埆*4000/4194303
+    for (let i = 0; i < dataArray.length; i++) {
+      dataArray[i] = dataArray[i] * 4000 / 4194303;
     }
+    
+    // 瀹氫箟B鐭╅樀锛堜粠Excel鏂囦欢涓幏鍙栵級
+    const B = [
+      [-6.501014986, 49.89944483, -47.37512707, 3.306871125, -730.3864937, 731.892412],
+      [39.02334352, -20.01844412, -28.31245682, -846.7104044, 422.5886114, 423.8930456],
+      [1323.394066, 1311.347472, 1318.438012, -6.141452446, -5.309142718, -17.72182533],
+      [-0.461934807, 38.31359845, -37.51342676, -10.30786014, 5.431648347, -4.552001119],
+      [44.06827786, -21.49540034, -22.28032529, -0.447302394, -8.60890465, 9.325018254],
+      [1.125851578, 1.306669827, 1.532290446, -23.04749193, -23.05906062, -23.19316741]
+    ];
+    
+    // 璁$畻鐪熷疄鐨勫姏鍊硷細F = B * dataArray
+    const realForces = math.multiply(B, dataArray);
+    
+    // 灏嗗鐞嗗悗鐨勬暟鎹垎鍙戠粰鎵�鏈夋敞鍐岀殑鍥炶皟鍑芥暟
+    dataCallbacks.forEach(callback => callback(realForces as number[]));
+    // 杩斿洖鐪熷疄鐨勫姏鍊兼暟缁�
+    return realForces as number[];
+  } else {
+    console.error("Data array must contain 6 elements.");
+    return undefined;
+  }
+}
+
+export function createDataReceiver(callback: (data: number[]) => void) {
+  // 鐩存帴娉ㄥ唽鍥炶皟鍑芥暟锛屼笉鍐嶉渶瑕佽疆璇㈡垨閿欒璁℃暟
+  registerDataCallback(callback);
+
+  // 杩斿洖涓�涓竻鐞嗗嚱鏁帮紝鐢ㄤ簬鍦ㄧ粍浠跺嵏杞芥椂绉婚櫎鍥炶皟
+  return () => {
+    unregisterDataCallback(callback);
   };
-}
\ No newline at end of file
+}
+
+// CRC-16/Modbus 鏌ヨ〃娉曢鐢熸垚 256 涓� CRC 鍊�
+function makeCRCTable() {
+    const table = new Array(256);
+    const polynomial = 0xA001;
+
+    for (let i = 0; i < 256; i++) {
+        let crc = i;
+        for (let j = 0; j < 8; j++) {
+            if (crc & 0x0001) {
+                crc = (crc >>> 1) ^ polynomial;
+            } else {
+                crc >>>= 1;
+            }
+        }
+        table[i] = crc;
+    }
+    return table;
+}
+
+const crcTable = makeCRCTable();
+
+// CRC-16/Modbus 璁$畻鍑芥暟
+function crc16modbus(buffer: number[]) {
+    let crc = 0xFFFF;
+
+    for (let i = 0; i < buffer.length; i++) {
+        let tableIndex = (crc ^ buffer[i]) & 0xFF;
+        crc = (crc >>> 8) ^ crcTable[tableIndex];
+    }
+
+    // 杩斿洖灏忕鏍煎紡锛圡odbus 瑕佹眰浣庝綅鍦ㄥ墠锛夛紝浠ュ瓧鑺傛暟缁勭殑褰㈠紡杩斿洖
+    const crcBytes = [crc & 0xFF, crc >>> 8];
+    return crcBytes;
+}

--
Gitblit v1.9.3