Vue項目中實現瀏覽器串口通信:Web Serial API完整指南

前言

在現代Web開發中,隨著IoT設備和硬件交互需求的增長,瀏覽器與串口設備的通信變得越來越重要。本文將詳細介紹如何在Vue項目中使用Web Serial API實現串口通信功能,為開發者提供一個完整的解決方案。

技術背景

傳統方案的局限性

傳統的串口通信通常依賴Node.js環境下的 serialport 模塊,但這種方案存在以下問題:

  • 環境限制 :需要Electron或Node.js環境,無法在純瀏覽器環境中運行
  • 部署復雜 :需要額外的桌面應用打包和分發
  • 安全限制 :瀏覽器安全策略阻止直接訪問系統硬件

Web Serial API的優勢

Web Serial API是現代瀏覽器提供的原生串口通信接口,具有以下優勢:

  • 原生支持 :無需額外依賴,直接在瀏覽器中運行
  • 安全可控 :用戶主動授權,符合瀏覽器安全策略
  • 跨平臺 :支持Windows、macOS、Linux等主流操作系統
  • 易于集成 :可直接集成到現有Vue項目中

1,安裝serialport模塊

npm install serialport

2,核心工具類實現

WebSerialUtil.js

首先,我們創建一個封裝Web Serial API的工具類:

// Web Serial API 工具類
class WebSerialUtil {constructor() {this.port = null;this.reader = null;this.writer = null;this.isConnected = false;}// 檢查瀏覽器支持isSupported() {return 'serial' in navigator;}// 請求串口權限并連接async connect(options = {}) {if (!this.isSupported()) {throw new Error('瀏覽器不支持Web Serial API');}try {// 請求用戶選擇串口this.port = await navigator.serial.requestPort();// 打開串口await this.port.open({baudRate: options.baudRate || 9600,dataBits: options.dataBits || 8,stopBits: options.stopBits || 1,parity: options.parity || 'none'});this.reader = this.port.readable.getReader();this.writer = this.port.writable.getWriter();this.isConnected = true;return { success: true, message: '串口連接成功' };} catch (error) {return { success: false, message: error.message };}}// 讀取數據async readData(callback) {if (!this.isConnected || !this.reader) {throw new Error('串口未連接');}try {while (true) {const { value, done } = await this.reader.read();if (done) break;// 將Uint8Array轉換為字符串const text = new TextDecoder().decode(value);if (callback) callback(text);}} catch (error) {console.error('讀取數據失敗:', error);}}// 發送數據async writeData(data) {if (!this.isConnected || !this.writer) {throw new Error('串口未連接');}try {const encoder = new TextEncoder();await this.writer.write(encoder.encode(data));return { success: true };} catch (error) {return { success: false, message: error.message };}}// 斷開連接async disconnect() {try {if (this.reader) {await this.reader.cancel();await this.reader.releaseLock();}if (this.writer) {await this.writer.releaseLock();}if (this.port) {await this.port.close();}this.port = null;this.reader = null;this.writer = null;this.isConnected = false;return { success: true };} catch (error) {return { success: false, message: error.message };}}
}export default new WebSerialUtil();

3,在組件中使用

<template><div><el-button @click="connectSerial" :disabled="isConnected">連接串口</el-button><el-button @click="disconnectSerial" :disabled="!isConnected">斷開連接</el-button><el-input v-model="sendData" placeholder="輸入數據"></el-input><el-button @click="sendSerialData">發送</el-button><div><h4>接收數據:</h4><pre>{{ receivedData }}</pre></div></div>
</template><script>
import webSerial from '@/util/webserial'export default {data() {return {isConnected: false,sendData: '',receivedData: ''}},methods: {async connectSerial() {if (!webSerial.isSupported()) {this.$message.error('瀏覽器不支持Web Serial API,請使用Chrome 89+');return;}const result = await webSerial.connect({ baudRate: 9600 });if (result.success) {this.isConnected = true;this.$message.success('串口連接成功');// 開始讀取數據webSerial.readData((data) => {this.receivedData += data;});} else {this.$message.error('連接失敗: ' + result.message);}},async disconnectSerial() {const result = await webSerial.disconnect();if (result.success) {this.isConnected = false;this.$message.success('串口已斷開');}},async sendSerialData() {if (!this.sendData) {this.$message.warning('請輸入要發送的數據');return;}const result = await webSerial.writeData(this.sendData);if (result.success) {this.sendData = '';this.$message.success('數據發送成功');} else {this.$message.error('發送失敗: ' + result.message);}}},beforeDestroy() {if (this.isConnected) {webSerial.disconnect();}}
}
</script>

故障排除

常見問題及解決方案

  1. 瀏覽器不支持
  • 確保使用Chrome 89+或Edge 89+
  • 檢查瀏覽器實驗性功能設置
  1. 權限被拒絕
    • 確保在用戶交互事件中調用API
    • 檢查瀏覽器安全策略設置
  2. 設備連接失敗
  • 確認設備驅動程序已安裝
  • 檢查設備是否被其他程序占用
  • 驗證串口參數設置
  1. 數據傳輸異常
    • 檢查波特率等參數配置
    • 確認數據格式和編碼
    • 添加適當的錯誤處理

總結

Web Serial API為前端開發者提供了一個強大而安全的串口通信解決方案。通過本文介紹的WebSerialUtil工具類,我們可以輕松地在Vue項目中集成串口通信功能,無需依賴Node.js或桌面應用程序。

主要優勢

  • 簡單易用 :封裝后的API簡化了復雜的串口操作
  • 現代化 :基于Promise的異步編程模式
  • 安全可靠 :瀏覽器原生支持,用戶授權機制
  • 跨平臺 :支持Windows、macOS、Linux

適用場景

  • 物聯網設備調試和監控
  • 工業設備數據采集
  • 教育和原型開發
  • 硬件測試工具

隨著Web技術的不斷發展,Web Serial API將為更多創新應用提供可能。對于需要與硬件設備交互的Web應用來說,這無疑是一個值得關注和使用的技術。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Github怎么只下載某個目錄文件?(Git稀疏檢出、GitZip for Github插件、在線工具DownGit)Github下載目錄

文章目錄**方法一&#xff1a;使用 Git 的稀疏檢出&#xff08;Sparse Checkout&#xff09;**&#xff08;略&#xff09;**步驟&#xff1a;****方法二&#xff1a;使用 SVN 下載特定目錄**&#xff08;略&#xff09;**步驟&#xff1a;****方法三&#xff1a;使用瀏覽器插件…

把“多視圖融合、深度傳感”組合在一起,今天分享3篇3D傳感技術干貨

關注gongzhonghao【計算機sci論文精選】3D傳感技術起源于工業領域高精度測量需求&#xff0c;早期以激光三角測量、結構光等技術為主&#xff0c;主要服務于制造業的零部件檢測與形變分析。隨著消費電子智能化升級&#xff0c;蘋果iPhone X的Face ID將結構光技術推向大眾市場&a…

dubbo源碼之消費端啟動的高性能優化方案

一、序言 dubbo作為一款最流行的服務治理框架之一,在底層做了很多的優化,比如消費端在啟動的時候做了很多性能提升的設計,接下來從連接的層面、序列化功能的層面進行介紹下。 二、優化點 1、消費端在服務啟動的時候會調用DubboProtocol類的protocolBindingRefer方法來創建…

zookeeper常見命令和常見應用

前言 ZooKeeper自帶一個交互式命令行工具&#xff08;通過zkCli.sh或zkCli.cmd啟動&#xff09;&#xff0c;提供了一系列操作ZooKeeper數據節點的命令 下面我們對zookeeper常用命令進行介紹 使用prettyZoo命令行窗口 使用prettyZoo客戶端鏈接zookeeper 打開zookeeper命令…

前端異步任務處理總結

一、異步任務常見場景網絡請求&#xff1a;fetch()、axios 等 API 調用定時操作&#xff1a;setTimeout、setInterval用戶交互&#xff1a;事件監聽回調資源加載&#xff1a;圖片/腳本動態加載Web Workers&#xff1a;后臺線程計算二、核心處理方案1. Promise&#xff08;ES6&a…

機器學習第三課之邏輯回歸(二)LogisticRegression

目錄 簡介 一.分類評估?法 1.混淆矩陣 2.精確率(Precision)與召回率(Recall) 3.F1-score 4.分類評估報告api 2.正則化懲罰 3.?擬合和過擬合 4.K折交叉驗證 5.代碼分析 簡介 接上一篇博客最后 機器學習第二課之邏輯回歸&#xff08;一&#xff09;LogisticRegres…

基于ELK Stack的實時日志分析與智能告警實踐指南

基于ELK Stack的實時日志分析與智能告警實踐指南 一、業務場景描述 在生產環境中&#xff0c;服務實例數量眾多&#xff0c;日志量激增&#xff0c;傳統的文本 grep 或 SSH 登錄方式已無法滿足實時監控與故障定位需求。我們需要搭建一個可擴展、低延遲的日志收集與分析平臺&…

需求變更過程中出現的團隊資源沖突問題處理的一些小技巧

??一、資源沖突的典型場景?? ??技術資源爭奪??:多個需求同時需要同一開發人員或技術專家支持 ??人力資源過載??:突發需求導致團隊成員工作量超負荷(如同時處理3個緊急需求) ??設備/環境沖突??:測試服務器資源不足或特定開發工具許可證被占用 ??跨團隊協…

基于Matlab圖像處理的液晶顯示器表面缺陷檢測與分類研究

本課題設計并實現了一種基于 MATLAB 的圖像缺陷檢測系統&#xff0c;系統集成中值濾波、對比度增強、梯度檢測與區域分析等圖像處理技術&#xff0c;能夠對圖像中的點狀、線狀和塊狀缺陷進行有效識別與分類。用戶可通過圖形用戶界面&#xff08;GUI&#xff09;導入待測圖像&am…

prometheus應用demo(一)接口監控

目錄 完整代碼&#xff08;純Cursor生成&#xff09; 1、pom 2、配置和啟動類 3、自定義指標bean 4、上報 5、業務代碼 一、統計API請求&#xff08;次數、響應碼等&#xff09; 1、統計總數 關鍵代碼&#xff1a; &#xff08;1&#xff09;自定義指標DTO &#xff0…

逃離智能家居“孤島”!用 Home Assistant 打造你的全屋互聯自由王國

文章目錄&#x1f914; 痛點暴擊&#xff1a;智能家居的“巴別塔困境”&#x1f6e0;? Home Assistant 是個啥&#xff1f;簡單粗暴版定義&#x1f50d; 硬核拆解&#xff1a;Home Assistant 的魅力之源&#x1f680; 上車指南&#xff1a;如何開始你的 HA 之旅&#xff1f;第…

數據結構:如何判斷一個鏈表中是否存在環(Check for LOOP in Linked List)

目錄 初始思考&#xff1a;什么叫“鏈表有環”&#xff1f; ? 第一種直接想法&#xff08;失敗&#xff09;&#xff1a;我們是不是能“記住走過的節點”&#xff1f; 那我們換一個思路&#xff1a;我們能否只用兩個指針來檢測環&#xff1f; 第一步&#xff1a;定義兩個指…

深入理解Java的SPI機制,使用auto-service庫優化SPI

文章目錄一、簡介二、使用1、服務提供者&#xff08;或者第三方公共&#xff09;&#xff1a;定義接口2、服務提供者&#xff1a;定義實現類3、服務提供者&#xff1a;注冊服務4、構建服務提供者jar包5、客戶端&#xff1a;使用 ServiceLoader 來加載服務三、源碼分析1、源碼2、…

PPT自動化 python-pptx - 10 : 表格(tables)

在日常工作中&#xff0c;我們經常需要制作包含表格的 PowerPoint 演示文稿&#xff0c;以此清晰展示數據或文本信息。手動制作不僅耗時&#xff0c;當數據更新時還需重復操作&#xff0c;效率低下。而 python-pptx 庫為我們提供了自動化操作 PowerPoint 表格的可能。本文將詳細…

在安卓中使用 FFmpegKit 剪切視頻并添加文字水印

在安卓中用到的三方庫&#xff1a;https://github.com/arthenica/ffmpeg-kit 這個庫很強大&#xff0c;支持很多平臺&#xff0c;每個平臺都有各自的分支代碼&#xff0c;用了一段時間&#xff0c;穩定性挺好的&#xff0c; 找到安卓下的分支&#xff1a;FFmpegKit for Andro…

Flask + HTML 項目開發思路

Flask HTML 項目開發思路&#xff1a;以公共資源交易信息展示為例 一、開篇明義——為什么選 Flask 框架 在眾多 Python Web 框架&#xff08;如 Django、Tornado 等&#xff09;里&#xff0c;本次項目堅定選擇 Flask&#xff0c;背后有清晰的技術考量&#xff1a; 1. 輕量…

Vue中:deep()和 ::v-deep選擇器的區別

在 Vue.js 中&#xff0c;:deep()和 ::v-deep都是用于穿透組件作用域的深度選擇器&#xff0c;但它們在語法、適用場景和版本支持上存在區別。以下是兩者的核心差異&#xff1a;一、??語法與用法? &#xff1a;Vue2中用 ::v-deep&#xff0c;Vue2中不支持:deep()&#xff0c…

Deep learning based descriptor

1、DH3D: Deep Hierarchical 3D Descriptors for Robust Large-Scale 6DoF Relocalization 論文鏈接 代碼鏈接 這是一篇訓練點云的文章&#xff0c;在訓練出local descriptor之后&#xff0c;通過聚類的方法得出global descriptor&#xff0c;并且提出了hierarchical network&…

PandasAI連接LLM對MySQL數據庫進行數據分析

1. 引言 在之前的文章《PandasAI連接LLM進行智能數據分析》中實現了使用PandasAI連接與DeepSeek模型通過自然語言進行數據分析。不過那個例子中使用的是PandasAI 2.X&#xff0c;并且使用的是本地.csv文件來作為數據。在實際應用的系統中&#xff0c;使用.csv作為庫表的情況比…

FloodFill算法——DFS

FloodFill算法就是用來尋找性質相同的連通快的算法&#xff0c;這篇博客都是用dfs來實現FloodFill算法 1.圖像渲染 題目鏈接&#xff1a;733. 圖像渲染 - 力扣&#xff08;LeetCode&#xff09; 題目解析&#xff1a;將和&#xff08;sr,sc&#xff09;相連的所有像素相同的…