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