Web Serial 串列埠通訊注意事項

日期:
分類: 頁面仔的自我修養
標籤: 嵌入式

這幾天除錯壓力感測器,發現 Web Serial API 著實很簡單,惟需注意以下幾點:

  1. 這是一個面向瀏覽器的 API,掛在 navigator 上,所以需要請求許可權。請求許可權成功後,會拿到一個 Port 物件。
  2. 需要拿一個 reader 和 writer,並且只能有唯一的 reader 和唯一的 writer。必須要在寫入資料前拿到 reader,否則可能拿不到寫入後立即返回的資料。
  3. 讀寫的都是位元組流(Uint8Array),這個很好理解。
  4. 寫完資料記得呼叫 writer.releaseLock()
  5. 讀資料返回的是 Promise<ReadableStreamReadResult<R>>,有 valuedone。注意如果 donetrue 可能 value 還是有內容,注意不要忘記處理。
  6. 你需要在迴圈裡一直 read。鑑於串列埠的協議一般都是 ASCII,JavaScript 也不對字串作出校驗,所以在拿到每一次 chunk 後立即轉換成文字也無妨。或者,把 reader pipeTo 一個 TextDecoderStream
  7. 由於 JavaScript 一貫的事件驅動的 API 設計,不可避免地用到非同步。所以為了避免競態條件,建議你使用 async-mutex,建立一個 Mutex 然後把每次的讀取和寫入放在 .runExclusive(async () => { return ... }) 裡,並且 await 其結果。

題外話

簡單做了一個測量的介面,如下。

壓力錶測量介面
壓力錶測量介面

這個介面是用 Svelte 的 UI 框架 Skeleton 寫的,需要配置 Tailwind。不理解為什麼要對很多 tag 要手寫一個同名的 class(如 .input for <input>),然後我的程式碼裡一個 tag 就變成了好幾行。也算是第一次理解了為什麼切換暗色模式還涉及到服務端渲染這種破事。

右邊的錶盤當然是用 ECharts(svelte-echarts),不過我第一次看到錶盤覺得不應該塞到這麼一個面向於統計圖表的庫裡去,沒想到這麼快就用上了(打臉)。

以及,終於發現,如果你像我很討厭 SvelteKit,正確的方法應該是用 Vite 建立一個 Svelte 應用。(Svelte 4 不管是建立專案還是 lib 都不合時宜地強迫你用 SvelteKit,讓你寫不了單頁應用。)

評論

評論將在稽覈後顯示,閣下可以在本部落格的 Github 倉庫的 拉取請求列表 中檢視。提交成功後會自動跳轉。

本站不支持 Dark Reader 的暗色模式,请对本站关闭后再访问。
(亮色模式的对比度、亮度等选项不受影响)