You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web端连接称重机串口实时获取数据问题(无需Node Serialport库)

问题分析与解决方案

一、报错原因

你使用的serialport是Node.js后端专属的串口操作库,依赖Node.js的底层系统API实现串口通信。而纯前端Vue项目运行在浏览器环境中,没有Node.js的系统级API支持,因此引入后会触发类继承失败的TypeError。这个库仅能在Electron、Node.js服务端这类具备Node运行环境的场景使用,无法在纯前端项目中运行。

二、无第三方库的前端串口实现方案(Web Serial API)

浏览器原生提供的Web Serial API可以直接在前端实现串口连接与数据读取,完全满足你“客户端连接称重机串口、点击按钮获取单行数据”的需求,且无需依赖任何第三方库。

实现代码(Vue 3)

<template>
  <div>
    <button @click="connectSerial">连接称重机串口</button>
    <button @click="readSingleData">读取单行数据</button>
    <p>读取结果:{{ receivedData }}</p>
  </div>
</template>

<script setup>
import { ref, onUnmounted } from 'vue'

const receivedData = ref('')
let serialPort = null
let dataReader = null

// 连接串口(必须由用户交互触发)
async function connectSerial() {
  try {
    // 请求用户选择串口,可通过USB VID/PID过滤指定设备
    serialPort = await navigator.serial.requestPort({
      filters: [
        // 示例:过滤特定厂商/产品ID的设备,需替换为称重机实际参数
        // { usbVendorId: 0x1234, usbProductId: 0x5678 }
      ]
    })
    // 打开串口,波特率需与称重机配置一致
    await serialPort.open({ baudRate: 9600 })
    receivedData.value = '串口连接成功'
  } catch (err) {
    receivedData.value = `连接失败:${err.message}`
    console.error(err)
  }
}

// 读取单行数据
async function readSingleData() {
  if (!serialPort || !serialPort.readable) {
    receivedData.value = '请先连接串口'
    return
  }
  try {
    dataReader = serialPort.readable.getReader()
    let dataBuffer = ''
    // 循环读取直到捕获换行符(单行数据结束标记)
    while (true) {
      const { value, done } = await dataReader.read()
      if (done) break
      // 将二进制数据解码为字符串
      dataBuffer += new TextDecoder().decode(value)
      // 适配不同换行规则(多数称重机用\n或\r\n)
      const lineBreakIndex = dataBuffer.indexOf('\n')
      if (lineBreakIndex !== -1) {
        const singleLineData = dataBuffer.slice(0, lineBreakIndex).trim()
        receivedData.value = singleLineData
        // 保留缓冲区剩余数据,避免丢失后续内容
        dataBuffer = dataBuffer.slice(lineBreakIndex + 1)
        break
      }
    }
    // 释放阅读器,允许后续操作复用串口
    await dataReader.releaseLock()
  } catch (err) {
    receivedData.value = `读取失败:${err.message}`
    console.error(err)
    if (dataReader) await dataReader.releaseLock()
  }
}

// 页面卸载时自动关闭串口
onUnmounted(async () => {
  if (serialPort) {
    if (dataReader) await dataReader.releaseLock()
    await serialPort.close()
  }
})
</script>

关键注意事项

  • Web Serial API仅支持HTTPS环境(本地开发的localhost除外)
  • 仅兼容Chrome、Edge、Opera等Chromium内核浏览器,Firefox/Safari暂不支持
  • 串口连接必须由用户主动操作触发(如点击按钮),浏览器禁止自动请求串口权限
  • 需根据称重机实际配置调整波特率、换行符(部分设备用\r作为结束标记)

内容的提问来源于stack exchange,提问作者Nimat Gerdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:42:14